現実世界の視点から:AからBに向かっていて、ロックされている方法でドアDを見つけた場合、キーDを見つける必要があることに気付くでしょう。 、それはそれ自体の一連の小さなパスファインディングステップであるキーのスカウトを含みます。一方、パスを試みる前に、そのルートにロックされたドアがあることをAIに知らせたい場合があります。その場合、鍵の場所も知っているでしょう。
どちらにしても、問題は2つのレベルでの接続の1つです。「地上」レベルでは、1つの分割されていないゾーン内で常に安全に移動できます。つまり、ロックされたドアによって分割されていません。これは、現在のA *パスファインディング実装を自由に使用できる場所です。(単純化した例では、ゾーンを1つの部屋として見ることができます。ドアのロックを解除せずに他の部屋に到達することはできません。実際には、それはあなたのダンジョンの全領域である可能性があります。)これはあなたの基礎です実体の動きですが、最初にあなたの周りの領域を調査するのではなく、目を伏せて歩き回るようなものです。または、この場合、ロックされたドア。したがって、A *が実行される地上レベルのマップは、プレーヤーを現在のゾーン内でのみ移動するように制限する必要があります。
次に、より高レベルのマップがあります。これは、本質的に地形よりもトポロジー的です。それは、障害物の地上の詳細などを実際には気にせず、ゾーン間の接続のみを気にします。このトポロジマップは、現在ダンジョン内のすべてのゾーンの理想的な接続を示しているため、現在それらの間にドアがロックされているゾーン間の接続も示しています。そのエッジ(それぞれがゾーン間のドアを表す)には、そのドアを開くためにまだ必要なキーが格納されています。それ以外の場合は、開いていると見なされます。したがって、このグラフで最短経路を検索する場合、検索の実行時にエッジのデータをチェックすることで、見つかった経路を既に開いているルートのみに制限する必要があります。ここでの接続性は開放性を意味するのではなく、潜在的な開放性を意味します。
別のゾーン内にあるポイントに移動する場合は、まず上位マップを検索してパスを見つけます。(A *または他の最短パスアルゴリズムがこのレベルで使用される場合があります。)パスを見つけると、その上位レベルのマップは、現在のゾーンから他のゾーンに到達するために使用する必要があるドアに関する情報も提供するはずです。これで、ローカルゾーンで、地上レベルのAIを実行してそのドアに移動できます。ドアに到達すると、キャラクターはそのドア/ポータルを通過できます。彼は現在ゾーンBにいます。これがターゲットゾーンである場合、彼は地上レベルのナビゲーションを使用してキーに移動できます。そうでない場合は、ターゲットゾーンに到達するまで手順1を繰り返す必要があります。
求められている鍵自体がロックされたドアの後ろにある可能性があります...そしてそのドアへの鍵も同様に...など、吐き気がします。これは本質的に依存関係の解決の問題であり、これに取り組む方法はいくつかあります。そのうちの1つがペトリネットです。この優れた論文をご覧ください。
PS。ダンジョンを手続き的に作成している場合は、プレーヤーの開始位置がわかっている限り、作成時に依存関係の順序に関する情報を保存できます。