Java 在同一类的实例之间创建连接

Java 在同一类的实例之间创建连接,java,class,object,Java,Class,Object,我的任务是创建一个基于文本的游戏,在其中创建三个类。房间、物品和人员。在这里,人们可以在有物品的房间之间移动 我不完全明白我应该如何在房间之间建立连接 这是到目前为止我的代码,我也为个人和物品编写了类,但我决定将其删除,因为它与此无关 public class Game { public static void main(String[] args) { //I don't like this part of my code. Room roomA =

我的任务是创建一个基于文本的游戏,在其中创建三个类。房间、物品和人员。在这里,人们可以在有物品的房间之间移动

我不完全明白我应该如何在房间之间建立连接

这是到目前为止我的代码,我也为个人和物品编写了类,但我决定将其删除,因为它与此无关

public class Game {

    public static void main(String[] args) {

        //I don't like this part of my code.
        Room roomA = new Room();
        Room roomB = new Room();
        Room roomC = new Room();
        Room roomD = new Room();
        roomA = new Room(null,roomD,roomB,null);
        roomB = new Room(null,null,roomC,roomA);
        roomC = new Room(null,null,null,roomB);
        roomD = new Room(roomA,null,null,null);
        roomA = new Room(null,roomD,roomB,null);
        roomB = new Room(null,null,roomC,roomA);
        roomC = new Room(null,null,null,roomB);
    }
}

class Room {
    Room[] exit = new Room[4];

    public Room() {

    }
    public Room(Room north, Room south, Room east, Room west) {
        exit[0] = north;
        exit[1] = south;
        exit[2] = east;
        exit[3] = west;
    }
}
这对于它应该做的事情来说似乎非常复杂。有什么不同的方法吗?

不要这样做

Room roomA = new Room();
Room roomB = new Room();
Room roomC = new Room();
Room roomD = new Room();
roomA = new Room(null,roomD,roomB,null);
//...
您正在分配房间,这将破坏它们的引用,使其无法导航

如果你想更容易使用,你可以考虑使用方法链接…

roomA.southExit(roomD).eastExit(roomB);
可能看起来像

class Room {
    Room[] exit = new Room[4];

    public Room() {

    }

    public Room southExit(Room room) {
        exit[1] = room;
        return this;
    }

    public Room eastExit(Room room) {
        exit[2] = room;
        return this;
    }

    //...
}
另一种方法可能是创建管理导航的
Map
类。想法可能是创建一个房间的2D矩阵,
Map
可以查找给定的房间,并确定玩家可以进入的方向。一个
null
单元格将意味着它被阻止,一个非
null
单元格将是玩家可以进入的房间

从概念上讲,你可以在一张纸上画一个网格,并在上面画出房间,这将为你提供矩阵的“可视”表示。然后,您可能需要将其转换为代码,可能需要使用一个2D房间数组,但我会将其包装在
Map
类中,以使其更易于查询和管理,但这就是我


我想这取决于你想要多复杂…

有一件事我认为可能是个问题,那就是你正在创建11个房间。我不确定这是否是您想要的,但是如果您只想创建4,那么这段代码将有问题。例如:

    roomB = new Room(null,null,roomC,roomA);
    ...
    roomA = new Room(null,roomD,roomB,null);
    roomB = new Room(null,null,roomC,roomA);
roomB
将被设置为新对象。创建
roomA
时,将对其进行设置,使其“东”出口指向您创建的
roomB
。但是后来,当您再次说
roomB=newroom(…)
时,您创建了另一个新对象,其“west”出口是
roomA
。请注意,现在有一个“room B”对象,其西门指向“room a”,但同一个“room a”有一个东门指向一个不同的“room B”对象。基本上,网格上有两个(或更多)不同的对象占据相同的空间。我怀疑这不是你想要的

我认为,当你创建相互指向的新对象时,你不能仅用“新建”来完成。最好在
Room
like中添加一个方法

setExit(Direction direction, Room destination)
其中,
Direction
是一个
enum
类型,具有类似的
公共enum Direction{北、南、东、西}
。然后从构造函数中删除
西
参数。设置房间的代码如下所示

roomA = new Room();
...
roomD = new Room();
roomA.setExit(Direction.SOUTH, roomD);
roomA.setExit(Direction.EAST, roomB);
roomB.setExit(Direction.EAST, roomC);
roomB.setExit(Direction.WEST, roomA);
... and so on

现在你只有四个对象,它们的出口可以相互引用,我想这就是你想要的

到目前为止还不错,为什么这是个问题?如果你想让我的代码使用起来更简单,你可以使用方法链接……是的,我想让我的代码更简单,让那些要检查我的代码的人能够理解。方法链接是一个硬概念吗?它有点多余,因为您必须指定同一连接的两侧。您可以安排一个房间的二维矩阵,并让程序将其连接起来<代码>房间[][]房间=新房间[][{{roomA,roomB},{roomC,roomD}在另一个类门/通道/连接中维护房间之间的连接如何?StackOverflow不是要求代码审查的地方。