Python 国际象棋实现

标签 python artificial-intelligence

我正在开始研究国际象棋的实现,在深入研究之前,如果您不介意的话,我想获得社区的意见,因为我已经陷入了死胡同。我正在努力找出将各个部分与坐标关联起来的最佳方法。

现在,我有一个列表列表,其中包含各个部分,其中每个列表代表一个板。

对于坐标,我使用了这个列表理解

coordinates = [[(i,j) for i in range(0,8)] for j in range(0,8)]

这给了我一个像这样的表格

[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0)]
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)]
[(0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2), (7, 2)]
[(0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (5, 3), (6, 3), (7, 3)]
[(0, 4), (1, 4), (2, 4), (3, 4), (4, 4), (5, 4), (6, 4), (7, 4)]
[(0, 5), (1, 5), (2, 5), (3, 5), (4, 5), (5, 5), (6, 5), (7, 5)]
[(0, 6), (1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 6), (7, 6)]
[(0, 7), (1, 7), (2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (7, 7)]

关于如何将棋子与其坐标关联起来以找到潜在的 Action ,有什么强烈的想法吗?我一开始在考虑字典,但你有多个相同类型的棋子(例如两个骑士),并且随着棋盘的发展,这并不理想。

一如既往地感谢。

最佳答案

有趣的是,我刚刚一直在研究这个!之前,我写过a chess AI但是在 javascript 中,今天我已将该代码转换为 Python,以便在更大的项目中使用,因此这些知识在我的脑海中是新鲜的。

最初,在 JS 版本中,我将 board 有效地存储为 8x8 array of strings每个部分(实际上这是在一个带有其他数据(例如王位)的对象内部,但这并不重要)。

但是,这种使用数组(Python 中的列表)的方法会由于通过引用传递它们的方式而导致问题。问题在于,通过 negamax 算法传递棋盘状态意味着对于要考虑的每个移动,整个数组(在 JS 中)必须复制才能停止移动到原始棋盘状态。

我通过将棋盘状态存储为字符串来解决这个问题,这些字符串在Python中是不可变的。我建议您开始使用列表,因为它们更容易访问和更改值,尽管它们最终可能会导致速度缓慢(通过复制它们)。来优化。

存储棋盘状态的实际技巧是为每一 block 使用一个字符并使用大写小写 代表白色黑色 面。我从广泛使用的FEN notation中窃取了这个技术事实证明,它对于在板上显示和执行操作状态都非常有用!

要明白我的意思,您可以使用以下命令初始化起始状态:

state = ["RNBQKBNR", "PPPPPPPP", "        ", "        ", "        ", "        ", "pppppppp", "rnbqkbnr"]
state = [list(r) for r in state]

然后您可以轻松地创建一个显示函数:

def display(state):
   for r in reversed(state):
      print(''.join(r))

然后每当你想显示给定的状态时,你可以调用 display(state) ,它会给出:

rnbqkbnr
pppppppp




PPPPPPPP
RNBQKBNR

希望这对您有帮助!您可以在 github 上查看我完整实现国际象棋 AI 的代码:in Pythonin javascript :)

关于Python 国际象棋实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46736108/

相关文章:

python - 将字符串(Json 数组)转换为列表

python - 使用 2 for 循环列出理解行为

artificial-intelligence - 您能否提供一些与 AI 相关的主题想法,以便在项目中使用?

algorithm - 关于算法的一点提示

android - 自动滚动以重新定位键盘上方的文本输入

Python 导入错误 : cannot import name __init__.

python - 仅根据分组记录计算 pandas 数据框中的新列

artificial-intelligence - 贝叶斯网络中的变量必须是 bool 值吗?

iphone - 如何在 Cocos2d 中创建 AI?

python - 我无法在 python 中使用遗传算法得到正确答案