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

Chess 给定一个用魔法比特板构建的国际象棋应用程序,我如何检查将死?,chess,bitboard,Chess,Bitboard,好的,我有一个用bitboard构建的国际象棋应用程序,我想检查一个给定的移动是否将对手的棋子将死 验证检查情况很容易。你建立了敌方棋子攻击的位掩码,并且你和用对方国王的位掩码,如果结果不是零,你有一个检查 但是支票伙计呢?将死是在检查之后发生的事情。我的意思是,我移动一块,应用程序检测到移动生成了一张支票。那我怎么知道这张支票是不是支票?我是否必须为对手所有可能的游戏生成所有可能的比特板,并检查是否有可以将国王从检查中移除的移动?这似乎不切实际。还有别的办法吗?我想没有别的办法了。在我看来,最

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

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


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

我想没有别的办法了。在我看来,最终的算法如下所示:
  • 显然,首先要检查移动国王是否会使对手逃避检查
  • 对于每个对手的棋子,检查其是否“分叉”(这意味着通过移动棋子,对手可以为任何其他检查扫清道路)。只需将其从电路板上“移除”,然后查看是否创建了新的检查。
  • 如果它没有分叉:检查通过移动该棋子,对手是否可以阻止检查条件。这是通过相交两个细胞子集来实现的:一个是一组细胞,对手的棋子可以在其中移动,另一个是对手的国王和攻击的人物之间的“线”,因此“检查”它
  • 如果这些子集相交并且第二步中的条件通过-看起来当前情况是而不是将死

  • 如果没有一个人不是叉形的可以阻止检查-情况就是将死。

    我认为没有其他方法。在我看来,最终的算法如下所示:
  • 显然,首先要检查移动国王是否会使对手逃避检查
  • 对于每个对手的棋子,检查其是否“分叉”(这意味着通过移动棋子,对手可以为任何其他检查扫清道路)。只需将其从电路板上“移除”,然后查看是否创建了新的检查。
  • 如果它没有分叉:检查通过移动该棋子,对手是否可以阻止检查条件。这是通过相交两个细胞子集来实现的:一个是一组细胞,对手的棋子可以在其中移动,另一个是对手的国王和攻击的人物之间的“线”,因此“检查”它
  • 如果这些子集相交并且第二步中的条件通过-看起来当前情况是而不是将死


  • 如果没有一个人不是叉形的可以阻止检查-情况就是将死。

    你为什么不认为检查对手所有可能的动作是可行的?这就是将死的定义。一些国际象棋引擎有一个特殊的
    generateCheckEvasion()
    函数,以避免在检查时生成所有移动。因为这将生成数千个移动组合,包括一些与使国王脱离检查无关的棋子。知道函数存在并没有帮助。知道它的作用,会有所帮助。@SpaceDog-不。你只需要在当前位置测试所有的伪合法移动,看看你是否还在检查中。这是一个单层搜索。你为什么不认为检查对手所有可能的动作是可行的?这就是将死的定义。一些国际象棋引擎有一个特殊的
    generateCheckEvasion()
    函数,以避免在检查时生成所有移动。因为这将生成数千个移动组合,包括一些与使国王脱离检查无关的棋子。知道函数存在并没有帮助。知道它的作用,会有所帮助。@SpaceDog-不。你只需要在当前位置测试所有的伪合法移动,看看你是否还在检查中。这是一个单层搜索。你说的“把它从黑板上去掉”是什么意思。。。删除什么?@SpaceDog抱歉这么不清楚。在检查是否有叉子的同时,暂时将棋子从棋盘上取下,看看棋盘上是否有其他棋子在“移除”后攻击国王。对不起,我不明白。@SpaceDog对不起,我混淆了叉子和别针:。正如我所说,你需要检查每个对手棋子上的两个条件:
    1)它是否“被钉住”-棋盘上的棋子,看,如果国王被新棋子击中。一个新的攻击可以通过从棋盘上暂时移除对手的棋子来“打开”。如果国王没有受到新的攻击-这意味着,这个对手的棋子可以移动。只有这样,我们才应该检查我的帖子第三步中描述的情况。谢谢,我会尽量消化你的答案,稍后再回来。你说的“从黑板上删除它”是什么意思。。。删除什么?@SpaceDog抱歉这么不清楚。在检查是否有叉子的同时,暂时将棋子从棋盘上取下,看看棋盘上是否有其他棋子在“移除”后攻击国王。对不起,我不明白。@SpaceDog对不起,我混淆了叉子和别针:。正如我所说,你需要检查每个对手棋子上的两个条件:
    1)它是否“被钉住”-棋盘上的棋子,看,如果国王被新棋子击中。一个新的攻击可以通过从棋盘上暂时移除对手的棋子来“打开”。如果国王没有受到新的攻击-这意味着,这个对手的棋子可以移动。只有这样,我们才应该检查我的帖子第三步中描述的情况。谢谢,我会尽力消化你的答案,稍后再回来。