-
27-09-2019 - |
题
目前,我正在创建一个简单的基于控制台游戏玩家可以移动之间不同的房间,挑选和使用的物品和吃的食物。在游戏中的当前状态就是这样。
我需要什么帮助是:
创造一个良好的"事件"类用我的游戏。我想它的工作是每一个项目,并室应该能够将相关的一个事件。
因为我是新来的,我会很感激的任何阅读材料有关这种程序,或建议 怎么这将是最好的,设立我的类(es)考虑到以下几点, 或者简单 如何进攻,这种问题(也就是无法决定如何建立类).
我希望能够创造各种不同的活动,例如:
输出一些文字,然后要求播放的一个问题。如果游戏者提供正确的答案,做一些事情。
输出一些文字,然后删除一个项目的播放的库存,然后移动的放到另一个房间。
我想避免:
整个游戏的目的就是实践很好的类的设计,这样的事情,例如责任驱动的设计、凝聚力和连接的重要方面。因此,我希望它可以作为简单的、可重复使用和独立成为可能。
具有硬代码的每一个事件,这样一个项目或间简单的电话的具体方法的事件类。
我想在那一刻:
创造几个分类,这样我可以例如创造新的事件(以及赞同他们)使用:itemObject.setEvent(新活动(新问题("introText","outroText","correctAnswer")));
请让我知道如果更多信息的需要!谢谢!
解决方案
游戏的编程的宝石书是伟大的...虽然有点贵。
你也许可以找到一个有关条款或两个月 游的文章清单, 有可能有些好东西埋在 他们的论坛
作为一个事件类,你几乎可以肯定想要一个基类的一些数量的亚类(MoveEvent,InventoryEvent等)。如果你 真的 想要避免硬编码的事情,你应该定义你的游戏中的数据文件。房、项目和活动中心。加上你还有什么粘上的后。该格式的用于定义的事情完全是你的了。我建议将得到你的实践经验,因为这是一个学习练习:XML parser你还没有用的例子。不是最有效的格式分析,但这是一个控制台游戏,所以这不是一个问题。
一个建议,我有一个事件的亚类将是一个可链的其他活动在一起。该界面不改变,和它可以让你喜欢做的事情"这增加了播放的库存,拿走它,并将它们移过来这里"。
其他提示
有一件事我会考虑的是分析的文本输入和输出的文本基础域模型。你的问题似乎混合两个在一起的而我会考虑的文字部分的问题,因为介绍层。
例如,您的领域可以包括下列接口:
public enum Action { HIT, TALK_TO, EAT, USE };
public interface GameEntity {
/**
* Performs the specified action on this GameEntity, passing in zero or
* more other GameEntity instances as parameters.
*/
void applyAction(Action action, GameEntity... params);
}
public interface Item extends GameEntity { }
public interface Person extends GameEntity { }
此外,您可以定义TextParser类会过程的输入串并使得呼吁域层或其他人返回一个默认的响应:"我不明白。".例如,输入短语"使用钥匙在门的"会导致方法的呼吁:
key.applyAction(Action.USE, door);
说话时的事件的 观察员的模式 想到的。你能想到的你的游戏要是在内部提出的几个国家机(你可以看看这个在维基百科,我也不能添加第2链接,自己由于被新到如此)。每个过渡,从一个阶段到另一个事件,就可以传达给注册oberservers的事件。
在例如:
用钥匙锁定:触发器除去的关键,并开门;implictly"层叠",以下一个事件,而不产生额外的用户相互作用(开门):触发器室具有额外的出口等。
我最近实施了类似的东西为什么你在描述的。我开始通过创建一个EventManager类有一个"发布"和"订购"的方法。当该系统开始起,就扫描所有装载的集会(图书馆)的类,实施IEventListener的界面:
/// <summary>
/// A class that intends to listen for specific events to be published by an
/// event manager.
/// <see cref="EventManager"/>
/// </summary>
public interface IEventListener
{
/// <summary>
/// Subscribes to the event types that this listener wishes to listen for.
/// </summary>
/// <param name="eventManager"></param>
void RegisterSubscriptions(EventManager eventManager);
}
...并呼吁RegisterSubscriptions方法上的每个人。(只有一个实例EventManager,获取用;我使用依赖注射,以结合它作为一个单独的实例。)
RegisterSubscriptions会简单地调订阅方法为每个事件的类型和处理程序给予类目的是处理。(我采用。净,因此事件和处理程序更容易一些工作,但是你可以做同样的事情在Java使用匿名子类。)
一个典型的事件可能会喜欢的东西RoomEntered,并将参与此相关的活动将包括室编号,也许一些其他的相关属性的房间。游戏引擎发布的这个事件当用户进入一个房间,提供适当的事件的参数那个房间,和EventManager类是那么负责任的援引的每一处理程序已经订购这一事件的类型。一个处理程序对于这种事件可能是"HandleEnterRoomWithMonsters",它将检查是否设有怪物,并执行相应的行动。
这不会有意义的整体?你有任何问题,关于这种方法?