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

C++ Undo Command / Reverse to previous state

本文关键字:状态 撤消 命令      更新时间:2023-10-16

i具有随机生成的大小 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}

我正在尝试弄清楚如何添加"撤消"功能,如果他们想撤消他们的选择,则提示用户的提示,如果是,则转换选择,以便将位置0,0更改为原始值(在此示例中是值9(。我该如何实施?我知道我需要以某种方式记录以前的网格状态,但不知道如何。

如果您只想"撤消"最后一个更改,那么您就可以在之前简单地对状态进行副本,一种备份进行更改。然后,如果用户想"撤消"更改,则将备份复制到实际数据中。

对于更多级别的撤消,您可能会有一堆副本。


如果数据很大,那么而不是复制每个更改的数据,而只是存储实际更改的副本。然后,当用户要"撤消"时,您会做更改的相反。

示例:如果用户要修改坐标x,y为z,则存储x,y和z。然后,在撤消时,您可以使用-z进行修改x,y。

在面向对象的语言中,您经常发现人们会使用命令模式实现撤消系统。有些人可能会说这是过度的,但确实非常灵活,并且不需要太多锅炉板即可开始。

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

这是学习命令模式和设计模式的好资源。