2017-04-11 5 views
0

私は問題を抱えて頭を抱えていました。 私は現在、Javaでビットボードベースのチェスエンジンを書いています。これまでのところ、すべてのポーン/キング/ナイトの動きは、期待どおりにバグなく動作します。チェスエンジンのスライディングピースの生成

私が理解するのに必要なのは、スライディングピースの動きの生成です。私は各正方形/ピースの空のボードの動きの配列を生成しました。私の現在の理解から、私はまた、各正方形上の各可能な占有を含むアレイを開発する必要があります - そして、何とかいろいろな方法に基づいてその配列を調べます。

この考え方は正しいですか?それは0から2までのすべての数をピッキングすることですか?63そしてその四角形の移動ビットボードでxor'ingし、それをある方法(魔法/回転ビットボード)で保存して配列を初期化し、同じ方法でそれにアクセスしますランタイム?

擬似コードと説明は非常に高く評価されています。 (私は>>>を使っています)。

答えて

3

パフォーマンスと複雑さが変化するビットボードのスライドピースの移動を生成する方法は多数あります。それらの多くはhereと記載されています。

恐らく最も速く最も一般的なものはmagic bitboardsであり、魔法の事前計算値を持つビットボードの乗算を使用して、4方向すべての動きを一度に生成します。欠点は、非常に大きなルックアップテーブルを使用することです。これはもっと複雑なので、おそらく最初の実装ではありません。

およびhyperbola quintessenceは、マジックビットボードよりはるかに低速ではありませんが、実装は簡単です。

ルックアップテーブルを必要とせずに、すべての可能な方向にループであるdumb7fillがさらに簡単で低速です。

+0

ありがとうございますが、マジックビットボードを使用しても、マジックナンバーを使用してルックアップテーブルを正確に参照しています。私の質問は、そのルックアップテーブルを生成する方法です。私はちょうど理解していない限り。 – thePanthurr

+0

@thePanthurrあなたの質問は、同じルックアップテーブルがどのスライディングピース方法にも使用されると思われるように見えます。しかし、彼らはすべて異なるルックアップテーブルが必要です。それらの一部(例えば、マジックビットボード)は、複数のルックアップテーブルを使用します。どの方法を使いたいのかを決め、それについて読んで、理解していないことを具体的に尋ねるべきです。 – interjay

+0

@thePanthurr自分でテーブルを生成する必要はありません。 – SmallChess