我正在开发一款游戏,其中玩家可以在棋盘/网格中移动。它具有 moveLeft()、moveRight()、moveUp() 和 moveDown() 方法,可让玩家在棋盘上一次移动 1 个空间。
我正在尝试规划我的方法来实现玩家移动所需的撤消/重做功能(例如,如果玩家向左移动一格,并且调用撤消,玩家将向右移动一格)。我是一名学生,正在研究 Stacks。
但是,在编程之前在纸上计划逻辑时(我发现这对我做作业有帮助),我不知道基于以下问题 Stacks 是否合适....
当每个移动方法被调用时,字符串 'Up', 'Down', 'Left', 'Right' 被添加到堆栈 1,具体取决于调用的方法。这会跟踪玩家在棋盘上的移动。
如果调用 undo(),堆栈 1 顶部的字符串将被删除,并添加到新堆栈“堆栈 2”。这用于跟踪“未完成”的移动,以便 redo() 有一个可遵循的路径。
如果调用 redo(),Stack 2 上的字符串将被删除,并返回添加到 Stack 1。
这非常有效,但前提是您调用 Redo() 的次数与 Undo() 的次数完全相同,并且紧随其后。
例如:
- 玩家进行 4 次移动:(第 1 叠现在有 4 根弦)
- Undo() 被调用一次:(Stack 1 现在有 3 个字符串,Stack 2 有 1 个字符串)
- 玩家再走 4 步:(第 1 叠现在有 7 根弦,第 2 叠仍然有 1 根弦)
- Undo() 被调用一次:(Stack 1 现在有 6 个字符串,Stack 2 有 2 个字符串)
- Redo() 被调用:(问题所在)这可以被调用两次,因为 Stack 2 有 2 个字符串,但实际上棋盘上的 Player 应该只能调用 Redo() 一次。
在过去的 4 小时里,我一直在尝试孤立地研究这背后的逻辑!任何建议表示赞赏。即 - 基于以上所述,是否仍然可以使用 Stacks 执行我需要执行的操作,并且我需要找到解决该问题的方法?或者我应该放弃,因为这是不可能的。
最佳答案
如果您不想使用 Stacks
,因为您不确定何时清除撤消 Stack
,您可以使用 List
。然后,您的逻辑可以以类似的方式维护:
- 保留您正在进行的移动的索引(从 0 开始,每个新移动增加 1)
- 如果撤消已完成,则递减索引(除非您位于列表的开头)
- 如果重做完成,增加索引(除非你在列表的末尾)
- 如果执行新的移动,增加索引并清除所有大于或等于索引的移动(从而清除您的撤消/重做移动)
那么,你的例子是:
- 玩家进行 4 次移动(索引为 3,列表有 4 项)
- Undo() 被调用一次(索引为 2,列表有 4 个项目)
- 玩家再进行 4 次移动(索引为 6,列表有 7 个项目,所有撤消/重做项目均已清除)
- Undo() 被调用一次(索引为 5,列表有 7 个项目)
- Redo 被调用一次(索引为 6,列表有 7 个项目)
- 重做被再次调用(因为没有可用的重做操作而被拒绝)
关于java - 游戏中撤消/重做功能的堆栈实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36555368/