2Dタイルゲームでエンティティの可能な動きを見つける


10

このための特定の検索用語を思い付くのに問題がありますが、2Dターンベースの戦略ゲーム(FF:Tactics、Fire Emblem、Advance Wars)で可能な動きを見つけるにはどうすればよいでしょうか。

ここに画像の説明を入力してください

現時点では、地形(または衝突)についてはあまり考えていません。Xエンティティが5つのタイルを移動し、それよりもさらに2つのタイルを攻撃できることを理解するためにどのようなアルゴリズムを使用できるのか疑問に思っています。

私は、ダイクストラのようなものを使用して2点間の距離を見つけることができることを知っています。可能な実装の1つは、プレーヤーの場所から開始し、ダイクストラによって返される距離が移動カウントよりも大きくなるまでそこから分岐します。

誰かが私を正しい方向に向けることができるかどうか疑問に思っています(つまり、アルゴリズムの名前、テクニック、記事など)。


私はそれが経路検索と呼ばれていると思います、検索用語ですか?パス検索を使用する場合、カウンターを使用して必要なものを処理できます
Exikle

これは本質的に経路探索(移動コストのメタデータの計算)の一部です。範囲内の場所のみを決定しますが、必ずしも経路を決定する必要はありません。
マリオ

1
ターンベースのFFTacticsである場合、それはリアルタイム(RTS)ではありません。:p
Alayric

2dでは、
Gerben Jacobs

回答:


5

境界のあるダイクストラはまさにあなたが使いたいものだと思います。ダイクストラが2点間の距離を見つける方法は、原点ノードからすべてのノードまでの距離をマップし、この距離マップから最短経路を「選択」することです。特定のポイントへのパスではなく、出力として作成される距離ノードグラフが必要であることを除いて、実質的に同じことを行います。

必要な変更の1つは、最大移動範囲を既に超えているノードからの距離の計算をスキップすることです。次に、ユニットが移動できるすべてのノードと境界線のノードグラフが表示されるので、移動許容値よりも大きい距離を持つノードを切り取ります。

ビオラ。

つまり、質問で説明したことのほとんどは、実行する必要があることです。 また、それ以上の計算を行う必要なく、出力を使用してパスファインディングを実行できるという利点もあります。


この場合、ダイクストラは過剰です。OPはすべての可能な移動先へのパスを必要とせず、エージェントがそこに到達できるかどうかについてのyes / noの回答のみです。ユーザーがパスを選択すると、後でパスを計算できます。
Michael Kristofik

宛先が決定された後、ダイクストラのアルゴリズムを使用してパスを計算するコストは、事前にそれを使用する場合とほぼ同じです(パス指定にA *のようなヒューリスティックなアプローチを使用する場合を除く)。ダイクストラは「どこに行けばよいのか」と「どうやってそこに着くのか」という質問の両方に答えるため、前もってそれを実行しないと、冗長な作業が発生します。また、アプリケーションには不要な場合がありますが、移動コストを変更する複雑な環境を追加することもできます。さらに、アプローチは十分に文書化されており、実装者に役立ちます。
TASagent 2013

1
マリオの答えを見直すと、彼は実際にダイクストラのアルゴリズムを説明しますが、距離を逆にし、それがダイクストラであるとは述べていません。
TASagent 2013

1
あなたが本当に最短ルートを探しているわけでも、特定のポイントに到達しようとしているわけでもないので、それがダイクストラだとは言わないでしょう。これは本質的にダイクストラのアルゴリズムの最初の部分ですが、それは事実です。ダイクストラを使用した言葉遣いの問題は誤解を招く可能性があり、これもマイケルを混乱させたものだと思います。おそらく、フィールド/セルごとに1回ダイクストラを使用することをお勧めします。
マリオ

1
このアプローチはうまく機能し、障害を処理するために拡張するのが非常に簡単なので、最終的にはこのアプローチを使用することになります。
NRaf 2013

12

私が今考えることができる最も単純な(そしておそらく最も単純な)アプローチ:

  • あなたのキャラクターから始めて、周囲のすべてのフィールドをとしてマークしますsteps - 1
  • 反復は、以上のすべての新規のフィールドをマークし、再びとしてその周辺分野にマークsteps - 1どこsteps新しいフィールドがすでに高い番号を持っていない限り、現在のフィールドのステップ数になります。
  • ステップがなくなるまで最後のステップを繰り返します。

1
このアルゴリズムには、Flood Fillという名前があります。
Michael Kristofik 2013

6
@MichaelKristofik:幅優先検索と呼びます。塗りつぶしは、距離を追跡しません。
BlueRaja-Danny Pflughoeft 2013

2

あなたが探しているのはマンハッタン距離かもしれません。障害物がないと仮定すると、次の場合にのみ正方形に到達できると言えます。

| toX-fromX | + | toY-fromY | <maxMoveDistance

このアルゴリズムは、後で障害物が発生する場合には適切な方向ではない可能性があります。それを適応させる1つの可能な方法は、障害物に「影」を投げかけ、最も近い点から再評価することを含む場合があります。

編集(今はもう少し暇があるので):

「シャドウ」とは、次のようなものです。0が到達可能な正方形、Cが文字、Xが障害の場合:

 012345678
0    0
1   00
2  000X
3 000C000
4  00000
5   000
6    0
 012345678

(5、2)は障害であるため、x> = 5 AND y <= 2で何にも到達できないと仮定することから始めます。その後、別の正方形から再計算できます。(5、1)に移動したい場合は、(4、1)からマンハッタンの距離を計算し、その+キャラクターから(4、1)までの距離がプレイヤーの移動距離よりも短いかどうかを確認できます。

これはかなり自明な例ですが、複数の障害物や少し長い移動範囲がある場合は、複雑さを処理できるはずです。

プログラミングの複雑さや実行効率の点で、実際に単なる塗りつぶしよりも優れているかどうかにかかわらず、私には手掛かりがありません。問題を解決するためのより興味深い方法のように思えました。


影を落とすとはどういう意味ですか?
NRaf

1
明確にするために編集。
Tin Man
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.