我有一个随机生成的大小为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)。我该如何实现呢?我知道我需要以某种方式记录以前的网格状态,但不知道如何。
答案 0 :(得分:2)
如果您只想“撤消”上一次更改,那么您可以在进行更改之前简单地复制状态的副本。然后,如果用户想要“撤消”更改,则从备份复制到实际数据中。
对于更多级别的撤消,您可以拥有一叠副本。
如果数据很大,则不是为每次更改复制数据,而是存储实际更改的副本。然后,当用户想要“撤销”时,你会做出与改变相反的事情。
示例:如果用户想要通过Z修改坐标X,Y,则存储X,Y和Z.然后在进行撤消时,使用-Z修改X,Y。
答案 1 :(得分:0)
在面向对象语言中,您经常会发现人们将使用command pattern来实现撤消系统。有些人可能会说它有点矫枉过正,但它确实非常灵活,并没有太多的锅炉板开始。
一般的想法是使用方法execute()
和undo()
创建一个界面。然后,您可以创建一大堆实现该接口的其他类,并知道具体操作(例如,在您的示例中更改位置)以及如何撤消它们。然后,您只需要通过将它们放在堆栈上来跟踪已执行的命令,当您需要撤消时,只需从堆栈中弹出它们并调用undo()
。
Here是了解一般命令模式和设计模式的好资源。