回答:
探している重要な違いがない限り、通常はA *を使用します。
私は同様の問題を解決する必要がありました。「迷路」と障壁が絶えず変化する大きな迷路のようなグリッド上の経路探索です。
問題は、タワーディフェンスゲームでは、パスを解決する必要があるエンティティの数は、通常、グラフ内のノードの数よりもはるかに多いということです。A *は、これを処理するための最適なアルゴリズムではありません。何かが変更されるたびに新たに解決する必要があるためです。パスを1つだけ見つける必要がある場合は適切ですが、私の場合は、さまざまな場所に表示され、それぞれに独自のパスを持つエンティティを処理できる必要がありました。
フロイド・ウォーシャル私の場合のために、私はいつでもノードの変更、それはすべての隣人からそのノードへのコストを再計算し、その独自のアルゴリズムを書いたもののアルゴリズムは、はるかに適切である場合には隣人が変更されている、それが呼び出されますそれらに対して再帰的に。
そのため、ゲームの開始時に、すべての「目標」ノードでこのアルゴリズムを起動するだけです。その後、単一のノードが変更される(たとえば、通過不能になる)たびに、そのノードで起動し、変更が影響を受けるすべてのノードに伝達され、停止されます。したがって、グローバルな再計算の必要はなく、アルゴリズムはパス検索を必要とするエンティティの数から完全に独立しています。
私のアルゴリズムは基本的に(擬似コード)のようなものでした:
update_node method in Node class:
$old <- $my_score
find $neighbor node among all neighbors such that
$neighbor.score + distance_to($neighbor) is minimal
$my_score <- $neighbor.score + distance_to($neighbor)
$next_node <- $neighbor
if ($my_score != $old)
for each $neighbor
$neighbor.update_node()
ノードがターゲットであるか、何らかのバリアであるかに応じて初期スコアが決まります。
TDで使用したルートアルゴリズムは、ゲーム内に存在するエンティティの数が原因で、通常のA *パスから逆向きでした。ゴールから悪者にルーティングする代わりに、ゴールからボード上のすべての空の広場にルーティングしました。
これにはそれほど時間がかからず、「コスト」が見つかるまでボードを繰り返し続けるだけで、ブロックされたルート(それらを実行している場合)に適切なフィードバックを提供します。Floydのアルゴリズムを使用すると、データ依存のルックアップを行わず、ストリーム内のデータを読み込んで操作するだけなので、A *と比較して高速でキャッシュフレンドリーです。
無限コストに設定したボードから始めて、コストがゼロになるように目標二乗を設定し、ボードのチェックを繰り返して、隣接セルのコストが現在のコストに移動コストを加えたものよりも低いかどうかを確認します 旅費はあなたがあなたの経験則を置く場所です(私の場合、斜めに旅する費用は無限でしたが、塔を通る旅の費用は高かったので、彼らは塔を通って食べることを許可されましたが、選択)
コストグリッドを取得したら、セルのコストの最も急な勾配をテストすることで、そこから「フロー」グリッドをすばやく構築できます。これは、大量の悪者に対して本当にうまく機能します。なぜなら、彼らは誰も道を見つける必要がなく、彼らは仮想の道標に従うだけだからです。
もう1つの利点は、この方法では、障害物を調整するたびに(または私のゲームでは、クリープがタワーの1つを食い尽くすたびに)このタスクを実行するだけで済むことです。クリープ/モブが毎回フィールドに入るたびに(毎秒数千のモブと数十のモブが頭痛の種になっていただろう)。
経路探索は高速であり、通常のタワーディフェンスゲームほどの大きさであれば、何かが変更されたときにA *またはダイクストラのフルパスを実行しても問題はありません。完全にリフレッシュするために、1ミリ秒未満で話しています。あらゆる種類の適応経路探索は、恐ろしく複雑になります。世界最大のタワーディフェンスグリッドを作成している場合を除き、簡単な方法で実行してください。
A *パスファインディングはどのように機能しますか?始めるには良い場所かもしれません:-)
誰かが尋ねたので、プレイヤーがタワーを配置または削除するたびにパスを再計算することにより、動的に変化する環境に対処し、その間にそのパスをメモリに保存するだけです。環境はフレームごとに変わるわけではありません。
一部のTDゲームにはパスが設定されており、タワーを配置できないので、パスをハードコーディングしてブロックしないようにすることで、パス検索を簡単に解決できることに注意してください。
簡単な解決策は不正行為です。
事前にマップを設計して、行き止まりがないようにします。次に、各交差点で、キャラクターにルートを選択させるトリガーを追加します(例:常に左折、常に右折、またはランダム)。