【问题标题】:Chess - Avoiding Infinite Recursion when Preventing Check国际象棋 - 防止检查时避免无限递归
【发布时间】:2017-11-14 09:45:09
【问题描述】:

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

  1. 假动作(通过复制棋盘并在复制的棋盘上工作)
  2. 获取所有合法的对手移动,在移动被伪造之后。
  3. 如果其中一个合法棋步可以攻击玩家的国王,则无法选择最初伪造的棋步。

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

【问题讨论】:

  • "程序必须检查其他玩家所做的任何事情都不会将其他玩家移动到检查中" 不,在这种情况下程序不应该检查这种情况。 Case in point 1.Ke2 不合法,即使黑方不能移动他们的车。
  • 为什么不合法?既然黑不能做任何事情来夺取国王,那它不会被制止吗?
  • 不,国际棋联发布的官方国际象棋规则在第 3.9 段中明确解决了这种情况。在尝试实现国际象棋引擎之前,您应该阅读规则。
  • wikipedia rules of chess 显然不是主要来源,但仍然:“一块无法移动,因为它会阻止自己的国王(它被固定在自己的国王身上)可能仍然将支票交给对方玩家。”
  • 您可以将 maxDepth 参数添加到您的递归函数中,在您希望它一直运行到基本条件的位置将其设为 0,或者在 N 次递归调用后强制它停止,& 除非它并行运行,您可以将板副本从父到子传递以及枚举的移动以在递归函数中应用。

标签: algorithm recursion artificial-intelligence game-engine chess


【解决方案1】:

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

现在当你假动作时为对手调用这个函数。

【讨论】:

  • 但是我们不需要检查对手不会让自己进入检查吗?要确定第一个玩家的棋子是否真的在检查中?也许我误解了检查的定义/什么重要和不重要......
  • 但是为了获得合法的移动,我们必须防止检查......这就是我的递归循环发生的地方
  • 假动作后,不需要验证对方的王是否有威胁。如果对手可以直接攻击国王,那么他的国王是否有危险都无所谓,因为它会击倒国王,比赛就结束了。因此,此功能中的合法移动仅意味着它是否可以移动到国王的牢房。
猜你喜欢
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
相关资源
最近更新 更多