给定一个使用魔法位板构建的国际象棋应用程序,我如何检查将死?

问题描述 投票:0回答:2

好的,我有这个用位板构建的国际象棋应用程序,我想检查给定的一步棋是否将敌棋子将死。

验证检查情况很容易。您构建敌方棋子攻击的位掩码,然后使用对面国王的位掩码

AND
,如果结果不为零,则您有一个检查。

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

chess bitboard
2个回答
3
投票

我认为没有其他办法。对我来说,最终的算法如下:

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

  • 0
    投票

    我将每种类型的棋子放在国王所在的位置,并从那里获取它的走法。如果它的动作碰到了同类型的敌方棋子,我知道它会制止王。知道哪个棋子正在攻击对于其他功能也很有用。

    © www.soinside.com 2019 - 2024. All rights reserved.