2017-05-25 45 views
0

我想下象棋,但我混淆了一个问题。如何链接我的棋盘和棋子?由于棋盘可带有关于它的一部分,如何链接坐标与件?

chessboard = [(x, y) for x in range(8) for y in range(8)] 

走卒:

pawns = [] 
for pawnY in range(8): 
    pawn = (pawnY, 1) 
    pawns.append(pawn) 

下一个我试图取代坐标。我只是不知道什么是下面的代码之间的区别,这给我SyntaxError: invalid syntax

[chessboard[chessboard.index(e)] = '♟' for i, e in enumerate(pawns) if e in chessboard] 

而这一点,但这个工程:

for i, e in enumerate(pawns): 
    if e in chessboard: 
     chessboard[chessboard.index(e)] = '♟' 

输出:

print(chessboard) 
[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0), '♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟', (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

您正在获取SyntaxError,因为您无法在列表理解中使用赋值语句。当你想将两部分数据“链接”在一起时,请尝试使用字典。 (有点含糊,我知道,这就是为什么这是一个评论,而不是一个答案) – Kevin

+1

列表解析用于制作新的列表。正如您正在尝试的那样,它们不能用于将值分配给现有列表。虽然你的第二个工作例子可能看起来与第一个类似,但事实上,它们完全不同。 – sizzzzlerz

回答

0

我不完全确定你在做什么,但你似乎混淆棋盘的结构(所有的x,y位置)和棋盘的内容(棋子)。

相反方向上存储8×8 = 64个元组,其中x,y位置在一个列表中的,则可以创建列表的嵌套(2D)列表来编码您的板的结构:产生

chessboard = [[0 for x in range(8)] for y in range(8)] 

以下chessboard

[[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0]] 

现在,您可以参考各现在的位置是简单地通过其2D指数,如chessboard[0][0]在角落里。我在这里使用0代表董事会上的empy广场。

然后,你可以继续填充它,例如,典当:

for pawnY in range(8): 
    chessboard[1][pawnY] = '♟' 

导致更新chessboard

[[0, 0, 0, 0, 0, 0, 0, 0], 
['♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0]] 

与在起始位置件填写您的主板后,你可以写功能根据其各自的规则来移动棋子。

+0

谢谢,但如何获得每件棋盘单元的坐标(x,y),而不是操作它们? – This4fun

+0

这种表示方式可以在任何时候对电路板的整个状态进行编码。您可以通过它的(x,y)坐标而不是其他方式来访问一块。例如在棋盘[1] [1]上方的更新棋盘状态中''会返回''''。一旦你访问了一块的价值,你可以检查类型,合法移动,并相应地采取行动。采取行动将涉及更新新的职位和更新旧的职位空的广场。 例如移动棋子从(1,1)到(2,1): '>>> chessboard [2] [1] ='♟'' '>>> chessboard [1] [1] = 0' 希望帮助! – phillchill