簡體   English   中英

在相同類的實例之間創建連接

[英]Creating a connection between instances of the same class

我的任務是創建一個基於文本的游戲,在其中創建三個類。 房間,物品和人。 人員可以在其中有物品的房間之間移動的地方。

我不完全了解如何在房間之間建立連接。

到目前為止,這是我的代碼,我也對人員和物品的類進行了編碼,但由於不相關,因此決定將其省略。

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 但是稍后,當您再次說roomB = new Room(...)時,您將創建另一個新對象,其“西”出口為roomA 請注意,現在您有一個“房間B”對象,該對象的西門指向“房間A”,但是同一“房間A”的東門則指向另一個 “房間B”對象。 基本上,您有兩個(或更多)不同的對象在網格上占據相同的空間。 我懷疑這不是您想要的。

我認為,當您創建指向彼此的新對象時,您不能僅憑“新”來做到這一點。 最好是向Room添加一個方法,例如

setExit(Direction direction, Room destination)

其中Direction是與public enum Direction { NORTH, SOUTH, EAST, WEST, }相似的enum類型。 然后從構造函數中刪除northsoutheastwest參數。 設置房間的代碼如下所示

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

現在您只有四個對象,它們的出口可能互相引用,我認為這是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM