[英]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
類型。 然后從構造函數中刪除north
, south
, east
, west
參數。 設置房間的代碼如下所示
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.