如何正确检查国际象棋AI中的castling?

时间:2013-06-17 20:58:40

标签: c algorithm artificial-intelligence chess

我有一个国际象棋AI,它并不总是知道它是否可以城堡。当移动计数器的值等于零时,车和国王有移动计数器,只允许他们参与城堡。当移动计数器为零并且没有任何部件阻挡城堡时会出现问题,但是敌方部件有能力阻挡远处的城堡。

例如,想象一下你是白人,你想制作女王城堡。移动计数器为零,所以你的棋子零移动,你的白骑士,主教和女王都不见了。你认为你可以城堡。但实际上你不能骑行,因为有一个敌人的车辆有一条清晰的攻击线,一直延伸到第一排,你有白车和白王。如果你被阉割,国王将不得不越过黑车的攻击线。你是AI,这种情况搞砸了你。

现在你[人类]可能知道一种方法可以让你(人工智能)在铸造方面变得更聪明。作为一名程序员,你将如何解决这个问题,以免人工智能不再犯这个错误?

以下是一些更多信息...... 我的董事会代表是董事会[8] [8]。我有一个数组,包含所有可能的白色碎片[最多2个皇后,总共17个],int whitePieces [17],以及包含所有可能的黑色碎片的数组,int blackPieces [17]。此外,为了跟踪移动,有一个moveTo []数组和一个moveFrom []数组,它包含每个移动块移动后移动之前的每个移动块的副本。片段整数的最右边位是y值,而4位十六进制值就是x值。整数部分还包含表示片段类型,片段颜色,whitePieces数组中的片段位置或blackPieces数组的字节数据,以及用于跟踪移动次数的移动计数器,用于确定是否为国王或车已经移动,因此不能城堡。

2 个答案:

答案 0 :(得分:3)

你的AI应该有某种0层“威胁网格”,它可以显示每个敌人下一回合的位置。使用此信息可以查看国王和 rook(s)之间的方格是否已被占用或受到威胁。

答案 1 :(得分:1)

很久以前就有同样的问题(1978年 - 在fortran)。

除了你们所有准备好提到的测试之外(选择了车移动,有王移动,他们之间的排是空的)你需要保险:

  

The king is not currently in check.

使用确定国王是否受到检查的代码,可以使用相同的代码来查看国王是否会检查2个感兴趣的方格。所以“假装”移动国王,每次移动1个空间2个空格(或右边)并进行测试。

其他2个迂腐的想法:
当车被“移动”时设置的标志也需要设置是车被采取。测试看车是否在拐角处是不够的,因为它可能是另一个车。

一个被提升为车辆但未被移动的棋子不能用于铸造。 castling on a file


注意:
而不是17件,考虑留在16(你可以有0-9个皇后,0-10个车,0-10个主教,0-8个棋子,1公斤等)。

车辆所经过或通过的空间可能会受到另一方的威胁。