我想生成一个连通房的复合体。每个房间旁边都有1-4个房间。
我的algorythm产生了这个连通房的复杂。
public class Room
{
private Room top = null; //Connected rooms
private Room right = null;
private Room bottom = null;
private Room left = null;
private Vector2 roomOffset; //Position of the room
}
在创建新房间之前,我想检查新房间的位置是否已有房间。是否有比通过所有房间更简单的方法并检查位置是否与新房间的位置匹配?
答案 0 :(得分:2)
如果您在新房间之前确定了新房间的位置,并且假设您将房间列入清单或类似内容,则可以使用类似的内容:
var existingRoom = (from room in rooms where room.roomOffset = newRoomOffset select room).Any();
如果返回true
,则该位置已存在一个房间。
如果您不想使用linq,您可以创建一个多维数组,其中每个元素对应一个可能的房间位置,并检查数组中是否存在房间。
答案 1 :(得分:1)
我知道你的解决方案很可能是出于很好的理由,但我会离开这里,我是怎么做到的:
假设房间不仅是一个提供迷宫的空地(可以包含敌人,宝藏等)我还要创建Room
数组rooms[,]
(否则bool[,]
就够了。)
我有一个应用程序级别常量(或用户选项),其中包含最大允许的迷宫维度,并且我会相应地创建我的数组:rooms[MAXDIMENSION, MAXDIMENSION]
。
然后我的算法只是通过分配房间实例来设置我的阵列中的房间。第一维代表北/南(行)遍历,第二维代表东/西(列)遍历。
一个例子:
rooms = new [3,2] { { new Room(), new Room() }, {null, new Room()} , {new Room(), new Room() } };
Neigbooring null
单元格或数组范围边界将意味着在该方向上没有路径的房间。在示例中,如果起始节点为[0,0]
,则可能的路径将是东,西/南,北/南,北/西,东。
请注意,来自任何给定房间的可能遍历不会是Room
实例中包含的信息,因为不再需要它;您可以在渲染迷宫时动态生成该信息,只需检查rooms[x, y]
个邻居。
这种方法的一个有趣的事情是,它也可以扩展到迷宫。 room[,][MAXLEVELS]
,其中最后一个维度代表级别数量。他们都共享相同的基本网格,动态检查 up 和 down 遍历也同样容易。
只是一个想法......