不完全なポンAI


19

だから、私はLWJGLを使用しながらJavaとOpenGLを学び始めています。簡単に始めるために、私はAtari Pongのクローンを書いています。ゲーム画面、衝突検出を正しくセットアップし、すべてのゲームが実際に動作しています。実際に2プレーヤーのゲームであれば、これまでにやるつもりですが、これをシングルプレーヤーのゲームにすることを計画しているので、2番目のプレーヤーを制御するシンプルなAIを考え出す必要があります。

ボールがどこにヒットするかを知ることは非常に簡単なようであり、常にボールにヒットするAIを作成するのは簡単なように思えますが、ゲームに勝つことができるようにしたいので、IAを常にヒットさせることはできません玉。

そこで、人間のような欠陥をAIに追加するために、これをどのようにコーディングすればよいかという質問があります。AIが特定のポイントで失敗するかどうかをランダムに決定する必要がありますか?または、私がここで見逃しているよりスマートな(またはおそらく明白な)ものがありますか?

どうもありがとうございました。


5
まあ、一般的にあなたがボールをうまくAIがそれを達することができないプレイヤーが配置されている場合AIバットだけ..ので、一定のスピードを移動させる

4
まず、AIがパドルを移動できる速度を制限するか、AIがヒットに応答し始める前にランダムな(短い)ラグタイムで構築します。


4
@ byte56私は本当にそれをその質問のだましとは呼びません。「blog.stackoverflow.com/2011/01/…」の下の例のように感じます。「ユーザーの質問を重複として閉じる場合は、実際の重複である必要があります」。その質問は良いリソースです(そして、誰かがおそらくその質問を使用して、そこにあるコンテンツを考えて答えを導き出すことができるでしょう)が、それは本当にこの質問の詳細に答えていないと思います。
テトラッド

1
@Tetrad答えは最終的に非常に似ていると思いますが、そうですね、質問は異なります。この質問は、リンクされた質問のより具体的なバージョンだと思います。OPが最初に他のOPを見た場合、この質問が尋ねられたかどうかはわかりません。私が投票したとき、私は未定でしたので、私は質問と回答の両方に賛成し、重複として投票しました。それは私のためにどちらの方法でも行くことができます。
マイケルハウス

回答:


20

私のお気に入りの不完全なピンポンAIは、残酷にシンプルですが、AIにかなり良い失敗をさせることができます。

目に見えないボールAI

AIセットアップ:ボールがパドルで反射すると、ボールの位置と速度がわかります。その時点で目に見えないボールをスポーンしますが、より高速です。目に見えるボールが行く場所に巻き上げられます。各フレームで、AIを目に見えないボールの位置に向かって移動させます。目に見えないボールがAIの側面に到達したら停止します。AIがパドルを移動する場所です。

結果:AIはボールの経路を予測しようとしているように見えます。プレーヤーがボールを急な角度で反射し、壁から跳ね返ったとします。AIはボールを少し追跡しますが、ボールよりも遅いため、十分な速度でボールを追跡できません。AIをだましましたが、人間の観点からはかなり論理的に見えます。コンピューターがボールの行き先を予測しようとしているのを見ることができます。そして、それは見逃しました、遅すぎて、ポイントを獲得しました。

これは、AIを比較的インテリジェントに見せるため、ランダム性を挿入するよりも大幅に優れています。立派な相手。また、人間とまったく同じルールでAIをプレイできるため、プレイヤーにとって見栄えが良くなり、仕事が楽になります。

設定:目に見えないボールの速度を微調整することもできます。これにより、AIが計画する先を決定できるからです。目に見えないボールが速いほど、パドルをブロックするために移動する時間が長くなり、プレーヤーはよりよく照準する必要があります。


与えられたすべての答えは本当に良い情報を提供しましたが、正しい答えであるとマークしなければならなかったので、私はあなたのアプローチが本当に好きなので、これを選びました。これは、他の回答(反応時間で遊ぶなど)で述べられた他のいくつかと組み合わせて、本当に人間に似たAIを取得し、簡単に調整可能な難易度を得ることができます
Setzer22

特定の特別な動きに基づいて角度、速度、および加速度が可変であるため、これは私のセットアップでは完全に機能しました。AIは所有されていましたが、今でははるかに優れています。この方法がロックされた速度と45度の角度に最適でない理由はわかりますが、それは私のゲームではありません。
ジャクルジャイル

1
このアプローチは気に入っていますが、実装に問題がありました。問題は、トレーサーボールが表すボールよりも速く動くため、それが表すボールに発生するいくつかの衝突を見逃す可能性があることです。もちろん、トレーサーボールがフレーム間でより大きな距離を移動するからです。
ヴォルフガングシュリール

より忠実にしたい場合は、フレームごとに2回トレーサーボールの位置を再計算し、各計算の速度を半分にすることができます。
DDR

22

私がプレイしたPongゲームは、次のように動作するようです。AI制御のパドルは、ボールがどこに当たるかを知っていますが、その位置に到達する速さには制限があります。だから時々見逃します。これが最も明白な方法だと思います。


この。AIは、フレームごとに3pxなどしか移動できず、上から下に移動する必要がある場合、ボールがどこに当たるかを知るのに役立ちません。
キース

14

TI83ですごいすごいパックマンクローンを作成したときは?電卓、私が遭遇した最大の問題は、「ゴースト」が速すぎるということでした。どうにかして速度を落とさなければなりませんでした。そこで、大きな古いsin(cos(tan(x-coordinate)))をそこに入れます。簡単なレベルではその計算が数回行われ、難しいレベルでは操作の1つだけが行われます。

ポイントは、反応時間です。典型的な人間の反応時間を調査し、それに10ミリ秒を追加します。出発点としてそれを使用してください。レベルが難しくなるにつれて、反応時間から時間を削除します...これThread.sleep(time);はAIにとって簡単なことです。AIが動き始める前にその時間を待ちます。

また、パドルの移動速度を制御することも、本当に複雑になりたい場合は、さまざまな程度の情報に基づいてボールの位置を決定することもできます。たとえば、ベクトルではなく2ピクセルだけです。角度修正子を壁に追加して、ある程度のランダム性を追加し、AIに強制的に再計算させます。


2
正確に使用した理由を説明していただけますsin(cos(tan(x)))か?
nullpotent

5
原因iは若く、愚かで、TI83では、sin(cos(tan(x)))がAIに良い遅延単位を作成しました。また、私の知る限り、電卓にはミリ秒を使用できる待機コマンドがありませんでした。おそらくある程度の明確さ:アセンブリやマイクロスクリプト、またはそれらをコンパイルするためにコンパイルできる言語は使用しませんでした。ファームウェア内のプログラミングコード(prgmボタン)を使用しました。画面には最大8行のコードが常に表示されていました。ラグタイムについてこれ以上複雑なことは思い出せませんでした。
ラッセルUhl

2
TI83のファームウェア内コードでプログラムすることを学びました。その後、C ++で構造化プログラミングを再学習する必要がありました。TI83は、スパゲッティ文字列コードとは何か、なぜ悪いのかを教えてくれたと思います。それ以来、gotoステートメントを使用していません。でもいいね。
ContextSwitch

2
いい主よ、ゴトス。私は時々コードを再訪します....そしてすぐにgiveめます。私は数学の授業中に何週間もこのことをどうやってプログラムしたのか分かりません。
ラッセルUhl

1
トリガーの遅延について防御する必要はありません。ループ内の浮動小数点演算は、数十年前に作成されたプログラムで一時停止を行う一般的な方法であり、計算機のパフォーマンス/機能は80年代初期のコンピューターに沿っています。
ダンニーリー

6

パドルを単にスローダウンした場合、鋭角でボールを打つ(つまり、反対側にまっすぐではなく上下に大きく移動する)ときはいつでも、ボールが上下に移動するため、コンピューターはほとんど見逃します。パドルで補正できるよりも高速です。

代わりに、パドルの速度とAIが反応するポイントで遊んでいます。例えば:

  • ユーザーがボールを打ったとき
    • AIはすぐに反応し、ボールがある場所に移動できます。それが十分に速い場合、時間通りにそこに着くでしょう
  • ボールがフィールドの中央を横切るとき
    • AIは、反応する前にフィールドの中央を通過するまで待機する必要があります

変更するもう1つの事はあるどのように AIが反応します。パドルが常にボールがある位置に移動する戦略を強調しました。人はいつもそうすることはできません。彼らはボールを上下に追跡する可能性が高く、すべてのバウンスのためにボールが正確にどこに到達するかを知りません。

したがって、より人間的な反応の方法は、常にボールに向かって移動することです。たとえば、ボールが上に移動している場合、パドルは上に移動します。パドルが十分に速い場合、上下の跳ね返りに反応する可能性があります。パドルが十分に速くない場合、ボールが上に移動するときに上に移動することで過補償になりますが、バウンドすると、パドルは十分に速く下に移動できない場合があります。

最後に、難易度を上げたり下げたりするために、パドルのサイズで遊ぶこともできます。


2

考慮すべき要素の1つはランダム性です。人間のプレイヤーは常にプレイにある程度のばらつきがあるため、AIを人間のように見せたい場合は、プレイにもある程度のばらつきを持たせる必要があります。

次の範囲を設定できます。

  • 反応時間(AIが動き始める速さ)
  • 速度(AIがパドルを動かす速さ)
  • 精度(AIが実際にパドルを移動したい場所にどれだけ近づいて、行きたい場所をアンダーシュートまたはオーバーシュートする機会を与えるか)

その後、相手がヒットするたびに、AIはそれらの範囲内の値を選択し、それに基づいて決定(および移動)を行うことができます。AIの相手をより簡単にするために、これらの範囲をすべてかなり貧しくすることができますが、AIに「ラッキーショット」を与えるために広い範囲を設定することもできます。より難しい対戦相手の場合、これらの範囲を狭め、すべてを「良い」範囲に入れることができます。


2

ポンだけに固有のものではない、より一般的なソリューションを提案します。これはピンポンだけでなく、どのゲームにも適用できると思います。人間のような振る舞いがしたいですか?人間が人間を演じているように感じることができるように...したがって、ひいては勝つことを願っています。それで、あなたは何をしますか?

人間を観察してください!プレーヤーはどのようにピンポンで負けることができますか?さて、2人の卓球選手を見れば、それは明らかです。通常、損失は単にボールが速すぎて、プレーヤーの反応時間が遅れたためです。これは2つのパラメーターで、そのうちの1つは調整可能です。もう1つは、プレイヤーが正しい方向を押す能力です。したがって、エラーの頻度と反応の頻度があります。どちらも難易度に応じて調整できます。

簡単なAIでは、入力ラグが大きくなり、ランダムなミスを犯しやすくなります。より難しいAIでは、これらのパラメーターが難しくなるように調整されます。

これはほぼすべてのゲームに適用できます-三目並べやより複雑なモデルなどです。このアプローチは、より複雑なシナリオでは機能しませんが、パラメーターとスコープの数が狭いゲームでは十分です。


1

以下にいくつかのオプションのリストを示します。そのうちのいくつかはすでに説明されています。

  • よりスマートなコンピュータープレーヤーがボールを狙うようにして、プレーヤーが多くのバウンスでリーチするのをより困難にし、簡単な相手に対しては逆を行います。
  • スマートプレーヤーは、パドルが相手に向かっている間にパドルを中央に向けて移動し、どこに戻るかわかりません。
  • 最終的なバウンスの前に、人間がボールがどこに到達するかを予測することは困難です。AIに同様の不正確さを持たせます。
  • パドルの速度を制限して、ボールよりも遅くなるようにします。完璧なプレイでミスするためには、垂直速度の半分以下にする必要があります。
  • 難易度、試合時間などに基づいてボールの速度を上げます
  • 人間は即座に反応しません。AIプレイヤーもそうすべきではありません。
  • AIにミスをしてボールを逃すチャンスをランダムに与えます。

0

私は(LUAで)小さなPongクローン作成しました。

私のAIは非常にシンプルですが、それほど悪くはありません。

ボールのy位置を確認し、低い場合はパドルを下げ、高い場合はパドルを上げます。

次に、難易度を微調整するために、コンピューターのパドルが動き始めるボールからの距離を増減します。

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