如何正确检查国际象棋AI中的王位易位?

问题描述 投票:0回答:2

我有一个国际象棋人工智能,它并不总是知道它是否可以城堡。车和王都有移动计数器,只有当移动计数器的值为零时才允许他们参与城堡。当移动计数器为零且没有棋子阻挡城堡,但敌方棋子有能力从远处阻挡城堡时,就会出现问题。

例如,假设您是白人,并且想要建造一座皇后侧城堡。移动计数器为零,因此您的棋子移动为零,您的白马、主教和后都消失了。你认为你可以城堡。但你实际上无法城堡,因为有一个敌人的车,其攻击线清晰,一直延伸到第一排,在那里你有你的白车和白王。如果你攻城略地,国王就必须越过黑车的攻击线。你是人工智能,这种情况让你陷入困境。

现在你[人类]可能知道一种让你[人工智能]在易位方面更聪明的方法。作为一名程序员,你会如何解决这个问题,让人工智能不再犯这个错误?

这里有更多信息... 我的董事会代表是 int board[8][8]。我有一个包含所有可能的白色棋子的数组 [最多 2 个皇后,总共 17 个棋子],int whitePieces[17],以及包含所有可能的黑色棋子的数组,int blackPieces[17]。此外,为了跟踪移动,还有一个 moveTo[] 数组和一个 moveFrom[] 数组,其中每个层都包含移动件移动之后和移动之前的副本。该整数的最右边位是 y 值,其上一位的 4 位十六进制值是 x 值。整数棋子还包含表示棋子类型、棋子颜色、whitePieces 数组或 blackPieces 数组中棋子位置的字节数据,以及跟踪移动次数并用于确定是王还是车的移动计数器已移动,因此无法城堡。

c algorithm artificial-intelligence chess
2个回答
4
投票

你的人工智能应该有某种 0 层“威胁网格”,显示每个敌方棋子下一回合可以移动的位置。使用此信息查看国王和最终的易位位置之间的方格是否已被占领或受到威胁。


3
投票

很久以前就遇到过同样的问题(1978 - 在 fortran 中)。

除了您已经提到的所有测试(已选择车移动,已移动国王,它们之间的行是否为空)之外,您还需要确保:

国王目前不受控制。

通过确定国王是否受制的代码,可以使用相同的代码来查看国王在感兴趣的 2 个方格中是否受制。因此,“假装”移动国王,一次移动 1 个空格,向左(或向右)移动 2 个空格,然后运行测试。

其他2个迂腐的想法:
当车被“移动”时设置的标志也需要在车被占领时设置。测试是否有车位于角落是不够的,因为它可能是另一辆车。

升为车后未移动的兵不能用于易车。 文件上的易位


备注:
不要选择 17 颗,而是考虑保留 16 颗。(您可以有 0-9 个皇后、0-10 个车、0-10 个象、0-8 个兵、1 公斤等)

车所在或经过的空间可能会受到另一侧的威胁。 (其他颜色)

© www.soinside.com 2019 - 2024. All rights reserved.