1

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

例如,假设你是白人,你想建造一座王后城堡。移动计数器为零,所以你的棋子移动为零,你的白马、主教和王后不见了。你认为你可以城堡。但你实际上不能城堡,因为有一个敌方车有一个清晰的攻击线,一直延伸到你有白车和白王的第一排。如果你城堡,国王将不得不越过黑车的攻击线。你是人工智能,这种情况把你搞砸了。

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

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

4

2 回答 2

3

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

于 2013-06-17T21:07:50.673 回答
2

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

除了你们都准备好提到的测试(选择车移动,国王移动,它们之间的行是空的),你需要确保:

国王目前不在检查范围内。

使用确定国王是否在检查中的代码,可以使用相同的代码查看国王是否在 2 个感兴趣的方格中检查。所以“假装”移动国王,一次移动 1 个空间,向左(或向右)移动 2 个空间并运行测试。

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

升级为车然后未移动的棋子不能用于易位。 在文件上铸造


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

车所在或经过的空间可能会受到另一侧的威胁。

于 2013-11-02T09:03:16.197 回答