gpt4 book ai didi

java - 房间/节点导航和管理连接

转载 作者:行者123 更新时间:2023-12-02 06:21:40 30 4
gpt4 key购买 nike

我有一个关于数据结构和类设计的问题(抱歉太长了)。为了简单起见,假设这是一个游戏,我想在房间之间导航(想象一系列 2D 非滚动屏幕,例如早期的银河战士/恶魔城)。每个房间可以有许多导出(例如上、下、左、右边缘,房间内也可能有门带你到其他地方,例如马里奥管道)。导出可能不是双向的,并且可能会发生变化。我猜你会称其为带环的有向无环图(不管那是什么!)。

无论如何,我真正需要知道的是特定房间(即当前房间 - 无需遍历整个 map ),可以导航到哪些房间(我可能希望向用户显示此列表或者假设我可以在某个时候获得特定的导出)。我想要最好的设计方法,避免所有基本陷阱,如紧密耦合、遵循 SRP 等。

我的第一个想法很简单(代码简化):

class RoomConnection {
Room toRoom;
int exitItem; //assume we can easily get/create this and represents the door/edge/etc
}

class Room {
int id;
List<RoomConnection> exits;
}

class Rooms {
List<Room> rooms;
Room getRoom(int id) {};
}

虽然这已经足够了,而且我的驱动程序不会过于复杂,但我不喜欢这样,原因如下:1. 看起来和房间连接紧密2.我想将这些东西存储在一个或多个平面文件中(例如文本文件或数据库表),因此希望避免嵌套结构

所以我的下一个想法是将它们分开:

class RoomConnection {
Room fromRoom;
Room toRoom;
int exitItem;
}

class RoomConnections {
List<RoomConnection> connections;
Room getExitsForRoom(Room room) {};
}

class Room {
//no reference to connections;
}

class Rooms {
List<Room> rooms;
Room getRoom(int id) {};
}

但我认为这只是为了它而添加列表管理器,它是否有更好的设计,因为它仍然将房间和房间连接紧密地联系起来,房间如何知道它的导出是什么?

所以我的最终想法是创建某种外观,要么:1. 如前面的示例,但删除 getExitsForRoom 并将其放入外观中,例如

class MapFacade {
RoomConnections connections;
Rooms rooms;

List<Room> getExitsForRoom(Room r) {}
//this or provide methods for managing rooms/connections here too
MapFacade(RoomConnections c, Rooms r) {}

}
  1. 完全放弃 Room 和 RoomConnections,让外观存储一个 List 和 List,并提供维护列表的方法,并提供 getExitsForRoom 等实用方法。

    类 MapFacade { 列表连接=新的ArrayList; 列出房间=new ArrayList;

    List<Room> getExitsForRoom(Room r) {}
    void addRoom(Room r);
    void addConnection(Room fromRoom, Room toRoom, int exitID) {}

    }

有人有什么想法吗?顺便说一句,我查看了各种图表,我想我可以使用它们来代替“外观”,但它似乎有点矫枉过正,并且没有提供一个明显的答案来说明房间如何获得导出或谁管理一切。

最佳答案

一种可能的类设计是:
- 定义一个Room类,给它的每个实例一个唯一的ID;您也可以在此处添加其他属性 - 房间/节点的属性
- 定义一个 RoomConnection 类(具有 startend 字段/两者都是 Room/类型,实际上您可能决定根本不在这里添加这两个属性);给它的每个实例一个唯一的ID;您也可以在此处添加其他属性 - RoomConnection/Arc 的属性
- 定义类 Graph,其中包含将每个房间(节点)映射到其传出房间连接(弧)列表的映射
- 现在在 Graph 中定义您需要的所有方法;图表将容纳一切
- 您可以将图表重用为 Room 和 RoomConnection 实例的工厂(只需添加适当的方法)

我想说,这是一个非常标准的图表表示。
它也支持多图(您可能有
两个节点之间有多个弧 A->B - 请注意唯一 ID)。

关于java - 房间/节点导航和管理连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20961432/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com