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

时间:2014-10-08 00:52:14

标签: java class object

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

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

到目前为止,这是我的代码,我已经编写了人员和项目的类,但我决定将其删除,因为它不相关。

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;
    }
}

这似乎非常复杂。有没有办法以不同的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

不要......

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类。这个想法可能是创建一个房间的二维矩阵,Map可以查找给定的房间并确定玩家可以移动的方向。null单元格意味着它被阻挡,非null单元格将是玩家可以进入的房间。

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

我想这取决于你想要多少复杂性......

答案 1 :(得分:0)

我认为可能有问题的一件事是你创造了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 = new Room(...)时,您会创建另一个“西”出口为roomA的新对象。请注意,现在您有一个“房间B”对象,其西门通向“房间A”,但同样的“房间A”有一个东门,通向不同的“房间B”对象。基本上,您有两个(或更多)不同的对象占用网格上的相同空间。我怀疑这不是你想要的。

当你创建指向彼此的新对象时,我认为你无法单独使用“new”。更好的方法是将方法添加到Room,如

setExit(Direction direction, Room destination)

其中Direction是类似enum的{​​{1}}类型。然后从构造函数中删除public enum Direction { NORTH, SOUTH, EAST, WEST, }northsoutheast参数。设置房间的代码看起来像

west

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