我正在制作一个游戏,玩家可以在棋盘/网格上移动。它有moveLeft()、moveRight()、moveUp()和moveDown()方法,每次移动玩家1个空格。
我试图规划所需的撤销/重做功能的方法,以便在玩家移动时进行操作(例如,如果玩家向左移动了一个空格,并调用了Undo,则玩家将向右移动一个空格)。我是一名学生,正在研究栈。
然而,在编程之前,当我在纸上规划逻辑时(我发现这有助于我的作业),我不知道基于以下问题,是否应该使用栈。
每次调用每个移动方法时,都会将字符串“Up”、“Down”、“Left”、“Right”添加到Stack 1中,具体取决于调用的方法。这跟踪玩家在棋盘上的移动。
如果调用undo(),则从Stack 1的顶部删除字符串,并添加到一个新的堆栈“Stack 2”中。这用于跟踪“撤消”的移动,以便redo()有一个路径可以遵循。
如果调用redo(),则从Stack 2中删除字符串,并重新添加到Stack 1中。
这个方法完美地工作,但只有当您调用Redo()的次数与Undo()相同并直接在其后时才有效。
例如:
1. 玩家进行4次移动:(Stack 1现在有4个字符串) 2. 调用Undo()一次:(Stack 1现在有3个字符串,Stack 2有1个字符串) 3. 玩家再进行4次移动:(Stack 1现在有7个字符串,Stack 2仍有1个字符串) 4. 再次调用Undo():(Stack 1现在有6个字符串,Stack 2有2个字符串) 5. 调用Redo():(这里是问题)这可以被调用两次,因为Stack 2有2个字符串,但实际上玩家在棋盘上只能调用Redo()一次。
我已经试图孤立地解决这个逻辑问题了4个小时!任何建议都将不胜感激。即基于以上内容,是否仍然可能使用栈来实现我需要的功能,或者应该放弃,因为这是不可能的。
我试图规划所需的撤销/重做功能的方法,以便在玩家移动时进行操作(例如,如果玩家向左移动了一个空格,并调用了Undo,则玩家将向右移动一个空格)。我是一名学生,正在研究栈。
然而,在编程之前,当我在纸上规划逻辑时(我发现这有助于我的作业),我不知道基于以下问题,是否应该使用栈。
每次调用每个移动方法时,都会将字符串“Up”、“Down”、“Left”、“Right”添加到Stack 1中,具体取决于调用的方法。这跟踪玩家在棋盘上的移动。
如果调用undo(),则从Stack 1的顶部删除字符串,并添加到一个新的堆栈“Stack 2”中。这用于跟踪“撤消”的移动,以便redo()有一个路径可以遵循。
如果调用redo(),则从Stack 2中删除字符串,并重新添加到Stack 1中。
这个方法完美地工作,但只有当您调用Redo()的次数与Undo()相同并直接在其后时才有效。
例如:
1. 玩家进行4次移动:(Stack 1现在有4个字符串) 2. 调用Undo()一次:(Stack 1现在有3个字符串,Stack 2有1个字符串) 3. 玩家再进行4次移动:(Stack 1现在有7个字符串,Stack 2仍有1个字符串) 4. 再次调用Undo():(Stack 1现在有6个字符串,Stack 2有2个字符串) 5. 调用Redo():(这里是问题)这可以被调用两次,因为Stack 2有2个字符串,但实际上玩家在棋盘上只能调用Redo()一次。
我已经试图孤立地解决这个逻辑问题了4个小时!任何建议都将不胜感激。即基于以上内容,是否仍然可能使用栈来实现我需要的功能,或者应该放弃,因为这是不可能的。
Stack
吗?还是可以使用其他东西(例如List
)? - Dan Wundo()
/redo
也会将该移动推入撤销堆栈中? - Kenney