Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 帮助进行程序设计_Java_Class Design_Loose Coupling_Cohesion - Fatal编程技术网

Java 帮助进行程序设计

Java 帮助进行程序设计,java,class-design,loose-coupling,cohesion,Java,Class Design,Loose Coupling,Cohesion,我目前正在创建一个简单的基于控制台的游戏,玩家可以在不同的房间之间移动,拿起和使用物品,吃东西。在游戏的当前状态下,就是这样 我需要的帮助是: 为我的游戏创建一个好的“事件”类。我希望它的工作方式是,每个项目和房间都应该能够与一个事件相关联 由于我是新手,我希望阅读任何与此类程序相关的阅读材料,或建议如何最好地设置我的课程,考虑以下几点,或仅仅是如何解决此类问题(即在决定如何设置课程时遇到困难) 我希望能够创建不同类型的事件,例如: 输出一些文本,然后问玩家一个问题。如果玩家给出了正确的答案,

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

我需要的帮助是:

为我的游戏创建一个好的“事件”类。我希望它的工作方式是,每个项目和房间都应该能够与一个事件相关联

由于我是新手,我希望阅读任何与此类程序相关的阅读材料,或建议如何最好地设置我的课程,考虑以下几点,或仅仅是如何解决此类问题(即在决定如何设置课程时遇到困难)

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

  • 输出一些文本,然后问玩家一个问题。如果玩家给出了正确的答案,就做点什么

  • 输出一些文本,然后从播放器的目录中删除一个项目,然后将播放器移动到另一个房间

我想避免的是:

  • 整个游戏的重点是实践良好的类设计,因此责任驱动设计、内聚和耦合等都是重要的方面。因此,我希望它尽可能简单、可重用和独立

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

我此刻的想法:

创建一些子类,例如,我可以使用以下方法创建新事件(并将其关联): setEvent(新事件(新问题(“introText”、“outroText”、“correctAnswer”))

如果需要更多信息,请告诉我!
谢谢

我想考虑的是分离输入文本的解析和从基础域模型生成输出文本。你的问题似乎把这两个问题混合在一起,而我认为问题的文本部分是表示层。

例如,您的域可以由以下接口组成:

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抱歉,看起来我不知怎的误读了第三段有他的根本问题