如何将事件监听器与"'"举办活动?

时间:2014-07-13 17:35:59

标签: java swing events user-interface

我为终端写了一个简单的小迷宫游戏,它反复要求用户做某事(例如“你想去哪个方向?[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。我还没有为事件监听器编写任何代码,因为我不确定哪个类应该调用哪个。这可能是一个单独的问题。)

1 个答案:

答案 0 :(得分:2)

您的基于文本的游戏有一个循环,反复询问收集用户输入的问题。 Swing通过不断执行已发布到EventQueueRunnable代码块为您提供此循环。例如,当用户按下标有 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包括原始的基于文本的来源。