1

捕食者と被食者の AI シミュレーションを開発しています。AIが追いかけられている場合、障害物の後ろに隠れているAIをシミュレートしたいと思います。しかし、私はまだこれを実装するための最良の方法を見つけようとしています.

捕食者が障害物のどちら側にいるのかを確認し、反対側に行こうと考えていました。おそらく、A* パス検索アルゴリズムを使用して、最短パスを使用してそこに到達するようにします。

今私が書いている主な理由は、誰かがこれを実装する正しい方向に私を向けることができる場合(おそらく誰かが以前にこれを行ったことがあります)、またはそれを実装する方法について他の良いアイデアを持っている場合です. AI のプログラミングやゲームの作成に関して、これまでにこのようなことをしたことはありません。

すべての障害物は、水平または垂直の正方形/長方形のいずれかです。

ここに画像の説明を入力

赤丸が捕食者、緑丸が追われる獲物です。

4

2 に答える 2

1

頭のてっぺんからコードを説明することはできませんが、いくつかのことを伝えることができます。

まず、このプログラムの目標を定義する必要があります。この場合、AI を障害物の後ろに隠れさせ、ユーザーと AI を可能な限り反対側に保つことです。

次に、この目標を達成するために (実際のコードを記述することなく) コード内で何を行う必要があるかを決定する必要があります。例えば:

  • シーンのどの「ゾーン」が「障害物の背後」と見なされるかを判断する必要があります
  • 次に、AI が障害物を通過せずにそのゾーンに到達するためのパスを決定する必要があります。
  • 最後に、これにある種の遅延を追加する必要があるため、ユーザーが画面上を移動するピクセルごとに AI が常に考えを変えないようにする必要があります。

これ自体は簡単な問題ではありませんが、汗をかきすぎずに確実に達成できます。遅くて大量のコードが必要な場合でも、方法を見つけてからコードを記述し、最後に改良することをお勧めします。精緻化を心配していると、問題が解決されることはありません。

ヒント: プレイヤーから障害物の中央を指すベクトルを決定します。次に、ベクトルを 2 倍してプレイヤーの位置に加算すると、障害物の反対側のポイントが得られます (長方形であると仮定します)。Math.min()取得した x 値と y 値にまたはリストリクタを適用Math.max()して、AI を障害物にできるだけ近づけたり遠ざけたりします。それはまともなスタートになるはずです!:)

更新 -- コードを追加することにしました。

// This assumes a few variables:
int obstacleCenterX, obstacleCenterY;
int aiX, aiY, aiWalkSpeed;
int predatorX, predatorY;
private void updateAIMovement() {
    int slope_x = obstacleCenterX - predatorX;
    int slope_y = obstacleCenterY - predatorY;
    int destination_x = predatorX + (slope_x * 2);
    int destination_y = predatorY + (slope_y * 2);
    if(aiX != destination_x){
        aiX += (slope_x / Math.abs(slope_x)) * aiWalkSpeed;
    }
    if(aiY != destination_y){
        aiY += (slope_y / Math.abs(slope_y)) * aiWalkSpeed;
    }
}

私は何もテストしていませんが、これは正しい道かもしれません。その小さなコードスニペットだけを改善するために多くのことを行うことができましたが、そうしませんでした (斜めに移動するときにプレーヤーが真の速度で移動することを確認するためのトリガーなど)。

うまくいけば、これは少し役立ちます!

于 2013-01-04T23:44:03.307 に答える
0

x と各オブザーバーの間の直線を横切る何かがあるかどうかを確認します。そうである場合、x は非表示になります。

于 2013-01-04T23:29:39.583 に答える