我目前正在尝试编写一个名为“Pah”的游戏。这款游戏的棋盘是7x7。对于董事会,我刚刚创建了一个包含7个元素的列表,基本上我把每一行都列成了一个列表,并将它们合并到一个大列表中:
board = [[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]]游戏应该有一个撤销功能,这使玩家可以退一步。我想我可以把整个董事会附加到一个单独的列表中,然后用它来后退一步。
if input == 'u' or input == 'U':
board = board_list[-1]
del board_list[-1]直到现在它才能工作,但是由于某种原因,board_list (我在添加当前板的列表)总是作为一个整体进行更新,这意味着每个元素都会发生变化,成为新的面板。
例如:如果我有
#board = [[0, 'B'], [0, 0]]
board_list.append(board)
.
.
.
#board = [[0, 'B'], [0, 'B']]
board_list.append(board)在第一个附件之后我会得到
board_list = [[[0, 'B'], [0, 0]]]第二次给我留下
board_list = [[[0, 'B'], [0, 'B']], [[0, 'B'], [0, 'B']]]我不知道为什么会这样。我搜索了类似的问题,但我只看到画布的撤销函数,我不确定是否可以在这个场景中使用它们。
发布于 2017-12-16 02:15:40
当您将board附加到board_list时,您将添加对原始board的引用。也许一个更好的选择是在移动时为已更改的单元格添加以前的状态:
moves.append([x, y, board[x][y]])然后,当您撤消时,重新应用该状态:
undo_move = moves[-1]
board[undo_move[0]][undo_move[1]] = undo_move[2]
del moves[-1]或者更多的丙酮:
x, y, board[x][y] = moves.pop()或者,您可以复制整个董事会并将其存储在列表中。
发布于 2017-12-16 02:16:37
为了创建板副本列表,需要为板类实现深度复制方法。否则,您所做的就是一次又一次地复制同一个指针。Python通过引用传递,这是问题的根源。实现一个新方法,该方法使用与当前板相同的字段创建一个新的板,并从该方法返回指向该板的指针。我建议阅读一些浅而深的副本。您可以找到更多的细节这里。
https://stackoverflow.com/questions/47841934
复制相似问题