如何将事件监听器与“询问”事件相结合?

我为一个终端写了一个简单的小迷宫游戏,它反复要求用户做某事(例如“你想去哪个方向?[N / E / S / W]”)。 我有一个在循环中运行的navigate()方法,它会触发这些问题,存储它们的答案并根据答案做一些事情。

 public enum Dir (N, E, S, W); public void navigate() { Dir nextDir = utils.askDirection("Which way do you want to go?"); // Do stuff with answer, like changing position of user in maze } 

现在,我为我的游戏编写了一个简单的GUI。 我故意将所有对终端的引用放在ConsoleUtils类中,该类实现了Utils接口(这有像askQuestion()这样的方法) – 这个想法是我可以创建一个GuiUtils类并让我的游戏作为终端游戏作为GUI游戏。

问题是navigate方法向用户询问一个问题,然后“等待”响应, Utils类通过使用Scanner读取最新的输入行来给出响应。 但是,如果我在GUI中使用事件监听器来处理新的N / E / S / W按钮,则无论navigate方法是否要求,都会触发事件。 – > GUI的图像

有什么办法可以将这个结合起来,还是我需要为GUI编写一个新的navigate方法?

(老实说,我也不完全确定我的GUI类是否应该实例化一个game类,在这种情况下navigate的逻辑最终可能会以GUI方法结束,或者游戏是否应该有GUI。我没有’还为事件监听器编写了任何代码,因为我不确定哪个类应该调用哪个。这可能是一个单独的问题。)

基于文本的游戏有一个循环,可以反复询问收集用户输入的问题。 Swing通过不断执行已发布到EventQueue Runnable代码块为您提供此循环。 例如,当用户按下标有E的按钮时 ,代码将发布到调用ActionEvent实现的队列中,以处理游戏对move east命令的解释。

作为参考, 这里检查一个非常简单的猜谜游戏的完整例子。 在伪代码中,相应的基于文本的游戏可能如下所示:

 initialize loop prompt "Guess what color!" get chosenColor if chosenColor = actualColor say "You win!" reset game else say "Keep trying." end loop 

这里引用的更精细的游戏包括原始的基于文本的源。