Java 帮助进行程序设计
我目前正在创建一个简单的基于控制台的游戏,玩家可以在不同的房间之间移动,拿起和使用物品,吃东西。在游戏的当前状态下,就是这样 我需要的帮助是: 为我的游戏创建一个好的“事件”类。我希望它的工作方式是,每个项目和房间都应该能够与一个事件相关联 由于我是新手,我希望阅读任何与此类程序相关的阅读材料,或建议如何最好地设置我的课程,考虑以下几点,或仅仅是如何解决此类问题(即在决定如何设置课程时遇到困难) 我希望能够创建不同类型的事件,例如:Java 帮助进行程序设计,java,class-design,loose-coupling,cohesion,Java,Class Design,Loose Coupling,Cohesion,我目前正在创建一个简单的基于控制台的游戏,玩家可以在不同的房间之间移动,拿起和使用物品,吃东西。在游戏的当前状态下,就是这样 我需要的帮助是: 为我的游戏创建一个好的“事件”类。我希望它的工作方式是,每个项目和房间都应该能够与一个事件相关联 由于我是新手,我希望阅读任何与此类程序相关的阅读材料,或建议如何最好地设置我的课程,考虑以下几点,或仅仅是如何解决此类问题(即在决定如何设置课程时遇到困难) 我希望能够创建不同类型的事件,例如: 输出一些文本,然后问玩家一个问题。如果玩家给出了正确的答案,
- 输出一些文本,然后问玩家一个问题。如果玩家给出了正确的答案,就做点什么
- 输出一些文本,然后从播放器的目录中删除一个项目,然后将播放器移动到另一个房间
- 整个游戏的重点是实践良好的类设计,因此责任驱动设计、内聚和耦合等都是重要的方面。因此,我希望它尽可能简单、可重用和独立
- 必须对每个事件进行硬编码,以便项目或房间只调用事件类中的特定方法
谢谢强> 我想考虑的是分离输入文本的解析和从基础域模型生成输出文本。你的问题似乎把这两个问题混合在一起,而我认为问题的文本部分是表示层。 例如,您的域可以由以下接口组成:
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);
我最近实现了一些类似于您所描述的东西。我首先创建了一个EventManager类,该类具有“Publish”和“Subscribe”方法。系统启动时,会扫描所有加载的程序集(库),查找实现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);
}
//
///一个类,用于侦听将由发布的特定事件
///事件管理器。
///
///
公共接口IEventListener
{
///
///订阅此侦听器希望侦听的事件类型。
///
///
作废注册表订阅(EventManager EventManager);
}
。。。并对它们中的每一个调用RegisterSubscriptions方法。(EventManager只有一个实例在任何地方都可以使用;我使用依赖项注入将其绑定为单例实例。)
RegisterSubscriptions只需为给定类要处理的每个事件类型和处理程序调用Subscribe方法。(我使用的是.NET,因此事件和处理程序更容易处理,但您可以在Java中使用匿名子类执行相同的操作。)
典型的事件可能类似于RoomEnter,与此事件关联的参数可能包括房间ID以及房间的其他一些属性。当用户进入房间时,游戏引擎发布此事件,为该房间提供适当的事件参数,然后EventManager类负责调用订阅该事件类型的每个处理程序。此事件的一个处理程序可能是“HandleInterroomWithMonsters”,它检查房间是否有怪物,并相应地执行操作
总的来说,这有意义吗?你对这种方法有什么疑问吗?游戏编程珍宝书很棒。。。虽然有点贵 你可能会在上面找到一两篇相关的文章,里面可能有一些好东西 对于事件类,您几乎肯定希望基类包含一些子类(MoveEvent、InventoryEvent等)。如果你真的想避免硬编码,你应该在数据文件中定义你的游戏。房间、项目和活动。。。再加上你以后附加的任何东西。你用来定义事物的格式完全取决于你自己。我推荐一些可以给您带来实际经验的东西,因为这是一个学习练习:例如,您没有使用过的XML解析器。不是最有效的解析格式,但这是一个控制台游戏,所以这不是一个问题
我对事件子类的一个建议是可以将其他事件链接在一起。界面不会改变,它允许你做一些事情,比如“把这个添加到玩家的库存中,把它拿走,然后把它们移到这里”。当谈到事件时,你会想到。你可以想象你的游戏是由几个状态机在内部呈现的(你也可以在维基百科上找到这个,我自己也不能添加第二个链接,因为我是新加入的)。从一个阶段到另一个阶段的每个转换都是一个事件,可以与该事件的注册OBERServer进行通信 例如:
在锁上使用钥匙:触发钥匙取出和车门打开;在没有额外用户交互(开门)的情况下,隐式地“级联”到下一个事件:触发房间有额外的出口等。你能更具体地回答你的问题吗?@jzd:公平地说,我会说这是一个相当详细的问题。@Adamski抱歉,看起来我不知怎的误读了第三段有他的根本问题