射撃でインテリジェントな敵を実装する方法は?


13

誰もが知っている、非常に単純なシューティングを想像してください。

シュートエムアップ1

あなたはプレイヤーです(緑)。あなたの動きはX軸に制限されています。私たちの敵(または敵)は画面の上部にあり、彼の動きもX軸に制限されています。プレイヤーは敵に弾丸(黄色)を発射します。

プレイヤーの弾丸を回避するのに本当に優れているはずの敵にAIを実装したいと思います。私の最初のアイデアは、画面を個別のセクションに分割し、それらに重みを割り当てることでした。

加重シュートエムアップ

2つの重みがあります。「弾丸の重量」(灰色)は、弾丸によって課される危険です。弾丸が敵に近ければ近いほど、「弾丸の重量」0..1が高くなります(ここで、1が最も危険です)。弾丸のないレーンのウェイトは0です。2番目のウェイトは「距離ウェイト」(ライムグリーン)です。すべての車線に0.2移動コストを追加します(この値は現在では任意であり、調整可能です)。

次に、重みを追加し(白)、重みが最も小さいレーンに移動します(赤)。しかし、このアプローチには明らかな欠陥があります。最適な場所は 2つの入ってくる弾丸の(白い矢印で示されているように)であるため、極小値を簡単に見落とす可能性があるからです。

だからここに私が探しているものがあります:

シュートエムアップ完全破壊

  • 弾丸の脅威を課す場所がない場合でも、弾丸嵐を乗り越える方法を見つける必要があります。
  • 敵は、最適な(またはほぼ最適な)ソリューションを選択することで、確実に弾丸をかわすことができます。
  • アルゴリズムは、弾丸の移動速度を考慮できる必要があります(異なる速度で移動する可能性があるため)。
  • さまざまなレベルの難易度を適用できるようにアルゴリズムを微調整する方法(超知能の敵には馬鹿です)。
  • 敵は弾丸を避けたいだけでなく、プレーヤーを撃つこともできるため、アルゴリズムはさまざまな目標を許可する必要があります。つまり、弾丸をかわすときは、敵がプレイヤーを射撃できる位置が優先されるはずです。

それでは、これにどのように取り組みますか?このジャンルの他のゲームとは対照的に、私は少数の、しかし非常に「熟練した」敵を大勢の愚かな敵の代わりに持ちたいです。


2
ステアリング動作のようなものを使用することを検討しましたか?具体的には障害回避のためのものが1つあります。red3d.com
steer

@Tetrad私はステアリングの振る舞いについて考えてきました。また、「プレーヤーを撃ってみてください」のようにうまく切り替えられるため、危険が「回避」に切り替わる場合もあります。私は1次元(基本的に私が扱っている)のevadeがあまりにも愚かすぎて良い決定を下すことができないことを恐れています。私は間違っているかもしれません。
bummzack

回答:


8

あなたの基本的な考えは音だと思いますが、アナログではありません。画面全体で実行されるアナログ値フィールドが必要です。そのため、1D拡散勾配は、その線の正確なポイントで、その場で値を導き出すことができます。拡散勾配は安価で、複数の敵が一度に使用できます。それらは環境の説明であり、エンティティのビューではありません(ラジオシティライティングに少し似ています)。 。この勾配は、敵から有機的な動きを呼び起こすように比較的滑らかである必要があり、ゲームの状態と同様に明らかに更新されます。おそらく移動平均

勾配は結合する必要があります:

  • 近接
  • 速度
  • 弾丸の幅
  • (オプション)ターゲット(プレイヤー)の位置

回避するためには、解が存在するときはいつでも解を正確に見つけることができなければなりません。敵が通り抜けるのに十分な小さな隙間があるときはいつでもそうです。つまり、できることしかできないので、この意味で勾配アプローチは他のどのアプローチよりも悪くなることはないと思います。

拡散勾配は、移動する必要性が少なく、敵を局所的な最適値(グラフのピーク)に向けてプッシュする必要があります。局所的な最小値に近づくほど、回避に対するリターン効果が減少します。これにより、敵がいつ攻撃を開始できるかについて、よりインテリジェントな意思決定への扉が開かれます。

発射する必要性が移動する必要性よりも大きい場合は、そうします。コードは、それらがどれだけ異なるによってこれ決定することもあります。これをベースグラフの一部として実装できます。この場合、プレーヤーの位置によってグラフ内の周囲の値が減少し(敵が最下点に引き寄せられると仮定)、すべての意思決定を1つのグラフに結合するか、メインの「避けたい」グラフとは別の「発射したい」グラフを使用すると、より直接的な制御が可能になります。

IRL、発射物の回避を気にすることはありません。それは、最高の回避速度で回避が困難になり始めていることがわかっている距離内にあるまでです。若者として石を投げる体験。速度yで移動するx距離の弾丸は、2yで移動する2x距離の弾丸と同じ危険度を持っています。そのため、これを正しく考慮する必要があります。

敵の難易度に合わせてアルゴリズムを調整する方法は次のとおりです。

  • グラフの更新に遅延が生じる(Born Too Slow)
  • ランダムで局所的な不正確さをグラフに導入する
  • 単純なAIの怠inessのために、一連の更新(1〜10フレームなど)にわたって、グラフに示されている内容に従わないようにします。

繰り返しになりますが、すべての要因を1つのグラフ(制御が少なく、複数の敵に対してあまり役に立たない)に実装するか、複数のグラフにまとめて結果を得ることができます(よりモジュラーで、おそらく複数の敵に適しています)。このアプローチを取ることができる多くの指示があるので、より具体的にするのは難しいです。


1
親愛なるニック。フラッシュでその動作の小さなテストバージョンを実装し、結果に非常に満足しています(弾丸がランダムに生成されます)。現在、3つのグラデーションを使用しています。1つは脅威、移動コスト、もう1つはエッジ用です(画面のエッジがあまり望ましくないように)。これらはフラッシュアプ​​リケーションで視覚化されます。微調整を行うことで、非常に良い結果が得られるだけでなく、射撃位置などの他の重みも考慮することができると感じています。どうもありがとう。
bummzack

1
ちょっと@bummzack、それは喜びの仲間です、それはクールな小さなデモです!問題に対するあなたの見方は私にとって新しいものであり、興味深く見えました-それがうまくいくのを見てうれしいです!それを手伝ってくれてうれしい、そして共有してくれてありがとう。
エンジニア

7

これは、パスの問題と見なすことができます。悪役が弾丸をどのように回避するかを考えるのではなく、弾丸の画像化は静的であり、悪役は弾丸を通り抜けて画面の下部に移動する必要があります。

    E    
B  B**B
  B***B  B
 B***B   B
B**B** B 
 B**B**BB
B*****B B
      P

E =敵
B =弾丸
P =プレイヤー
* =画面の下部へのパスオプション

バディが成功したパスをプロットしたら、毎回次のステップを踏むだけです。おそらく、このようなパス検索には、すでにいくつかの優れたアルゴリズムがあります。バディが弾丸と同じ速度で移動する場合、アルゴリズムの一例があります。

悪いところから始めて、左下、右下と右下の空きスペースに安全な位置をマークします。次に、作成したばかりの各安全なスペースを考慮して繰り返します。下に安全なスペースがない場合は、そのスペースを安全でないとマークし、バックトラックします。


1
興味深いアプローチ。環境が非常に速く変化し、離散的な「マップ」で最適に機能するため、一般的なパス検索アルゴリズムを使用するのは難しいので、これは少し高価になるのではないかと心配しています。
bummzack

コストが高すぎてはいけません。各ターンで一番下の行を計算するだけでよく、全体を再計算する必要がないことを忘れないでください。
Qwerky

@bummzack環境は、少なくともコンピューターに関しては「高速」ではありません。ゲーム開発者にとって、ほぼすべてのゲームはステップベースであり、そのステップのサイズにすぎないことを理解する必要があります。しかし、各ステップで計算を行うことができますので、Qwerky soltuionが必要です。
ディール

実際、@ bummzackに同意します。このアプローチは論理的に強固ですが、問題で提案されている1Dアプローチよりも高価になります。時期尚早の最適化かもしれませんが、私はそのアプローチがはるかにエレガントになると思います。詳細については私の回答をご覧ください。
エンジニア

2
これはおそらく適切な答えですが、正確に現実的なものではありません。敵がパスを解決するまでに、フィールドに別の弾丸を設定してパスを完全に無効にすることができます。つまり、パスを再計算する必要があります。そして、再計算はめちゃくちゃです。さらに、安全な場所に逆伝播するというあなたの考えは、さらに高価になります!@Nick Wiggill時期尚早の最適化だとは思いませんが、股間を蹴らないように先見の明があるだけです。
レイデイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.