制作一个等待JButton事件的基于文本的游戏

时间:2016-04-03 02:29:13

标签: java event-driven text-based

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

游戏的基本方式: 说你在打什么怪物。 攻击。 当它被击败时,你会去下一个怪物。

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

很抱歉,如果这有点模糊,它更像是语法问题,而不是语法问题,我只是在学习Java。我基本上需要一个事件驱动游戏的基本结构,根据您所处的游戏阶段,它会有不同的反应。

2 个答案:

答案 0 :(得分:1)

在事件驱动的程序中,我一般在过去做过,你希望每个要做某事并生成事件的类都有一个内部的监听器列表,可以注册/注册该类。可以把它想象成有人在互联网上订阅你的推文。您回复某种类型的刺激并向订阅/注册到您的Feed的每个人发送通知。然后,那些听众可以采取行动并向他们自己的听众发送通知等。

一个简单的实现是拥有一个TweetListener接口,订阅类将实现该接口。作为TweetProducer,您将拥有一组注册/取消注册方法,这些方法由希望在发送"事件"时通知的所有TweetListener实例的内部列表支持。当您准备发送推文时,您将循环浏览该列表的防御副本,并为其中的每个对象调用TweetListener界面中定义的方法,即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监听器。等待按键事件,确定它们是什么,并向程序中的各个侦听器发送相应的事件通知。在某些时候,按键听众将不得不坐下来阻止,等待输入。或者你可以拥有那个按键监听器&程序的其他部分在不同的线程中运行。这实际上是Swing线程模型在Java中的工作方式。你有一个主程序线程和一个swing线程,你可以在两者之间来回传递事件通知(即SwingUtilities.invokeLater();)

这是一篇较旧的文章,但实际上对于如何在java中进行事件驱动编程的基础知识非常有用。我认为这适用于你想要做的事情。 https://community.oracle.com/docs/DOC-982960它讨论的事情包括防御性复制,发送不可变事件对象以及为什么需要这样做&担心这样的事情。

答案 1 :(得分:0)

活动计划的关键是你没有使用"循环"一点都不相反,你改变了#34;状态"。

这个"状态机的最简单版本"将是一个String的线性ArrayList,其中您的程序包含一个表示ArrayList中当前项的int变量,并在按下按钮时递增索引,然后将列表中的下一个String呈现给用户。该系统的优点在于,您可以将它用于更复杂的逻辑旅程,几乎是无限种类,每一种都取决于游戏的当前状态和用户的选择。

对于更复杂的游戏,您不会使用线性脚本,而是创建具有行为(方法)和状态(变量)的多个类,并使它们彼此交互。这些将包括您的Monster类,您的Item类和Location类,以及用于控制所有内容的Game类。