Python国际象棋实施

时间:2017-10-13 18:35:30

标签: 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)]

有关我如何将这件作品与他们的坐标相关联以找到潜在动作的任何强烈想法?我起初在想词典,但是你有多个相同类型的棋子(例如两个骑士),并且不认为这是理想的,因为董事会的演变。

一如既往地谢谢。

2 个答案:

答案 0 :(得分:2)

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

最初,在JS版本中,我将board有效地存储为每个8x8 array strings(实际上这是与其他对象内部的对象)像铸造这样的数据,但这并不重要。)

但是,这种在array中使用listreference)的方法导致了negamax传递问题的方法。问题是通过move算法传递板状态意味着要考虑每个array,整个move(在JS中)将不得不复制以阻止strings进入原始董事会状态。

我通过将电路板状态存储为immutable(我在Python中为lists)来解决这个问题。我会建议你开始使用board,因为它们更容易访问和更改值,即使它们可能最终会导致缓慢(从制作它们的副本)后来进行优化

存储character状态的实际技巧是为每个部分使用一个upper,并使用lowercasewhite来表示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 Pythonin javascript :)

答案 1 :(得分:1)

好的,它是这样的: 你有64个单元格,传统上与​​字母和数字协调。 将每个单元格命名为数字,以便单元格将协调:" a1"将是11,h5将是85等。

现在采取行动:

  1. 向上:(单元格值)+ 1,向下:(单元格值) - 1,右:(单元格值)+ 10,左:(单元格值) - 10,
  2. 诊断:左上:(单元格值) - 9,右上:(单元格值)+ 11,左下:(单元格值) - 11,右下:((单元格值)+ 9,
  3. 对于骑士:(细胞值)+ 21,(细胞值) - 21,(细胞 值)+ 12,(单元格值) - 12,(单元格值)+ 8,(单元格值) - 8, (单元格值)+ 19,(单元格值) - 19。
  4. 你可以理解,我最近自己建立一个(如果你介意的话,基于JS)哈哈。

    祝你好运!