0

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

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

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

4

1 回答 1

3

我不认为有任何其他方式。对我来说,最终算法看起来像:

  • 显然,首先检查是否通过移动国王,对手可能会逃避检查。
  • 对于每个对手的棋子,检查它是否被“分叉”(这意味着通过移动它,对手为任何其他检查扫清了道路)。只需将其从板上“删除”,然后查看是否创建了新支票。
  • 如果它没有分叉:检查通过移动该棋子是否对手可以阻止检查条件。这是通过交叉两个单元格子集来完成的:一个是一组单元格,对手的棋子可以在其中移动,另一个是对手的国王和攻击的人物之间的“线”,因此“检查”它。
  • 如果这些子集相交并且第二步中的条件通过 - 看起来当前情况不是将死。
  • 如果没有不分叉的图形并且可以阻止检查 - 情况就是将死。

  • 于 2016-08-11T21:46:31.397 回答