我为终端写了一个简单的小迷宫游戏,它反复要求用户做某事(例如“你想去哪个方向?[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
方法是否请求过,都会触发事件。
--> Image of GUI
有什么办法可以将这个结合起来,还是我需要为GUI编写一个新的navigate
方法?
(说实话,我也不完全确定我的GUI类是否应该实例化game
类,在这种情况下,navigate
的逻辑最终可能会以GUI方法结束,或者游戏是否应该有GUI。我还没有为事件监听器编写任何代码,因为我不确定哪个类应该调用哪个。这可能是一个单独的问题。)
答案 0 :(得分:2)
您的基于文本的游戏有一个循环,反复询问收集用户输入的问题。 Swing通过不断执行已发布到EventQueue
的Runnable
代码块为您提供此循环。例如,当用户按下标有 E 的button时,会将代码发布到调用ActionEvent
实现的队列中,以处理游戏对move east
的解释命令。
作为参考,我们会检查一个非常简单的猜谜游戏的完整示例here。在伪代码中,相应的基于文本的游戏可能如下所示:
initialize
loop
prompt "Guess what color!"
get chosenColor
if chosenColor = actualColor
say "You win!"
reset game
else
say "Keep trying."
end loop
其中引用的更为精细game包括原始的基于文本的来源。