我正在开始研究国际象棋的实现,在深入研究之前,如果您不介意的话,我想获得社区的意见,因为我已经陷入了死胡同。我正在努力找出将各个部分与坐标关联起来的最佳方法。
现在,我有一个列表列表,其中包含各个部分,其中每个列表代表一个板。
对于坐标,我使用了这个列表理解
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 Python和 in javascript :)
关于Python 国际象棋实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46736108/