3

現在、チェスエンジンに転置テーブルを追加していますが、ゾブリストキーの増分更新で問題が発生しています。私はいくつかの調査を行い、基本的なアイデアを実装しましたが、期待どおりに動作していません。私が遭遇した問題は、同等のボード位置が常に同じキーを持っているとは限らないということでした。たとえば、開始位置で、両方のプレイヤーが騎士を動かしてから元に戻した場合、キーは開始位置のキーとは異なります。ただし、これを再度実行して(騎士を移動して)開始位置に戻ると、元のキーになります。したがって、このようなシーケンスの期間は、プレーヤーごとに4ムーブであるように見えますが、2ムーブである必要があります。

誰かがそのような問題に遭遇したか、解決策を考えることができますか?make/unmakeメソッドの関連部分を含めました。サイドツームーブ、キャスリングの権利などは含まれていません。それらは私が提起した特定のケースに影響を与えるべきではありません。HashValueはランダムな値を格納します。最初のインデックスはピースタイプで、2番目は正方形です。

void Make(Move m) {
    ZobristKey ^= HashValue[Piece[m.From].Type][m.From];
    ZobristKey ^= HashValue[Piece[m.From].Type][m.To];
    ZobristKey ^= HashValue[Piece[m.To].Type][m.To];
    //rest of make move
}

void Unmake(Move m) {
    ZobristKey ^= HashValue[m.Captured.Type][m.To];
    ZobristKey ^= HashValue[Element[m.To].Type][m.To];
    ZobristKey ^= HashValue[Element[m.To].Type][m.From];
    //rest of unmake
}
4

1 に答える 1

3
Make_a_move() {
    hashval ^= Zobrist_array[oldpos][piece];
    hashval ^= Zobrist_array[newpos][piece];
    /* if there is a capture */
    hashval ^= Zobrist_array[otherpos][otherpiece];
    }

Undo_a_move() {
    hashval ^= Zobrist_array[oldpos][piece];
    hashval ^= Zobrist_array[newpos][piece];
    /* if there was a capture */
    hashval ^= Zobrist_array[otherpos][otherpiece];
    }

キャスリングは、2 つの動きの合計と見なすことができます (もちろん、キャプチャなし)。

昇格は、ポーンをボードから (2 または 7 の位置から) 取り除き、新しい駒を (1 または 8 の位置に) 追加することとして扱うことができます。

于 2012-04-09T00:21:10.457 に答える