C 撤消命令 /反向以前的状态
C++ Undo Command / Reverse to previous state
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()
。
这是学习命令模式和设计模式的好资源。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- 在Qt中复制,剪切,粘贴,重命名,撤消和重做
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- C 撤消命令 /反向以前的状态