3

wxPython の GUI を使用して、動きを検証し、すべてのチェス ルールに従うことができる 2 プレーヤー チェス プログラムを作成しようとしています。

現在、私はデザインを始めており、どのボード表現手法を使用すべきかを考えています。私は最近、明白な 2 次元配列を考えましたが、ルックアップの点でおそらく高速であると思われる0x88 ボード表現について読み、正方形がチェス盤の内側にあるかどうかを論理的にチェックします。しかし、AI を使わずにプログラムを作成すれば、誰かがボードの外にある手を動かしたかどうかを確認する必要はありません。

私が認識していない0x88表現の他の利点はありますか?8x8アプローチまたは0x88のどちらをお勧めしますか? また、最初に 8x8 表現を使用し、後で AI を追加する場合は 0x88 表現を使用するのは簡単でしょうか? ご感想ありがとうございます。

4

4 に答える 4

4

言及されている「標準」のボード表現 (0x88、ビットボードなど) はすべて、極端な最適化を目標としています。具体的には、次の 2 つの領域での極端な最適化です。

  1. 速く進めろ、速ければ速いほど良い
  2. AI を改善するチェス ツリー検索をガイドするためのより優れたツールボックスをプログラマーに提供する

「標準」のボード表現は、チェス プログラムを作成し、オンラインで他の人や他のコンピュータと対戦させる人々のグループ内の「標準」にすぎません。これは明らかにあなたが求めているものではないので、これらの方法を使用することはお勧めしません.

これらの「標準的な」アプローチは、文字通り、ビットをいじるトリックを使用して、あちこちで 1 ~ 2 の CPU サイクルを節約しようとしています。Python を使用しているという事実は、あちこちでいくつかのサイクルを節約することを完全に無意味にします。Python は優れていますが、まったく高速ではありません。

Python は、多くの優れたツールを提供します。それらを使用します。あなたのプログラムは遅くなりますが、それは何も悪いことではありません。遅く「感じる」ことはありません。それがすべてです。私があなただったら絶対に Python を使うでしょうし、Python でこれらのちょっとしたアイデアを使うことを考え直すことはありません。C またはアセンブラーで作成している場合、ビットをいじるのは楽しいものです。Python では無意味です。

于 2012-09-01T02:58:49.027 に答える
1

AI を使用するというあなたの決定が、正方形がチェス盤の内側にあるかどうかのチェックをボードの表現に含めることができるかどうかに関係があるとは思いません。つまり、それがコンピューターであるかプレイヤーであるかに関係なく、無効な正方形を含む動きを検出して適切に処理できることは、基になる表現にとって有利です。

個人的には、ビットボード アプローチを信じています。このアプローチは非常に高速であり (ビット演算に依存しているため)、最新の 64 ビット アーキテクチャに論理的に適合することがわかりました。その上、AI を使用するかどうかに関係なく、表現を再設計する必要がないため、将来性も高くなります。

0x88 と比較すると、すべてのピースが 1 ビットで表されるため、メモリに優しく、ボード上のピースが少ないほど使いやすくなります。メモリは最新のコンピューターで最大の懸念事項ではないかもしれませんが、実際のマイナス面もありません.

ビットボードを使用すると、1 つのビット操作で多くのピースの移動有効性が計算され、残りのトークンについてさらに数回実行するだけで、何百もの移動の可能性 (必要な移動深度を合計) を可能な限り最速の方法で決定できることを意味します。 0x88 あたりでラップが実行されると考えられます。

ビットボード関連のコードに興味がある場合は、私のプロジェクトTHUD を参照してください。(ボードゲームは、プレイルールはチェスとあまり似ていませんが、ボードと駒を表現する方法は完全に似ています。同様に、ビットボードの拡張性を示す AI も設計されており (マルチスレッド化されています)、ビットボードの拡張性を示しています。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-07-20T18:13:17.877 に答える
0

AI を行っていないのであれば、そのようにマイクロ最適化する理由はあまりないことに同意します。

私が提案する 1 つの提案は、8x8 から 0x88 への切り替えを検討している場合 (そして一般的には、良好なコード品質のために)、ボード アクセス ロジックを可能な限り関数に抽象化することです。たとえば、次のように記述して使用します。

getPieceAtLocation(char file, int rank)

そして電話する

Piece p = getPieceAtLocation('e', 2);

またはそれらの線に沿った何か。getPieceAtLocationそうすれば、気が変わった場合でも、ロジックを使用する必要があるすべての場所を変更するのではなく、ロジックを書き直すだけで済みます。

于 2012-07-20T17:40:34.780 に答える
0

また、他の wxPython (または他の) チェス プロジェクトのいくつかをチェックして、アイデアを得る必要があります。

于 2012-07-20T17:47:00.250 に答える