我目前正在我的国际象棋引擎中添加置换表,但我在增量更新Zobrist键方面遇到了问题。 我进行了一些研究并实现了基本思想,但它的行为不像我期望的那样。 我遇到的问题是等效的局面不总是具有相同的键。 例如,在起始位置中,如果两个玩家都只移动马并将其移回,则键将与起始位置的键不同。 然而,再次执行此操作(移动马)并返回到起始位置会导致原始键。 因此,对于每个玩家,这种序列的周期似乎为4个移动,当它应该只是2个时。
是否有人遇到过这样的问题或可以想出解决办法? 我已经包括了我的make / unmake方法的相关部分。 我不包括变动方,易位权利等; 它们不应影响我提出的特定情况。 HashValue存储随机值,其中第一个索引是棋子类型,第二个索引是方格。
是否有人遇到过这样的问题或可以想出解决办法? 我已经包括了我的make / unmake方法的相关部分。 我不包括变动方,易位权利等; 它们不应影响我提出的特定情况。 HashValue存储随机值,其中第一个索引是棋子类型,第二个索引是方格。
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
}