19

背景は次のとおりです... 自由時間には、Staker (古い BASIC ゲームのTank WarsScorched Earthに触発されたもの) と呼ばれる砲撃ゲームを設計し、MATLAB でプログラミングしています。最初は「なぜ MATLAB なのか? ゲーム デザインに適した言語/ソフトウェア パッケージは他にもたくさんある」と思うかもしれません。そして、あなたは正しいでしょう。ただし、私は馬鹿で、ゲームをゼロから設計する方法の基本を学ぶことに興味があるため、必ずしもプレハブ モジュールで何かを使用したいとは限りません。また、私は MATLAB を何年も使用しており、他の人が実際に試みたことのないことを MATLAB で行うという挑戦が好きです。

目前の問題に移ります。プレーヤーがコンピューターと対戦できるように、AI を組み込みたいと考えています。ターゲットに命中するための方位角、仰角、発射体の速度を選択し、ターンごとに調整するアルゴリズムを設計する方法について考え始めたばかりです。問題を考えすぎて、最初は AI を複雑にしすぎたのではないかと感じたので、一時停止して、ここのコミュニティにアルゴリズムの設計方法についてアイデアを求めてみようと思いました。

具体的な質問:

  1. AI 設計に関する具体的な参考文献はありますか?

  2. AI プレーヤーの難易度が連続的に変化するように設計しますか (難易度 0 (簡単) から 1 (難しい) まで、すべて同じ一般的なアルゴリズムを使用します)、または個別の数の AI プレーヤー用に特定のアルゴリズムを設計しますか (ランダムな方向に発砲する簡単な敵や、風の影響を考慮できる難しい敵など)?

  3. どのような種類の数学的アルゴリズム (疑似コード記述) から始めますか?

追加情報: 発射体の動きをシミュレートするために使用するモデルには、流体抗力と風の影響が組み込まれています。「流体」は空気でも水でも構いません。空気中では、いくつかの単純な大気モデルに基づいて、空気の密度 (したがって抗力の効果) が地上からの高さによって変化します。水中では、抗力が非常に大きいため、発射体は通常追加の推力を必要とします。つまり、発射体は重力以外の力の影響を受ける可能性があります。

4

7 に答える 7

4

実際の大砲の状況では、これらすべての要因は、式または単純な総当たりシミュレーションのいずれかで処理されます。電子砲弾を発射し、関連するすべての力を適用して、どこに着弾するかを確認します。電子シェルがターゲットに命中するまで、調整して再試行してください。これで、銃に送信する番号ができました。

状況の複雑さを考えると、総当りの答えよりも優れた答えがあるとは思えません。予想される抗力効果と速度の表を事前に計算することはできますが、それが価値があるとは思えません。

もちろん、AI が毎回最初の砲弾を頭に落とすようなゲームは面白くありません。正しい値がわかったら、AI をお粗末なショットにする必要があります。ショットにランダム係数を適用し、ターゲットに向かって歩きます。発射するたびに、真のターゲットに向かって 30+random(140)% 移動します。

編集:

時間が経つにつれてそれを改善するというBCSの考えに同意します。と言いましたが、途中で書き方を考え直してしまい、元に戻すのを忘れていました。

于 2009-01-10T19:52:03.630 に答える
3

ローレンとBCSに感謝します。あなたは私が検討していたアイデアを思いついたと思います(上記の質問2を促しました)。AIターンの擬似コードは次のようになります。

nSims;        % A variable storing the numbers of projectile simulations
              %    done per turn for the AI (i.e. difficulty)
prevParams;   % A variable storing the previous shot parameters
prevResults;  % A variable storing some measure of accuracy of the last shot
newParams = get_new_guess(prevParams,prevResults);
loop for nSims times,
  newResults = simulate_projectile_flight(newParams);
  newParams = get_new_guess(newParams,newResults);
end
fire_projectile(newParams);

この場合、変数nSimsは、本質的にAIの「インテリジェンス」の尺度です。「ダム」AIはnSims=0であり、(前のターンの結果に基づいて)ターンごとに新しい推測を行うだけです。「スマート」なAIは、発射体の飛行をシミュレートすることで、1ターンあたりの推定nSims回数を改善します。

これからさらに2つの質問が出てきます。

1)関数get_new_guessには何が入りますか?ターゲットまでの距離を最小化するために、3つのショットパラメータをどのように調整する必要がありますか?たとえば、ショットがターゲットに届かない場合は、仰角のみを調整するか、発射体の速度のみを調整するか、両方を一緒に調整することで、ショットを近づけることができます。

2)get_new_guessはすべてのAIで同じであり、nSims値が「インテリジェンス」の唯一の決定要因である必要がありますか?または、get_new_guessは別の「インテリジェンス」パラメーター(guessAccuracyなど)に依存する必要がありますか?

于 2009-01-10T21:36:58.223 に答える
3

ローレンのブルートフォースソリューションは、反復を追加することで簡単に「インテリジェンス調整」ができるため、魅力的です。また、反復の調整係数はインテリジェンスの一部である可能性があります。これは、値によって収束が速くなるためです。

また、基本システム(抗力、風などなし)の場合、基本的な物理テキストから導出できる閉じた形式のソリューションがあります。私は最初にそれを推測し、次にターンごとに1回以上の反復を行います。最初のショットを改善するために、経験的な補正相関を考え出すことをお勧めします(最初のショットの分布の平均をより正確に近づけるもの)

于 2009-01-10T20:01:09.587 に答える
3

砲兵戦と実際の砲兵戦の状況の違いは、すべての陣営が 100% の情報を持っており、通常は 2 人以上の敵がいるということです。

その結果、評価関数は、どの対戦相手をより緊急に排除しようとするかを検討する必要があります。たとえば、私が 90% の確率で簡単に倒せる場合でも、誰かが私を殺そうとしていて、私の近くで 2 発のショットを逃した場合は 50% の確率である場合、そのチャンスに対処することがより重要になります。

弾薬、場所、活動、過去の歴史などの観点から、誰もがあなたにもたらすリスクを評価する何らかの方法が必要になると思います.

于 2009-01-10T22:01:01.573 に答える
3

私は今、あなたが投稿した応答に対処しています:

あなたは一般的な考えを持っていますが、あなたのアプローチが実行可能になるとは思いません.nSimsの値が低い場合でも、収束が速すぎます。シェル間で get_new_guess を複数回繰り返す必要があるとは思えません。それ以上のランダム化が必要になる可能性があります。

複数の反復を使用できたとしても、大きなステップになるため、継続的に難易度を上げるのは得意ではありません。難しさはランダム性によって処理されなければならないように私には思えます。

まず、get_initial_guess:

まず、世界をゾーンに分割するテーブルを作成します。難易度が高いほど、ゾーンが多くなります。これらのゾーン間の境界には、45、60、および 75 度の電力が事前に計算されます。砲弾が地形に衝突した場合は、より高い角度で再試行してください.

最初の砲弾は、下限と上限に指定された値の間のランダムなパワーで発射する必要があります。

さて、get_new_guess について:

砲弾は地形に衝突しましたか? 角度を大きくします。同じ距離を維持するためにどれだけの電力を増やす必要があるかについては、一定の比率があると思います-これについてテストを実行する必要があります.

それが山を叩かなかったと仮定して、それが短いか長いかに注意してください. これにより、バウンドが得られます。新しい推定値は 2 つの境界の間のどこかにあります (境界がない場合は、その場所で get_initial_guess のテーブルの値を使用してください)。

ターゲットが下限と上限の衝撃点の間の何パーセントであるかに注意し、上限と下限のパワーの間のパワーを選択します。

これはおそらく正確すぎるため、ランダム化が必要になる可能性があります。単純なランダム % を追加することについて気が変わりました。むしろ、複数の乱数を使用してベル カーブを取得する必要があります。

于 2009-01-11T00:38:58.247 に答える
1

私は個人的にそのようなシステムを作成しました - ウェブゲーム Zwok のために、力ずくで。ランダムな方向にたくさんのショットを発射し、最高の結果を記録しました。タイムステップなどの違いにより予期しない結果が生じるため、他の方法で行うことはお勧めしません。

于 2009-06-25T19:01:48.897 に答える
1

別の考え: 一度に 1 つのシェルのみがアクティブなシステムを扱っているのでしょうか? 昔、私は砲兵ゲームを実装しました。5 つのバレルがあり、それぞれのリロード時間が最大飛行時間よりも長く設定されていました。

それで、私は現在の下限と上限の間の範囲に広がる砲弾を発射する戦略を使用していることに気付きました. ただの人間である私が最適な戦略を使用していなかった可能性はありますが、これはリアルタイムであり、バレルの準備が整うとすぐにラウンドオフすることは、収束するために可能な限り狙いを定めていることを確認することよりも重要でしたとにかく速い。私は通常、2 番目の一斉射撃で砲弾を目標に向け、3 番目の一斉射撃は通常すべて命中します。(キルには、ターゲット内のすべてのピクセルをキルする必要がありました。)

AI の状況では、これと、後でより正確な弾丸を発射するためにバレルの一部を抑える戦略の両方をモデル化します。私はまだターゲット範囲全体にスプレッドを発射しますが、唯一の問題は、すべてのバレルを使用するかどうかです。

于 2009-01-11T00:47:11.427 に答える