当前位置: 首页 > 知识库问答 >
问题:

如何在没有循环依赖的情况下检查国际象棋规则?

诸龙野
2023-03-14

我正在用C语言编写一个国际象棋程序。我遇到了一个我可能应该预见到的问题。程序查找所有可能移动的方式是尝试将每个棋子移动到棋盘上的每个方块。执行此操作的函数称为计算器AllPossibleMoves。每一步都通过克隆游戏进行测试,并在被测试的棋子上调用移动。当移动无效时,移动函数将抛出异常。如果没有抛出异常,则该移动有效,并将其添加到可能的移动列表中。

如果一个动作导致你的国王受到控制,则该动作无效。因此,我有一个函数,它使用查找所有可能的移动函数(我们称之为inCheck)来查看对手的棋子是否检查了国王。

问题是,前面提到的mobile函数依赖于inCheck函数来找出移动是否会导致检查。inCheck使用计算器AllPossibleMoves来查找所有可能导致国王的移动。计算器AllPossibleMoves通过使用普通移动函数模拟移动来查找所有可能的移动。此代码永远运行,因为它是相互递归的。

为了修复它,我所做的是通过传入一个整数来引入一个边缘情况。所以当我调用mobile时,它会减少整数并将其传递出去,当再次调用mobile时,它会使用较低的数字调用。这样,无限递归是不可能的。

然而,结果似乎有所不同,当我增加这个数字时,程序需要很长时间才能运行。有没有更干净的方法来解决这个问题?

共有2个答案

翟俊名
2023-03-14

您真正需要的是一个计算器IntersectingMoves函数,它只需检测是否有任何棋子与所讨论的正方形相交的有效移动,并调用它进行检查检测。

如果准确地命名了calculateAllPossibleMoves,那么简单地用它来查看是否有任何碎片可以到达特定的正方形是非常低效的;更糟的是,它导致了你提到的确切的循环。

桑璞
2023-03-14

为什么你没有一个抽象的类ChessPiece,由所有棋子继承,并且在另一个类Game的数组中包含32个这些对象或其他东西,支持类BoardPosition或其他东西。

然后列出所有动作,只需浏览活动(未捕获)的棋子,并在每个循环中浏览它们的动作(大多数是方向数)。如果(1)在方向上没有棋子,目标位置上也没有相同颜色的棋子,并且(2)没有对手的棋子没有被测试的棋子在其可能的移动中有机会在更新的棋盘上捕捉到你的王(因为这就是检查的内容——mate只是意味着你无法避免对手夺取你的王)

 类似资料:
  • 我正在尝试安装一个没有依赖项的python模块。 我跑: 但是这个安装依赖项,任何想法怎么能做到这一点?

  • 我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代

  • 上面的代码显示了一个可以上下移动的部分的示例。这不是一个有效的棋步。所以,如果我要移动一个皇后,我该怎么做呢?我们只是假设我们已经有了一个矩阵(x,y)8×8的板。

  • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。

  • 问题在于,当我通过工件spring-boot-maven-plugin用maven编译服务时,.war文件内部总是有依赖关系。因为我想知道是否有人知道如何配置maven来删除.war文件中的依赖项......穿着春靴。 war随后出现了里面的依赖关系,经过编辑:我已经添加了提供的,就像Michael Potter所说的和执行一样。很好用。我的pom.xml如下: