2010-11-23 103 views
4

我目前正在创建一个简单的基于控制台的游戏,玩家可以在不同的房间之间移动,拿起和使用物品,并吃东西。在游戏目前的状态下就是这样。帮助程序设计

我需要的是帮助:

创造良好的“事件”类我的比赛。我希望它的工作方式是每个项目和房间都应该能够与一个事件相关联。

由于我是新来的这一点,我会很感激有关这种程序的任何阅读材料,或作为建议,怎么会是最好的设置我的课(ES)考虑下面点,或简单地如何攻击这种问题(即无法决定如何设置类)

我希望能够创建不同类型的事件,例如:

  • 输出一些文字,然后问玩家的问题。如果玩家给出了正确的答案,请做一些事情。

  • 输出一些文字,然后从玩家的库存中移除一个物品,然后将玩家移动到另一个房间。

我试图避免:

  • 游戏的整个的一点是要养成良好的一流的设计,这样的东西,如责任驱动设计,凝聚力和耦合是重要方面。因此我希望它尽可能简单,可重用和独立。

  • 必须对每个事件进行硬编码,以便项目或房间只需调用Event类中的特定方法。

我此刻在想什么:

创建几个子类,这样我可以如创造新的事件(和它们相关联)使用: itemObject.setEvent(新事件(新问题(“introText”,“outroText”,“correctAnswer”)));

请让我知道是否需要更多信息! 谢谢!

+0

您能更具体地处理您的问题吗? – jzd 2010-11-23 17:51:00

回答

2

游戏编程宝石书很棒......虽然有点贵。

你也许可以找到相关文章或两个以上的GameDev's Article list,并可能有一些好东西埋在their forums

至于事件类,你几乎可以肯定要使用一些一些子类(MoveEvent一个基类,InventoryEvent等)。如果你想真的想要避免硬编码的东西,你应该在数据文件中定义你的游戏。房间,物品和事件...以及稍后您将要粘贴的任何内容。你用来定义事物的格式完全取决于你。我推荐一些可以给你实践经验的东西,因为这是一个学习练习:例如你没有使用的XML解析器。不是最有效的解析格式,但这是一个控制台游戏,所以这不是一个问题。

我对事件子类的一个建议是将其他事件链接在一起。界面不会改变,它可以让你做一些事情,比如“把这个添加到玩家的库存中,把它拿走,并把它们移到这里”。

2

我会考虑的一件事是分离输入文本的解析以及从底层域模型生成输出文本。你的问题似乎混合在一起,而我认为问题的文本部分作为表示层。

例如,您的域名可能包括以下接口:

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); 
1

我最近实施了类似于你描述的东西。我从创建一个具有“发布”和“订阅”方法的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将简单地调用给定类所针对的每个事件类型和处理程序的Subscribe方法处理。 (我使用的是.NET,因此事件和处理程序可以更容易地使用,但是您可以使用匿名子类在Java中执行相同的操作。)

典型事件可能类似于RoomEntered和参数与此活动相关的信息将包括房间ID以及有关房间的其他一些属性。游戏引擎在用户进入房间时发布此事件,为该房间提供适当的事件参数,然后EventManager类负责调用订阅了该事件类型的每个处理程序。此事件的一个处理程序可能是“HandleEnterRoomWithMonsters”,它会检查房间是否有怪物,并相应地执行操作。

这是否有意义的整体?你对这种方法有任何疑问吗?

2

当谈到事件时,想起observer pattern。你可以将你的游戏想象成由几台状态机内部呈现(你也可以在维基百科上查看,因为我是新来的,所以我不能自己添加第二个链接)。从一个阶段到另一个阶段的每个过渡都是一个事件,可以传达给该事件的注册观察者。

在例如:

USE KEY ON LOCK:触发清除键和门的开口;在没有额外的用户互动(开门)的情况下暗含“下降”到下一个事件:触发具有额外出口的房间等。