Python 3:init中的自变量无法更改?

时间:2017-12-13 15:37:07

标签: python

我正在为学校编写游戏。到目前为止一切顺利,所以我现在试图在每个玩家转向后实施撤销选项。

  1. 我的主板是7x7矩阵,在__ init __中定义为self.board。
  2. 每个玩家都会操纵棋盘。
  3. 此外我在__ init __中定义了self.saved_states = []。该列表应该在每个玩家转身后存储每个游戏状态的副本。
  4. 到目前为止,我有一个方法实际上将状态保存到3中提到的列表中。

    def save_state(self):
        copied_board = copy.copy(self.board)
        self.saved_states.append(copied_board)
    

    我对此进行了测试,这似乎有效。问题出在其他地方。

    所以我会得到用户的意见,如果他输入' u'而不是实际有效的游戏输入我想做以下事情:

    if input == 'u':
        print('Undoing last turn!')
        self.board = self.saved_states.pop()
        self.player_2()
    

    我只想将游戏的当前状态更改为上一个状态,并让玩家2轮流(再次)。

    问题出在这里?每次每个玩家轮到我操纵棋盘的元素。为什么我不能用以前的电路板替换整个电路板?我不明白这里的区别。

    感谢您的帮助或想法!

1 个答案:

答案 0 :(得分:2)

这是一个疯狂的猜测:如果您的self.board是" 7x7矩阵",它可能是列表列表,因此您应该使用copy.deepcopy复制董事会。否则,内部列表仍然是相同的,并且当您修改当前板时,您还修改了所有"副本"。

def save_state(self):
    copied_board = copy.deepcopy(self.board)
    self.saved_states.append(copied_board)

或者,不是存储每个回合的棋盘布局,而是存储玩家执行的动作并相应地重放游戏。