首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中为7x7板创建撤消函数

在Python中为7x7板创建撤消函数
EN

Stack Overflow用户
提问于 2017-12-16 02:11:21
回答 2查看 448关注 0票数 0

我目前正在尝试编写一个名为“Pah”的游戏。这款游戏的棋盘是7x7。对于董事会,我刚刚创建了一个包含7个元素的列表,基本上我把每一行都列成了一个列表,并将它们合并到一个大列表中:

代码语言:javascript
复制
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]]

游戏应该有一个撤销功能,这使玩家可以退一步。我想我可以把整个董事会附加到一个单独的列表中,然后用它来后退一步。

代码语言:javascript
复制
        if input == 'u' or input == 'U':
            board = board_list[-1]
            del board_list[-1]

直到现在它才能工作,但是由于某种原因,board_list (我在添加当前板的列表)总是作为一个整体进行更新,这意味着每个元素都会发生变化,成为新的面板。

例如:如果我有

代码语言:javascript
复制
#board = [[0, 'B'], [0, 0]]
board_list.append(board)
.
.
.
#board = [[0, 'B'], [0, 'B']]
board_list.append(board)

在第一个附件之后我会得到

代码语言:javascript
复制
board_list = [[[0, 'B'], [0, 0]]]

第二次给我留下

代码语言:javascript
复制
board_list = [[[0, 'B'], [0, 'B']], [[0, 'B'], [0, 'B']]]

我不知道为什么会这样。我搜索了类似的问题,但我只看到画布的撤销函数,我不确定是否可以在这个场景中使用它们。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-16 02:15:40

当您将board附加到board_list时,您将添加对原始board的引用。也许一个更好的选择是在移动时为已更改的单元格添加以前的状态:

代码语言:javascript
复制
moves.append([x, y, board[x][y]])

然后,当您撤消时,重新应用该状态:

代码语言:javascript
复制
undo_move = moves[-1]
board[undo_move[0]][undo_move[1]] = undo_move[2]
del moves[-1]

或者更多的丙酮:

代码语言:javascript
复制
x, y, board[x][y] = moves.pop()

或者,您可以复制整个董事会并将其存储在列表中。

票数 5
EN

Stack Overflow用户

发布于 2017-12-16 02:16:37

为了创建板副本列表,需要为板类实现深度复制方法。否则,您所做的就是一次又一次地复制同一个指针。Python通过引用传递,这是问题的根源。实现一个新方法,该方法使用与当前板相同的字段创建一个新的板,并从该方法返回指向该板的指针。我建议阅读一些浅而深的副本。您可以找到更多的细节这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47841934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档