C ++撤消命令/反向以前的状态

时间:2017-04-19 05:49:20

标签: c++ console command undo

我有一个随机生成的大小为gameSize(用户输入)的网格,它包含在向量向量中。用户可以输入两个坐标(x,y),以便将网格中的数字更改为预定义的值,即" 0"。

例如,用户输入X:0 Y:0和:

{9, 7, 9}

{9, 6, 8}

{5, 1, 4}

变为:

{0, 7, 9} <-- Changes position 0,0 to 0 (the predefined value)

{9, 6, 8} 

{5, 1, 4}

我试图找出如何添加&#34;撤消&#34;提示用户是否要撤消其选择的功能,如果是,则反转选择以使位置0,0变回原始值(在此示例中为值9)。我该如何实现呢?我知道我需要以某种方式记录以前的网格状态,但不知道如何。

2 个答案:

答案 0 :(得分:2)

如果您只想“撤消”上一次更改,那么您可以在进行更改之前简单地复制状态的副本。然后,如果用户想要“撤消”更改,则从备份复制到实际数据中。

对于更多级别的撤消,您可以拥有一叠副本。

如果数据很大,则不是为每次更改复制数据,而是存储实际更改的副本。然后,当用户想要“撤销”时,你会做出与改变相反的事情。

示例:如果用户想要通过Z修改坐标X,Y,则存储X,Y和Z.然后在进行撤消时,使用-Z修改X,Y。

答案 1 :(得分:0)

在面向对象语言中,您经常会发现人们将使用command pattern来实现撤消系统。有些人可能会说它有点矫枉过正,但它确实非常灵活,并没有太多的锅炉板开始。

一般的想法是使用方法execute()undo()创建一个界面。然后,您可以创建一大堆实现该接口的其他类,并知道具体操作(例如,在您的示例中更改位置)以及如何撤消它们。然后,您只需要通过将它们放在堆栈上来跟踪已执行的命令,当您需要撤消时,只需从堆栈中弹出它们并调用undo()

Here是了解一般命令模式和设计模式的好资源。