这是一个关于如何使用魔术位板验证棋子中棋子移动的全局问题。只是为了澄清,我不是在问魔术位板在内部如何工作。

现在,有关该问题的更多详细信息。我正在使用位板编写国际象棋棋盘表示,我想使用魔术位板来验证滑块的移动。有人可以列出实现该目标的主要步骤吗?例如,请考虑以下电路板位置:

假设我们已经初始化并准备使用所有魔术位板功能和数据结构。因此,仅使用魔术位板的功能签名,您是否可以列出步骤(伪代码或任何语言)来验证g3上的白鸦的给定举动?

最佳答案

可以假定魔术位板功能可用是很好的,但是一般来说,位板移动生成功能可以接受任何产生位板的技术,该技术可以给出可能的平方。假设RookMoves是这样的函数,那么您将如下所示填充移动列表:

UInt64 pieceBitboard = Bitboard[SideToMove | Piece.Rook];
UInt64 targetBitboard = ~Bitboard[SideToMove | Piece.All];

while (pieceBitboard != 0) {
   Int32 from = Bit.Pop(ref pieceBitboard);
   UInt64 moveBitboard = targetBitboard & RookMoves(from, OccupiedBitboard);

   while (moveBitboard != 0) {
       Int32 to = Bit.Pop(ref moveBitboard);
       moveList[index++] = Move.Create(this, from, to);
   }
}

其中Bit.Pop(ref x)返回x中的最低有效位,同时将其从x中“弹出”(删除)。

为了验证移动(我将其解释为确认移动有效性),您可以检查该移动是否在移动列表中,或者执行移动并查看它是否使您处于检查状态。当然,您可能需要检查它是否遵守该作品的运动规则,但这是微不足道的。
if ((RookRays[move.From] & Bit.At[move.To]) == 0)
   return false;

Int32 side = SideToMove;
position.Make(move);
Boolean valid = position.InCheck(side);
position.Unmake(move);

return valid;

关于chess - 使用魔术位板滑动移动生成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16925204/

10-12 21:37