使用Java堆栈检测方法调用的顺序

使用Java堆栈检测方法调用的顺序,java,stack,queue,Java,Stack,Queue,Java初学者,希望得到关于如何最好地解决我正在单独研究的问题的反馈 尝试构建一个基本游戏,玩家在网格/棋盘上移动。具有上/下/左/右方法(例如public void playerMovesUp()等),并且需要实现撤消/重做移动功能,这样玩家可以追溯x个步骤,然后在游戏过程中的任何时候重新获取x个步骤 我们一直在研究实现这一点的方法,即记录上/下/左/右方法调用的顺序,然后以相反的顺序重新调用这两个方法(撤消),然后重做 堆栈或队列集合似乎是合乎逻辑的……我还研究了存储函数调用顺序的java堆

Java初学者,希望得到关于如何最好地解决我正在单独研究的问题的反馈

尝试构建一个基本游戏,玩家在网格/棋盘上移动。具有上/下/左/右方法(例如public void playerMovesUp()等),并且需要实现撤消/重做移动功能,这样玩家可以追溯x个步骤,然后在游戏过程中的任何时候重新获取x个步骤

我们一直在研究实现这一点的方法,即记录上/下/左/右方法调用的顺序,然后以相反的顺序重新调用这两个方法(撤消),然后重做

堆栈或队列集合似乎是合乎逻辑的……我还研究了存储函数调用顺序的java堆栈内存,并刚刚阅读了java.lang.Thread.getStackTrace()

当前想法……如果我将这四个方法分离为一个线程,那么我可以使用java.lang.thread.getStackTrace()返回一个数组,并调用getMethodName(),然后以某种方式依次调用适用的方法

另外,是否可以存储方法调用的队列/堆栈


我觉得我走对了路,但最后一个建议似乎有点混乱/不合逻辑!任何提示/建议都将不胜感激。

不要像那样使用堆栈。这不是为什么。
只需保留一个您采取的步骤列表,并使用该列表追溯您的步骤。

不要这样使用堆栈。这不是为什么。
只需保留一份您采取的步骤列表,并使用该列表追溯您的步骤。

我认为您无法使用堆栈来实现此目的。您必须自己跟踪方法调用。不,您不能将“方法调用”存储到集合中


相反,为您的操作设计类会更容易,其中每个类实现一个
do
和一个
undo
。然后可以将这些类的实例存储在
堆栈
队列
中。如果用户希望撤消其操作,可以向后处理,并对所有元素调用undo。此模式称为命令模式(参见示例)。

我认为您不能使用堆栈来实现此目的。您必须自己跟踪方法调用。不,您不能将“方法调用”存储到集合中


相反,为您的操作设计类会更容易,其中每个类实现一个
do
和一个
undo
。然后可以将这些类的实例存储在
堆栈
队列
中。如果用户希望撤消其操作,可以向后处理,并对所有元素调用undo。这种模式被称为命令模式(参见示例)

Java
Stack
——通常,人们会使用命令模式在不同的类中设计动作来实现撤销。(请参阅)将您的移动存储在
堆栈中,即“右”“左”“上”“下”…然后,当您要向后移动时,只需抓住
堆栈的顶部元素,然后执行相反的操作
if(topElement.equalsIgnoreCase(“right”){moveLeft();}
.Java
Stack
——通常,人们会使用命令模式在不同的类中设计动作来实现撤销。(请参阅)将您的移动存储在
堆栈中,即“右”“左”“上”“下”…然后,当您要向后移动时,只需抓住
堆栈的顶部元素,然后执行相反的操作<代码>如果(topElement.equalsIgnoreCase(“right”){moveLeft();}
。谢谢拉斐尔。如果我为每个动作(向上/向下等)创建了一个新类,并且每次玩家移动一个网格空间时它都会生成一个对象,那么这不是比每次玩家移动到我的堆栈时只添加一个字符串效率要低得多吗?所以我有一堆“左”、“上”、“右”、“上”等等。否则,我的堆栈中可能会有大量的对象,因为玩家可以移动的次数没有限制。你觉得怎么样?谢谢拉斐尔。如果我为每个动作(向上/向下等)创建了一个新类,并且每次玩家移动一个网格空间时它都会生成一个对象,那么这不是比每次玩家移动到我的堆栈时只添加一个字符串效率要低得多吗?所以我有一堆“左”、“上”、“右”、“上”等等。否则,我的堆栈中可能会有大量的对象,因为玩家可以移动的次数没有限制。你怎么认为?