このA *検索パスファインディングアルゴリズムを調整して、さまざまな地形の動きの値を処理するにはどうすればよいですか?


8

Diablo IIと同様のインタラクションデザインを備えた2Dマップベースのアクションゲームを作成しています。つまり、プレーヤーはマップをクリックしてプレーヤーを移動します。プレイヤーの動きを終えて、パスファインディングに移ります。

ゲームでは、敵はプレイヤーのキャラクターを充電する必要があります。異なる移動ボーナスを与える5つの異なる地形タイプもあります。AIがこれらの地形のボーナスを利用して、プレイヤーに到達しようとします。

A *検索アルゴリズム(http://en.wikipedia.org/wiki/A*_search_algorithm)をチェックアウトするように言われました。私は、HTML5とJavaScriptでこのゲームをやって、そしてJavaScriptでバージョンを見つけたんだ:http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript私はそれを微調整する方法を把握しようとしていますでも。

以下は、私が変更する必要があるものについての私の考えです。他に何を心配する必要がありますか?

  • グラフを作成するときは、渡した2D配列を、さまざまな地形タイプに対応するマップのトラバーサルで初期化する必要があります。
  • graph.js:「GraphNodeType」の定義を変更して、5つの地形タイプを処理する必要があります。壁はありません。
  • astar.js:ghのスコアリングを変更する必要があります。どうすればよいですか?
  • astar.js:isWall()はおそらく削除する必要があります。私のゲームには壁がありません。
  • astar.js:これが何であるかわかりません。処理が有効でないノードを示していると思います。しかし、これはいつ起こりますか?
  • 高いレベルで、このアルゴリズムを「ああ、そこに壁はありますか?」からどのように変更しますか?「この地形は、周囲の地形よりも速くプレイヤーに到達しますか?」

時間の関係で、私は敵にブレゼンハムのアルゴリズムを再利用することについても議論しています。残念ながら、さまざまな地形の動きのボーナスはAIによって使用されないため、ゲームは夢中になります。:/私はこれをプロトタイプに取り入れたいのですが、私は貿易開発者ではなく、コンピュータ科学者でもありません。:D

私が探していることを実行するコードを知っている場合は、共有してください!

このための健全性チェックのヒントも高く評価されています。


こんにちは、ライブラリの著者です。GitHubの最新バージョンを使用していますか?github.com/bgrins/javascript-astar/blob/master/astar.js。古いリストベースの実装よりもはるかに高速です。
ブライアングリンステッド

回答:


7

アルゴリズムの非常に特定の行に注意を払う必要があります:

// g score is the shortest distance from start to current node, we need to check if
//   the path we have arrived at this neighbor is the shortest one we have seen yet
var gScore = currentNode.g + 1; // 1 is the distance from a node to it's neighbor

これは、その特定のノードのコストです。あなたはそれを次のようなものに変更したいでしょう

var gScore = currentNode.g + currentNode.cost

これにより、パスは高価な地形を避け、安価な地形を優先します。'currentNode.cost'が地形に適したものを返すようにするのはユーザーの責任です。すべての地形のコストが1であるとは限らないという事実です。ある地形は他の地形よりも安価です。他にも考慮すべき点がありますが、コードのこの特定のポイントに注目する必要があります。


これをありがとう。各ノードがその座標でピクセルを検索し、それをコストとして格納するようにコードを変更しました。残念ながら、800x500グリッドの2点間でテストパスファインドを実行したところ、ブラウザがクラッシュしました。:/これにはいくつかの要因があります:astarコードは最適化を必要とするかもしれません。私のキャンバスのサイズは巨大です。多分私のグラフの初期化が間違っています。キャラクターのアバターの色が混乱しているのかもしれません。私は何をすべきか?:(
user422318 2012

「ピクセルを保存する」とは、ピクセルの地形コストを保存するということですか?一部のRGB値は、その地形の実際のコストと一致する可能性が低いためです。正確な値はゲームによって異なりますが、おそらく1から10までの数値(1は道路、10は沼)を格納する必要があります。
Myrddin Emrys

1
こんにちは、ライブラリの著者です。GitHubの最新バージョンを使用していますか? github.com/bgrins/javascript-astar/blob/master/astar.js。古いリストベースの実装よりもはるかに高速です。
ブライアングリンステッド

2
@ブライアンこのコメントは、私の回答ではなく質問に記入する必要があります。これにより、実際にライブラリを使用している人が、私ではなく電子メールで通知を受け取ることができます。
Myrddin Emrys 2012

2

これはまさにA *の目的です。あなたがする必要があるのは、地形タイプに基づいてノードのコスト間に頂点を割り当てることです。(例では、すべての頂点のコストが1のグラフを使用しているようです。)


0

この実装は、現在オン/オフに少し固有です。Myrddin Emrysが言うように、コストに基づいて(1だけではなく)gスコアを変更する必要があります。ここでこれについての議論がありました:https : //github.com/bgrins/javascript-astar/issues/3

このソリューションが機能するようになったら、このライブラリをメインライブラリに移植したいです。

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