1

キャスティングできるかどうかが常にわからないチェス AI があります。ルークとキングには移動カウンターがあり、移動カウンターの値がゼロの場合にのみ城に参加できます。移動カウンターがゼロで、城を塞いでいる駒がないのに、敵の駒が遠くから城を塞ぐ能力を持っている場合に問題が発生します。

たとえば、あなたが白人で、女王側の城を作りたいと想像してみてください。移動カウンターが 0 であるため、あなたの駒は 0 回の移動を行い、ホワイト ナイト、ビショップ、クイーンはなくなりました。あなたはキャスティングできると思います。しかし、白のルークと白の王がいる最初の列まで伸びる明確な攻撃線を持つ敵のルークがあるため、実際にはキャスティングできません。キャスリングした場合、王は黒ルークの攻撃線を越えなければなりません。あなたはAIであり、この状況はあなたを台無しにしました。

これで、あなた [人間] は、キャスリングに関して [AI] をより賢くする方法を知っているかもしれません。プログラマーとして、AI がこの間違いを犯さないように、この問題をどのように修正しますか?

ここにいくつかの詳細情報があります... 私のボード表現は int board[8][8] です。可能なすべての白いピース [最大 2 つのクイーン、合計 17 ピース] を保持する配列、int whitePieces[17]、およびすべての可能な黒いピースを保持する配列 int blackPieces[17] があります。また、動きを追跡するために、moveTo[] 配列と moveFrom[] 配列があり、各層について、移動後と移動前の移動ピースのコピーが含まれています。ピース整数の右端のビットが y 値で、その 1 つ上にある 4 ビットの 16 進数値が x 値です。整数ピースには、ピースの種類、ピースの色、whitePieces 配列または blackPieces 配列内のピースの位置を表すバイト データ、および移動回数を追跡し、キングまたはルークかどうかを判断するために使用される移動カウンターも含まれます。が移動したため、キャスティングできません。

4

2 に答える 2

3

AI には、すべての敵の駒が次のターンに移動できる場所を示す、ある種の 0 層の「脅威グリッド」が必要です。この情報を使用して、最終的なキャスティング場所であるキングとルークの間のマスが占有されているか、脅威にさらされているかを確認します。

于 2013-06-17T21:07:50.673 に答える
2

ずっと前に同じ問題がありました(1978年-fortranで)。

すでに述べたテスト (選択したルークが移動した、キングが移動した、それらの間の行が空である) とは別に、次のことを確認する必要があります。

キングは現在チェックされていません。

キングがチェックされているかどうかを決定するコードを使用すると、同じコードを使用して、対象の 2 つのマス目でキングがチェックされているかどうかを確認できます。したがって、キングを「ふり」、一度に 1 スペースずつ左 (または右) に 2 スペース移動し、テストを実行します。

他の 2 つの衒学的な考え:
ルークが「移動」されたときに設定されるフラグも、ルークが取得されたときに設定する必要があります。ルークがコーナーにいるかどうかをテストするだけでは、別のルークである可能性があるため十分ではありません。

ルークに昇格した後、移動していないポーンはキャスリングに使用できません。 ファイルのキャスリング


注:
17 ピースではなく、16 ピースを維持することを検討してください。

ルークがいる、または通過するスペースは、反対側から脅かされる可能性があります。

于 2013-11-02T09:03:16.197 に答える