【问题标题】:C++ Undo Command / Reverse to previous stateC ++撤消命令/恢复到以前的状态
【发布时间】:2017-09-15 04:37:04
【问题描述】:

我有一个随机生成的大小为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)。我该如何实施?我知道我需要以某种方式记录以前的网格状态,但不知道如何。

【问题讨论】:

    标签: c++ console command undo


    【解决方案1】:

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

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


    如果数据很大,那么不要为每次更改都复制数据,而只需存储实际更改的副本即可。然后,当用户想要“撤消”时,您执行与更改相反的操作。

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

    【讨论】:

    • 其实存储之前的值和x,y坐标就够了。将它们存储在一个结构中,所有此类更改的向量将允许撤消甚至重做多个用户操作...
    • @chariked 只要您确保“撤消”副本在更改之前是最新的,那么您如何操作并不重要。完整副本是安全的,但如果向量变大,则可能无效。仅复制即将更改的“单元格”可以很好地工作。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 2021-06-06
      • 2021-05-09
      • 2011-06-27
      • 2021-05-22
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多