给定一个用 magic bitboard 构建的国际象棋应用程序,我如何检查将死?

Given a chess app built with magic bitboard how do I check for checkmate?

好的,我有这个用 bitboard 构建的国际象棋应用程序,我想检查给定的移动是否将对手棋子置于将死状态。

验证支票情况很容易。你建立敌方棋子攻击的位掩码,你AND与对方国王的位掩码,如果结果不为零,你有一个检查。

但是检查队友呢?将死是在检查之后会发生的事情。我的意思是,我移动了一块,应用程序检测到移动产生了一张支票。那我怎么知道这张支票是不是将子呢?我是否必须为对手所有可能的玩法生成所有可能的位板并检查是否有可以将国王从检查中移除的动作?这似乎不切实际。还有别的办法吗?

我觉得没有别的办法了。最终的算法对我来说是这样的:

  • 显然,首先检查通过移动王是否对手可以 运行 远离检查。
  • 检查每个对手的棋子是否为 "forked"(这意味着通过移动它,对手为任何其他检查扫清了道路)。只需 "remove" 它来自董事会,然后查看是否创建了新支票。
  • 如果没有分叉:检查对手是否可以通过移动该棋子来阻止检查条件。这是通过将两个单元格子集相交来完成的:一个是一组单元格,对手的棋子可以在其中移动,另一个是对手的国王和攻击人物之间的 "line",因此,"checks"它。
  • 如果这些子集相交并且通过了第二步中的条件 - 看起来当前情况不是将死。
  • 如果没有不分叉的图形AND可以阻止检查-这种情况将死