Java 在文本冒险中实现出口

Java 在文本冒险中实现出口,java,oop,text,adventure,Java,Oop,Text,Adventure,我正在为一个Java编程类编写一个文本冒险游戏。我正在使用父类abstractroom类设置文件室,每个文件室将继承并配置该类 对于出口,文件室将只调用.addExit()方法并向其传递一个出口对象。游戏应该只有每个房间的一个实例。exit对象应该有一个目标字段,指向在构造函数中初始化的游戏房间之一 我的问题是我不知道如何向出口构造函数传递一个预先存在的房间引用,而不是一个新的房间对象。在我看来,有两种可能的方式: 直接向出口构造函数传递对文件室实例的引用 拥有一个跟踪所有房间实例的静态类,并具

我正在为一个Java编程类编写一个文本冒险游戏。我正在使用父类
abstract
room类设置文件室,每个文件室将继承并配置该类

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

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

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

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

    你把这件事复杂化了

    下面是一个如何做到这一点的示例

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

    你把这件事搞得太复杂了

    下面是一个如何做到这一点的示例

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

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

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

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


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

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

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

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


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

    听起来像是(双出口)链表模式。这太复杂了。文件室对象不是将其
    this
    传递给addExit构造函数吗?听起来像是(双)链表模式。这太复杂了吗?文件室对象不是将其
    this
    传递给addExit构造函数吗?尽管出口有自己的属性,因此,拥有一个专用的出口类并不是一个坏主意。
    列表出口
    可能应该是
    映射出口
    ,然后您可以例如编写
    出口.put(WEST,RoomWhereLifeispeacure)
    出口.put(Hubbwards,EntertoAnkhorWork)
    出口有自己的属性,因此,拥有一个专门的出口类并不是一个坏主意。
    列出出口
    可能应该是
    映射出口
    ,然后你可以例如编写
    出口。put(WEST,RoomwhereLifeispeacure)
    出口。put(Hubbwards,EntertoAnkhorWork)
    出口不是我的房间属性。我的主要问题是如何将房间实例引用传递给退出对象。另外,如果不是每个房间都有单独的课程,你有什么建议?如果每个房间都在一个地方初始化,那么很快就会变得杂乱无章。@Hussain理想情况下,它会从配置中初始化。然后,您原来的问题也会得到解决,因为您可以在阅读配置时添加出口。对不起,我不懂。从配置中初始化是指通过解析文本文件中的配置来配置对象,还是在配置函数中执行所有操作,还是?@Hussain我指的是使用配置文件,是的。这意味着每个房间都必须有一个唯一的id,在解析配置时,您需要构建id和相应房间对象的
    HashMap
    。从那里添加出口应该很容易。出口不是房间的财产。我的主要问题是如何将房间实例引用传递给退出对象。另外,如果不是每个房间都有单独的课程,你有什么建议?如果每个房间都在一个地方初始化,那么很快就会变得杂乱无章。@Hussain理想情况下,它会从配置中初始化。然后,您原来的问题也会得到解决,因为您可以在阅读配置时添加出口。对不起,我不懂。从配置中初始化是指通过解析文本文件中的配置来配置对象,还是在配置函数中执行所有操作,还是?@Hussain我指的是使用配置文件,是的。这意味着每个房间都必须有一个唯一的id