Algorithm 国际象棋-防止检查时避免无限递归

Algorithm 国际象棋-防止检查时避免无限递归,algorithm,recursion,artificial-intelligence,game-engine,chess,Algorithm,Recursion,Artificial Intelligence,Game Engine,Chess,我有一个如下的算法来防止玩家选择一个使其处于检查状态的移动: 假动作(通过复制线路板并在复制的线路板上工作) 在移动被伪造后获得所有合法对手移动 如果其中一个合法招式可以攻击玩家的国王,则无法选择最初伪造的招式 但是,在第2步(粗体),程序必须检查其他玩家所做的任何事情都不会使其他玩家进入检查状态。这将创建一个无限递归,我不确定如何从算法上避免。对于这种情况,人们有什么建议?如果玩家的棋子可以移动到对手的国王的牢房中,则可以定义另一个返回true的函数,否则返回false 现在,当你假装移动时,

我有一个如下的算法来防止玩家选择一个使其处于检查状态的移动:

  • 假动作(通过复制线路板并在复制的线路板上工作)
  • 在移动被伪造后获得所有合法对手移动
  • 如果其中一个合法招式可以攻击玩家的国王,则无法选择最初伪造的招式

  • 但是,在第2步(粗体),程序必须检查其他玩家所做的任何事情都不会使其他玩家进入检查状态。这将创建一个无限递归,我不确定如何从算法上避免。对于这种情况,人们有什么建议?

    如果玩家的棋子可以移动到对手的国王的牢房中,则可以定义另一个返回
    true
    的函数,否则返回
    false


    现在,当你假装移动时,为对手调用此函数。

    “程序必须检查其他玩家所做的任何事情都不会使其他玩家进入检查状态”否。在这种情况下,程序不应检查此情况。1.Ke2是不合法的,即使黑人不能移动他们的车。为什么不合法?既然布莱克不能做任何事情来夺走国王,这难道不应该受到限制吗?不,国际棋联公布的官方国际象棋规则在第3.9段中明确地解决了这种情况。在尝试实现国际象棋引擎之前,您应该阅读规则。显然不是主要来源,但仍然是:“一个无法移动的棋子,因为它会将自己的王置于检查中(它被固定在自己的王上),可能仍然会将检查传递给对手。”你可以将maxDepth参数添加到你的递归函数中,在你希望它一直运行到基本条件的地方给它0,或者N在N次递归调用后强制它停止&除非它并行运行,否则您可以将板副本从父级传递给子级,并将枚举的移动应用到递归函数中。但我们不需要检查对手是否不会将自己置于检查中吗?确定第一个玩家的棋子是否真的在检查中?也许我误解了检查的定义/什么是重要的,什么是不重要的…但是为了获得合法的移动,我们必须防止检查…这就是我的递归循环发生的地方。在一次假移动之后,你不需要验证对手的国王是否受到威胁。如果对手可以直接攻击国王,那么国王是否处于危险中并不重要,因为它会击倒国王,游戏就结束了。因此,这个功能的合法移动仅仅意味着它是否可以移动到国王的牢房。