java - 游戏中撤消/重做功能的堆栈实现

标签 java stack game-development

我正在开发一款游戏,其中玩家可以在棋盘/网格中移动。它具有 moveLeft()、moveRight()、moveUp() 和 moveDown() 方法,可让玩家在棋盘上一次移动 1 个空间。

我正在尝试规划我的方法来实现玩家移动所需的撤消/重做功能(例如,如果玩家向左移动一格,并且调用撤消,玩家将向右移动一格)。我是一名学生,正在研究 Stacks。

但是,在编程之前在纸上计划逻辑时(我发现这对我做作业有帮助),我不知道基于以下问题 Stacks 是否合适....

当每个移动方法被调用时,字符串 'Up', 'Down', 'Left', 'Right' 被添加到堆栈 1,具体取决于调用的方法。这会跟踪玩家在棋盘上的移动。

如果调用 undo(),堆栈 1 顶部的字符串将被删除,并添加到新堆栈“堆栈 2”。这用于跟踪“未完成”的移动,以便 redo() 有一个可遵循的路径。

如果调用 redo(),Stack 2 上的字符串将被删除,并返回添加到 Stack 1。

这非常有效,但前提是您调用 Redo() 的次数与 Undo() 的次数完全相同,并且紧随其后。

例如:

  1. 玩家进行 4 次移动:(第 1 叠现在有 4 根弦)
  2. Undo() 被调用一次:(Stack 1 现在有 3 个字符串,Stack 2 有 1 个字符串)
  3. 玩家再走 4 步:(第 1 叠现在有 7 根弦,第 2 叠仍然有 1 根弦)
  4. Undo() 被调用一次:(Stack 1 现在有 6 个字符串,Stack 2 有 2 个字符串)
  5. Redo() 被调用:(问题所在)这可以被调用两次,因为 Stack 2 有 2 个字符串,但实际上棋盘上的 Player 应该只能调用 Redo() 一次。

在过去的 4 小时里,我一直在尝试孤立地研究这背后的逻辑!任何建议表示赞赏。即 - 基于以上所述,是否仍然可以使用 Stacks 执行我需要执行的操作,并且我需要找到解决该问题的方法?或者我应该放弃,因为这是不可能的。

最佳答案

如果您不想使用 Stacks,因为您不确定何时清除撤消 Stack,您可以使用 List。然后,您的逻辑可以以类似的方式维护:

  • 保留您正在进行的移动的索引(从 0 开始,每个新移动增加 1)
  • 如果撤消已完成,则递减索引(除非您位于列表的开头)
  • 如果重做完成,增加索引(除非你在列表的末尾)
  • 如果执行新的移动,增加索引并清除所有大于或等于索引的移动(从而清除您的撤消/重做移动)

那么,你的例子是:

  1. 玩家进行 4 次移动(索引为 3,列表有 4 项)
  2. Undo() 被调用一次(索引为 2,列表有 4 个项目)
  3. 玩家再进行 4 次移动(索引为 6,列表有 7 个项目,所有撤消/重做项目均已清除)
  4. Undo() 被调用一次(索引为 5,列表有 7 个项目)
  5. Redo 被调用一次(索引为 6,列表有 7 个项目)
  6. 重做被再次调用(因为没有可用的重做操作而被拒绝)

关于java - 游戏中撤消/重做功能的堆栈实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36555368/

相关文章:

visual-c++ - C++/OpenGL国际象棋游戏程序设计建议

java - 如何确定网格单元是否在单元的封闭周边内

java - 解析 XML 并转换为集合

javascript - 如何以编程方式在任何浏览器中禁用 "Save Password"通知?

c++ - 我无法从中得到输出

java - 我可以从递归返回到 main 而不展开堆栈吗?

python - Pygame,旋转图像而无需在每次迭代中加载图像

java - jackson 在第一次关闭大括号后停止读取输入字符串

java - 不可编辑的 JComboBox 中下拉控件和边框的颜色

c++ - 如何在 C++ 应用程序中重现 "Stack smashing detected"