java - 制作等待 JButton 事件的基于文本的游戏

标签 java event-driven text-based

我正在寻找一种制作简单的基于文本的游戏的方法,尽管我在事件驱动而不是游戏循环中遇到问题。

游戏的基本玩法: 说明你正在与什么怪物战斗。 攻击。 当它被击败后,你就去寻找下一个怪物。

在使用扫描仪下一行的游戏循环中,我可以等待用户输入有效选项,然后继续代码。然而,使用事件,我不确定如何设置游戏。我需要以某种方式等待用户按下按钮来执行操作,但我不知道应该在哪里注册事件监听器,如何使用操作事件进行循环等。

抱歉,如果这有点含糊,这更多的是语义问题而不是语法问题,而且我刚刚学习 Java。我本质上需要事件驱动游戏的基本结构,该结构根据您所处的游戏阶段做出不同的 react 。

最佳答案

在我过去做过的事件驱动程序中,通常您希望每个要执行某些操作并生成事件的类都有一个可以在该类中注册/注册的监听器的内部列表。将其视为某人在互联网上订阅您的推文。您对某种类型的刺激使用react并向订阅/注册您的提要的每个人发送通知。然后,这些听众可以采取行动并向他们自己的听众发送通知等。

一个简单的实现是拥有一个 TweetListener 接口(interface),并且订阅类将实现该接口(interface)。作为 TweetProducer,您将拥有一组注册/取消注册方法,这些方法由所有希望在您发出“事件”时收到通知的 TweetListener 实例的内部列表支持。当您准备好发送推文时,您将循环浏览该列表的防御副本,并且对于其中的每个对象,您将调用 TweetListener 接口(interface)中定义的方法,即 aListener.doTweetReceivedAction("Here's my tweet") 。 (防御性副本,因为听众可能采取的行动之一是取消注册/停止关注您的推文,并且您不希望同时修改列表)。显然,您必须非常小心后续操作如何从并发/多线程意义上和操作顺序意义上影响您的程序。

就引导整个事情而言,在你的 public void static main 中方法您基本上会实例化各种对象并将它们连接在一起作为监听器等。

Tweeter me = new Tweeter()
SomeDude dude = new SomeDude() // implements TweetListener interface
SomeDude bob = new SomeDude()

me.addListener(dude);
me.addListener(bob);

me.tweet("hi!");

显然,您还需要一个 KeyTyped 监听器,它可以等待按键事件,确定它们是什么,并向程序中的各个监听器发送适当的事件通知。在某些时候,按键监听器必须坐下并阻塞,等待输入。或者,您可以让按键监听器和程序的其他部分在不同的线程中运行。这实际上就是 Java 中 Swing 线程模型的工作方式。您有一个主程序线程和一个 swing 线程,并且您在两者之间来回踢事件通知(即 SwingUtilities.invokeLater();)

这是一篇较旧的文章,但实际上对于如何在 java 中进行事件驱动编程的基础知识来说相当不错。我认为这适用于您正在尝试做的事情。 https://community.oracle.com/docs/DOC-982960它讨论了防御性复制、发送不可变事件对象等内容,以及为什么您需要做和担心这样的事情。

关于java - 制作等待 JButton 事件的基于文本的游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36380990/

相关文章:

c - 事件驱动与使用返回值的调用者相比

akka - Akka 持久性 Actor 的用例是什么?

c - 使用二叉堆实现的优先级队列的事件驱动模拟

python - 我在 python 中的函数正在被调用,即使我只是定义它

基于 Java 文本的游戏 - 如何实现类选择功能?

java - j2me 短信接收在模拟器中工作但在诺基亚 n91 中不起作用?

java - 内置(或流行的第 3 方库)在原始类型和相应引用类型 ("wrapper"之间进行映射的方式)?

java - JAVA 中的随机数生成

c++ - 虽然循环条件不起作用

ubuntu 16.04 不支持 java aio SO_KEEPALIVE?