C# と XNA を使用して抽象的な戦略ゲームをコーディングしています。AI に関しては、現在ネガスカウトと深さ 5 を使用しています。ゲームの説明は次のとおりです。
このゲームは、6x7 の六角形の場所のボード、42 の六角形のタイル、各プレーヤー (最大 2 プレーヤー) の 6 個のピース (キング 1 個とポーン 5 個) で構成されます。
ゲームの最初の段階で、プレイヤーはボードの空いている場所にランダムなタイルを交互に配置します。各タイルには、端を指す最大 6 つの矢印を付けることができます。一部の矢印は、2 方向を指すことができます。矢印は、そのタイルからの移動方向を意味します。二重矢印は、有効な場所がある場合、駒を 2 つの場所に移動/ジャンプさせます。ボード上にまだ空の場所が残っている場合、プレイヤーは対戦相手の列にタイルを配置することはできません。
このフェイズが完了すると、次のプレイヤーが自分のキングを自分に最も近い列の 6 つのタイルのいずれかに置きます。次に、駒の移動が始まります。駒はタイルの矢印に従って移動します。キングを捕まえるかブロックすることでゲームに勝利します。
では、わざ生成関数に移りましょう。
タイル配置段階 a) 最も近い列にタイルを配置します。最適な回転を見つけるために、タイルが回転されます。b) 一番近い列がいっぱいになったら、四方を囲まれた空いている場所にタイルを置きます (つまり、ボードの端はありません)。タイルを回転させて、最適な回転を見つけます。c) 場所が見つからない場合は、残りの空の場所をすべて追加し、最適な回転を見つけようとします。
キング配置段階 a) 最高のタイルがある場所を見つけ、そこにキングを配置します。b) 残りのポーンを列の残りの空いている場所に置きます。
移動ステージ a) キングが攻撃された場合、その駒が防御されていない場合は、攻撃している駒を攻撃しようとします。b) 攻撃されているすべてのプレイヤーの駒に移動を追加します。c) プレイヤーが攻撃できるすべての対戦相手の駒を追加します。d) プレイヤーが移動できるすべての場所を追加します。
次に評価関数です。
タイル配置段階のスコア = 現在のプレーヤーがこれまでに配置したタイルの数 + 現在のプレーヤーの最も近い列のタイル - なし。対戦相手がこれまでに配置したタイルの数 - 最も遠い行 (対戦相手に最も近い) にある対戦相手のタイル。
キングプレイスメントステージスコア=最も近い列にある現在のプレーヤーのタイル-最も遠い列にある対戦相手のタイル(対戦相手に最も近い)。
移動ステージスコア=手番プレイヤーの駒の価値-相手の駒の価値。
タイルの重み付けは、矢印が指している有効な場所ごとに 100 です。パーツの重み付けは次のとおりです。
ピースの値 = ピースの種類 (キング = 10000、ポーン = 1000) + 機動性 + 防御 - 攻撃 - 包囲 - ブロック
ここで、可動性 = いいえ。ノードが移動できる場所の数 (空いているか対戦相手が占有している) * 1000 防御 = いいえ。この場所に実際に移動できる、このピースを囲む現在のプレイヤー ピースの数 * 攻撃された 1000 = いいえ。実際にこの場所に移動できる、このピースを囲む対戦相手のピースの数 * 1000 ブロック = (キング = -10000、ポーン = -1000) ピースは移動できません。すべての矢印が無効な場所を指しており、ピースがこのゲームで再び移動する可能性がないためです.
かなり長いですが、ここに私の問題があります:
タイルを配置するとき、AI は間違った回転を使用してタイルを配置することがあります (つまり、矢印が有効な場所を指していない場所にタイルを配置します)。時々、これは彼の「ホーム」列で発生します。
ピースを動かすとき、AI はキングの安全性を無視しています。主にキングを動かし、4~6手で攻略。
特にチェス AI の経験を持つ人で、AI、特に手の生成と評価機能を改善する方法についてアイデアや提案がありますか?
ありがとうイヴァン
ところで...メールを試すことに興味がある人がいたら、私に知らせてください。私のウェブサイトにセットアップをアップロードします。