9

Javaでプールビリヤードゲームを実装していますが、すべて正常に動作します。マルチプレイヤーゲームですが、それでも一人でプレイできるはずです。この目的のために、私は単純なKIを実装しようとしています。現時点では、KIはインパルスの方向と強度をランダムに選択します(そのための正しい英語の単語はわかりません)。もちろん、このAIは非常に貧弱で、プレイヤーに挑戦する可能性はほとんどありません。

そこで、KIの改善を考えましたが、解決が難しい問題がいくつかあります。まず、一番近いボールを選んで、一番近い穴に直接入れてみようと思いました。これはそれほど悪いことではありませんが、間に他のボールがある場合、それはもう実際には機能していません。さらに、これはインパルスの強度を計算するという問題を解決しません。

それで、一般的なアドバイスはありますか?または何かアイデアはありますか?ベストプラクティス?

4

5 に答える 5

7

ゲームの1回の「移動」の結果を計算するには、どのくらいのCP​​U時間とメモリが必要ですか?複数の動きを分析する余裕はありますか?比較的安価な場合は、N個のランダムな方向/インパルスを選択し、結果を計算して、最適なものを選択します。衝突が多すぎてボールがポケットに入る場合、いくつかの「トリッキーな」ケースを排除できます。また、単純化するために、各移動のシミュレーション時間を制限できます(つまり、すべてのボールが停止するまで待たずに、最初のT秒を計算するだけです)。

このようにして、異なるレベルのコンピュータープレーヤーを作成できます。つまり、N(およびT)が高いほど、プレイレベルが高くなります。

于 2010-05-10T01:16:18.643 に答える
5

ビリヤードのゲームに応じて、通常2つのタスクがあります

テーブルの状況を評価します(可能なショットを取得します)

  • 完璧なシナリオ(完璧な狙い、完璧なショット)では、すべての可能なショットは同じように難しく、1つのボールへの直接ショットのみを検討する場合、分析する必要があるのは最大6ホールxnボールの状況です(単純なカノンの分析-2つのボールを打つ)追加のn^2ボールx6ホールの状況のみが必要です)。これらの状況のそれぞれについて、可能かどうかを確認するには、単純な分析が必要です(非常に現実的な衝突シミュレーションを行っている場合を除く)。したがって、非常に単純なシミュレーションでは、考えられるすべての状況を構築してランク付けすることをお勧めします。バンクからのショットを分析するには、ボールとホールをミラーリングすることをお勧めします。

  • あるいは、考えられる状況を列挙する際に、テーブルのラインスキャンを実行して、ショットに対して違法な領域をマークし、次のような潜在的なショットを列挙して構築することができます...

angle1、ball1、pocket2
angle2、ball1、pocket3
angle3、ball1、ball2、pocket1 angle4、cusfion2、
ball2、pocket1

  • 不完全さをシミュレートしたいより良いAIの場合、たとえば、ショットはあるポイントx(直接ヒットから離れた角度として定義される可能性があります)でボールを打つことによって再生されます。 dxの悪いヒット、または何か)-これにより、ボールの方向にエラーが発生し、ポケットまでの距離とともに増加します。これにより、ショットを難易度でランク付けする1つの方法が得られます。つまり、照準/ショットのエラーに関するショットの感度です(一部のショットは他のショットよりも簡単です)。これは、白からボールまで、およびボールから穴までのパスの長さに依存します。

  • もう1つ注意すべき点は、白いボールが穴に入るリスク、またはその他の違法なショットです。

ショットの選択(難易度だけでなく、潜在的なゲインにも基づいて)

  • 戦略も検討する必要があります(簡単なショットでは、次のラウンドで何も残らない可能性があります)
  • 最初のショットを作成するのがいかに簡単であるかだけでなく、2番目のショットもどれほど難しいか(このために、シミュレートされた状況の評価を再度実行できます。ここでは、方法に応じてプレーヤーを強くしたり弱くしたりできます)彼が先を見越すことができる多くのショット;あなたはまたあなたのプレーヤーに個性を与えることができます-最初に深さ優先または幅優先の解決策を探します)
  • 戦略を選択する際には、難易度の合計が最小のショットの組み合わせを探す必要があります(見逃す可能性を考慮して、後のショットの重要性を評価する必要がある場合があります)
  • ゲームによっては、純粋にポジショナルゲームであるセーフティショットの導入を検討する場合があります。その目的は、ボールをすぐにポケットに入れるのではなく、対戦相手にミスをさせるか、自分の状況を緩和することです(このようなプレーをする場合は他の状況があります)ショットは有益です-たとえば、何も打てないが、いくつかのボールを分割するか、クッションから離す必要がある場合)。この場合、最後から始める必要があります。
  • スピン、リアルな衝突、バウンス、リアルなクッション、キュースリップなど、これらすべてがリアルな物理学でさらに複雑になります。
于 2010-05-10T14:17:24.257 に答える
1

おそらく、ボールを加重グラフとして表示することを検討するかもしれません。あなたは特別なノードとしてポケットに入れることができます。次に、キューボールから特定のボール、そしてポケットまでのパスの重さに応じて、どのボールを置くか、または打つかを選択しました。インパルスの強さは、この重みの値を使用して設定することもできます。次に、物理エンジンを使用して、ショットが可能かどうかを判断できます。私はそのようなことを試したことがないので、すべてが理論的であり、それが実際的であるかどうかはわかりません。また、このような方法では、キューや他のボールが跳ね返る必要がないため、基本的にはストレートショットのみに対応します。

于 2010-05-10T01:00:49.140 に答える
1

私は2つの広いアプローチを考えることができます。

  1. キューボールとフォースレベルを囲むすべての可能なキュー位置のリストを作成し、リストを検索して、ボールを沈めることができる最初のキュー位置を見つけます。これはかなり大きなリストです。少数のフォースレベルを使用し、「明らかに」悪いショットを除外することで、リストをトリミングできます。

  2. 後ろ向きに作業します。テーブル上の各ボールを見て、キューボールをそれに接触させることができるかどうかを確認します。次に、正しいキューの位置と力のレベルを計算して、穴に入れます。これを展開して、ツリーで複数のボールのショットを検索できます。

私はソリューション1が一番好きです。一度に2つ以上のボールを沈めることができる状況を見つけることができます。

于 2010-05-10T00:58:58.297 に答える
0

それはほとんどランダムではないと思います。物理エンジンで、キュー、ボール、バンパー、およびポケットの相互作用をモデル化する必要があります。私にとっては、AIのようではなく、物理学のように感じます。

于 2010-05-10T00:51:07.580 に答える