2017-09-04 1 views
1

1)たくさんのタイルを取る建物を作ることができるゲームについて考えています。たとえば3x3です。建物への経路探索(複数の座標を持つA *)?

ビルドを開始する前に、隣接するタイルに文字を移動する必要があります。だから、建物の最短経路を見つけるアルゴリズムがありますか?

エリアの建物のタイルごとにA *を使用することを義務付けられていますか?

EDIT、exemple:

マップ:このexempleため enter image description here

、(0; 0)座標がアップ左このランドマークとイメージのである: enter image description here あなたのキャラクターはである想像(0; 0)

画像の左側に文字を移動するアルゴリズムを探しています。

ターゲットは「通常」のような単一の座標ではなく、4つの空白(4つのポイント)。

単一の開始座標[ここでは(0,0)]から領域[ここでは(1,2)、(8,2)、(8,0)]から最も近い位置(1,10)、(8,10)]?

私は解決策の選択肢ではなく、この例のような複数の方法の場合、[(0,2)、(1,1)]のように、すべての等価な解を与えます。

2)タイルのないマップのシステムと同じ質問ですが、座標だけですか?

+0

:プレーヤー上のレベルにこのような何かをカット任意に視野を調整あなたは2D/3D配列/グリッド/マップを持っていますので、ベクトル・データに適したグラフ・バージョン(推奨)の代わりに、 'A *'のグリッド・バリアントを使用します。 [大きな空間スケールでA *アルゴリズムを高速化する方法](https://stackoverflow.com/a/23779490/2521214)と[アルゴリズムトラックスの勝利条件](https://stackoverflow.com/a/29765542/)を参照してください。 2521214)複数の座標でより多くの目的地点を意味するならば、それはTSP(旅行セールスマン問題)を示唆している全く異なる質問です – Spektre

+0

私は例で最も明確に編集しますか? – Matrix

答えて

0

エリアの建物のタイルごとにA *を使用する必要がありますか?最短を選択しますか?

*がある必要はありません述語、「現在は座標ときは、この座標に等しい」という目標を取ることができない、それは簡単に現在の座標がいくつかでに含まれているとき」することができset/area "に設定します。これはアルゴリズムのグローバルな構造については何も変えず、exit-testだけを変更します。

当然のことながら、あなたはヒューリスティックを容認する必要があります。あなたはこれを持つことができます

current := the node in openSet having the lowest fScore[] value 
    if current = goal 
     return reconstruct_path(cameFrom, current) 

(ウィキからコピー):

current := the node in openSet having the lowest fScore[] value 
    if current ∈ goals 
     return reconstruct_path(cameFrom, current) 

またはこの:

ではなく、この "狭い" *のための擬似コードを、明確にするために、

current := the node in openSet having the lowest fScore[] value 
    if satisfiesGoalCondition(current) 
     return reconstruct_path(cameFrom, current) 

「現在の座標が目標の矩形の内側にあります」などのテストになります。

+0

申し訳ありません私は本当に理解していない、あなたの方法は、1つの座標を得るために、最も近いエリアターゲットですか? – Matrix

+0

@Matrixどういう意味ですか? – harold

+0

私は例文で編集する – Matrix

0

井戸array/grid version of A*は、目標地点でのヒットで停止することができるので、出発地点から目的地の座標に当たるまで増加し、次にbacktrackになります。

はい、これはノードとして障害物を設定したグラフ/ベクターバージョンでも実行できます。

あなたのタイルが(半)歩行可能な場合は、グリッドバージョンA*の方がよいでしょう。 2Dあなたのタイルマーキングのそれぞれの歩行可能なエリアと壁エリアを表すだけです。このような何か:あなたも、あなたの建物をナビゲートすることができます

私の賭けは、あなたがこの考えていなかったということですので...私はしかし、あなたの建物の内側に表示されません今まで。私は3Dグリッドを使用しています

ので、私は3D地形や建物にもレベルを持つことができます...あなただけに必要ました:見てみましょうあなたはタイル得た場合

levels

+0

私は同じバージョンのA *を持っていますが(私のユースケースのjavascriptでは)。 "問題"はA *であり、A_star :: compute(int x0、int y0、int x1、int y1)に到達するためには、開始する座標を1つだけ取る。だから私は建物に属する座標の各カップルにA *を試しなければならない(あなたは解決策が見つかったときにループを壊すことができると言ったが、やり遂げなければ短期間であることをどのように確かめることができるだろうか? – Matrix

+0

@Matrix各セル座標をA *に渡す代わりに、特定のグリッド値(建物のマークされた領域など)をマップでテストし、各繰り返しで一致するセル位置をテストできます。私は通常32ビットのDWORDセルにすべてをエンコードするので、私はブースの世界地図、A *充填、特定のフラグである単一の2D配列を得ました。 – Spektre

+0

@Matrix反復A *塗りつぶしが順番に塗りつぶされ、最短経路は、どれくらいの細胞が標的としてマークされているかは関係ありません。これが問題になるいくつかの奇妙な再帰的A *を使用していない限り – Spektre

関連する問題