2012-03-23 5 views
3

私はマジックビットボードで動作するように書いたチェスエンジンを書き直しています。私は書かれた魔法の機能を持っていて、彼らはその部分の四角形と占有のビットボードをパラメータとして取ります。私が自分自身で議論しているのは、これらのボード表現スキームのどちらが速く/より実用的であるかです。マジックビットボードムーブジェネレーションシステムの最も実用的なボード表現は何ですか?

スキーム1:作品の種類ごとに1枚、白い騎士1枚、黒人のルーク1枚があります。 。 。移動を生成して移動スタックにプッシュするには、それらをシリアル化してピースの四角形を見つけてから、魔法の関数を呼び出す必要があります。それから私は、その移動のビットボードをシリアル化し、それらを押す必要があります。利点は、攻撃側と占有側のビットボードが近くにあることです。

スキーム2:単純なピース中心の配列[2] [16]または[32]は、ピースの正方形のインデックスを含みます。関数の単純なループスルーと呼び出しは、移動するビットボードに必要なすべてです。私はこれらのビットボードをシリアル化し、それらを移動スタックにプッシュします。私はまた、占有のビットボードを維持する必要があります。私は攻撃のビットボードを得ることは違ってはいけないと思う:私はもう一度すべての移動ビットボードを生成しなければならず、それらを直列化するのではなく、ビットマジックのマッシュアップでそれらを操作する。

私はスキーム2に傾いていますが、何らかの理由でスキーム1と同様の実装が標準であると思います。私は何らかの理由で実際にビットボードを使わずに「ビットボード」エンジンを作るという欠点を見つけることはできません。キングとナイトのデータ用のビットボードを使っていなくても、素早く配列を検索できます。

私は、このボード表現を行うより良い方法があるのか​​どうかをよりよく知っていると思います。各タイプのビットボードを標準にしておくことが標準的です(多分回転したビットボードでのみ必要です)。私はビットボードエンジンには比較的新しいですが、私は多くを読んでおり、私は魔法を実装しました。私は確かに作品の中心的な配列のアプローチが好きです - それは画面にボードを簡単に印刷するような任意のものがたくさんありますが、より良い/等しい/より標準的な方法がある場合、誰かがそれを指摘してくださいことができますか?事前に感謝 - 私はこれは非常に具体的な質問で、あなたがチェスのプログラミングに精通していない限り、答えにくいことを知っています。

直前の質問:2次元配列へのルックアップのスピードは、1D配列を使用し、16 * team_sideを通常のインデックスに追加してピースをルックアップするまでですか?

編集:私は、私がチェスの実装のほとんどすべてのスピードを重視していると付け加えたいと思いました。なぜ私はスライドデータを持つ単純な配列とは対照的に、マジックビットボードを使うのでしょうか?

答えて

1

これには標準的な回答はありません。申し訳ありません。

必要なデータ構造の数とタイプは、正確にプログラムで何をしたいかによって決まります。例えば、ボード上に複数の作品を表現すると、いくつかの操作が高速になります。一方、移動ごとにデータを更新するには、より多くの時間がかかります。

プログラムで最も効果的なものを見つけることはあなたの仕事です。余分な配列を維持すると、プログラムのネットスピードアップにつながるのでしょうか?場合によります!

データ構造を維持するのが正味の利益であることがあります。計算を遅らせて結果をキャッシュすることがあります。必要に応じて計算することもあります。

関連する問題