No7*_*x Q 0 python list undo append
我目前正在尝试编写一款名为 Pah Tum 的游戏。该游戏涉及 7x7 的棋盘。对于该板,我刚刚创建了一个包含 7 个列表的列表,每个列表包含 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]]
Run Code Online (Sandbox Code Playgroud)
游戏应该具有撤消功能,使玩家能够后退一步。我想我可以将整个板附加到一个单独的列表中,并使用它来后退一步。
if input == 'u' or input == 'U':
board = board_list[-1]
del board_list[-1]
Run Code Online (Sandbox Code Playgroud)
直到这里它都可以工作,但由于某种原因,board_list(我将当前板附加到的列表)始终作为一个整体更新,这意味着每个元素都会发生变化并成为新板。
例如。如果我有
#board = [[0, 'B'], [0, 0]]
board_list.append(board)
.
.
.
#board = [[0, 'B'], [0, 'B']]
board_list.append(board)
Run Code Online (Sandbox Code Playgroud)
在第一个附加之后我会得到
board_list = [[[0, 'B'], [0, 0]]]
Run Code Online (Sandbox Code Playgroud)
第二个给我留下了
board_list = [[[0, 'B'], [0, 'B']], [[0, 'B'], [0, 'B']]]
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会发生这种情况。我搜索了类似的问题,但我只看到画布的撤消功能,我不确定是否可以在这种情况下使用它们。
当您附加到时,board您board_list将添加对原始 board. 也许更好的选择是在移动时为更改的单元格添加先前的状态:
moves.append([x, y, board[x][y]])
Run Code Online (Sandbox Code Playgroud)
然后当您撤消时,您会重新应用该状态:
undo_move = moves[-1]
board[undo_move[0]][undo_move[1]] = undo_move[2]
del moves[-1]
Run Code Online (Sandbox Code Playgroud)
或者更Python地:
x, y, board[x][y] = moves.pop()
Run Code Online (Sandbox Code Playgroud)
或者,您可以复制整个板并将其存储在列表中。