我开始从事国际象棋的实施工作,在走进兔子洞之前,如果你不介意的话,我想得到社区的意见,因为我已经走到了尽头。我正在努力找出将碎片与坐标相关联的最佳方法。
现在,我有一个列表清单,其中列出了每个列表代表董事会的各个部分。
对于坐标,我使用了这个列表理解
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)]
有关我如何将这件作品与他们的坐标相关联以找到潜在动作的任何强烈想法?我起初在想词典,但是你有多个相同类型的棋子(例如两个骑士),并且不认为这是理想的,因为董事会的演变。
一如既往地谢谢。
答案 0 :(得分:2)
有趣的是,我刚刚开始研究这个!以前,我写过a chess AI但是在 javascript 中,但是今天我一直在将这些代码转换为Python,以便与更大的项目一起使用,因此我的脑海中充满了知识。
最初,在JS版本中,我将board
有效地存储为每个8x8
array
strings
(实际上这是与其他对象内部的对象)像铸造这样的数据,但这并不重要。)
但是,这种在array
中使用list
(reference
)的方法导致了negamax
传递问题的方法。问题是通过move
算法传递板状态意味着要考虑每个array
,整个move
(在JS中)将不得不复制以阻止strings
进入原始董事会状态。
我通过将电路板状态存储为immutable
(我在Python中为lists
)来解决这个问题。我会建议你开始使用board
,因为它们更容易访问和更改值,即使它们可能最终会导致缓慢(从制作它们的副本)后来进行优化
存储character
状态的实际技巧是为每个部分使用一个upper
,并使用lowercase
和white
来表示black
和{ {1}}方面。我从广泛使用的FEN notation
中窃取了这种技术,结果证明对于displaying
和在状态上执行operations
非常有用!
要了解我的意思,您可以使用以下命令初始化起始状态:
state = ["RNBQKBNR", "PPPPPPPP", " ", " ", " ", " ", "pppppppp", "rnbqkbnr"]
state = [list(r) for r in state]
然后您可以使用
轻松创建display
函数
def display(state):
for r in reversed(state):
print(''.join(r))
然后,只要您想显示给定状态,就可以调用display(state)
来提供:
rnbqkbnr
pppppppp
PPPPPPPP
RNBQKBNR
希望这会帮助你!您可以在github
上查看我完全实施国际象棋AI的代码:in Python和in javascript :)
答案 1 :(得分:1)
好的,它是这样的: 你有64个单元格,传统上与字母和数字协调。 将每个单元格命名为数字,以便单元格将协调:" a1"将是11,h5将是85等。
现在采取行动:
你可以理解,我最近自己建立一个(如果你介意的话,基于JS)哈哈。
祝你好运!