【问题标题】:Implementing exits in a text adventure在文本冒险中实现退出
【发布时间】:2012-04-16 14:56:48
【问题描述】:

我正在为 Java 编程课程编写文本冒险游戏。我正在设置带有父 abstract 房间类的房间,每个房间都将从中继承和配置。

对于出口,房间只会调用.addExit() 方法并传递一个出口对象。游戏应该只有每个房间的一个实例。退出对象应该有一个 target 字段,指向在构造函数中初始化的游戏房间之一。

我的问题是我不知道如何将退出构造函数传递给预先存在的房间引用而不是新的房间对象。在我看来,有两种可能的方式:

  1. 直接向出口构造函数传递对房间实例的引用。
  2. 有一个静态类来跟踪所有房间实例,并有从字符串名称或类等返回实例的方法。
    然后向出口对象的构造函数传递一种标识目标房间的方法,例如一个唯一的字符串名称,然后对象构造函数使用该方法调用返回房间实例的静态类方法之一。

我不确定哪个是最好的选择,如何实现这两个选项,或者是否有更好的方法。

【问题讨论】:

  • 听起来像是(双)链表模式。
  • 你过于复杂了
  • 房间对象不只是将它们的this 传递给 addExit 构造函数吗?

标签: java oop text adventure


【解决方案1】:

我不认为为每个房间单独上课是个好主意。使用单个 Room 类可能会更好,其中每个实例代表一个单独的房间。 (我知道 MUD 是这样编码的,但即使在那里你也有“虚拟”)

但除此之外,问题是:Exit 是房间的财产还是可以而且应该单独管理的东西?

答案取决于您想对这些Exits 做什么。例如,如果您想强制执行双向出口(也就是说,如果房间 A 到 B 有一个出口,那么从 B 到 A 应该有一个出口),一个单独的出口管理类可能是合适的。但是,如果您只需要能够列出一个房间中的所有出口,然后通过其中一个移动到另一个,它们可以是Room 的属性。

如果事先不知道,先从简单的开始(每个房间单独添加出口),如果不起作用,您可以随时切换到更复杂的解决方案。

【讨论】:

  • 出于我的目的,出口不是房间的财产。我的主要问题是如何将房间实例引用传递给出口对象。另外,如果不是每个房间单独上课,你有什么建议?如果每个房间都在一个地方初始化,那么很快就会变得混乱。
  • @Hussain 理想情况下,它将从配置中初始化。然后您的原始问题也将得到解决,因为您可以在阅读配置时添加出口。
  • 对不起,我不关注。从配置中初始化是指通过从文本文件中解析配置来配置对象,还是在配置函数中完成所有操作,或者?
  • @Hussain 我的意思是使用配置文件,是的。这意味着每个房间都必须有一个唯一的 ID,并且当您解析配置时,您会构建一个 HashMap 的 ID 和相应的房间对象。从那里添加出口应该很容易。
【解决方案2】:

你太复杂了

这里有一个例子说明如何做到这一点


    public abstract static class Room {
        List exits = new ArrayList();
        public void addExit(Room r) {
           exits.add(r);
        }
    }

【讨论】:

  • 出口有自己的属性,所以有一个专门的出口类不是一个坏主意。
  • List exits 应该是Map<Direction, Room> exits,然后你可以例如写exits.put(WEST, roomWhereLifeIsPeaceful)exits.put(HUBWARDS, entranceToAnkhMorpork)
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多