所以我得到了这一代房间,不同的房间通过走廊相连。 现在我希望玩家在房间的死胡同之一重生。为了检查死胡同,我只需扫描走廊的每个方向并将计数存储在变量中。如果这个变量等于1,房间应该是一个死胡同。问题是,并不是所有的死胡同都被识别出来,有时,即使是普通的房间也被列为死胡同。 这是示例生成的图片。粉色中心是公认的死胡同。绿点是房间中心,橙色点是围绕中心检查的走廊。仍然存在绿色死胡同。这是重要的代码,基本上只是循环所有房间和走廊位置,其中位置保存在哈希集中
int roomCorridorCount = 0;
HashSet<Vector2Int> corridors = ConnectRooms(roomCenters);
HashSet<Vector2Int> deadEnds = new HashSet<Vector2Int>();
HashSet<Vector2Int> nearRoomCenter = new HashSet<Vector2Int>();
HashSet<Vector2Int> oneCorridorRooms = new HashSet<Vector2Int>();
foreach (var room in newRoomCenters)
{
foreach (var corridor in corridors)
{
if(new Vector2Int(room.x + 1, room.y) == corridor)
{
roomCorridorCount++;
nearRoomCenter.Add(new Vector2Int(room.x + 1, room.y));
}
if (new Vector2Int(room.x - 1, room.y) == corridor)
{
roomCorridorCount++;
nearRoomCenter.Add(new Vector2Int(room.x - 1, room.y));
}
if(new Vector2Int(room.x, room.y + 1) == corridor)
{
roomCorridorCount++;
nearRoomCenter.Add(new Vector2Int(room.x, room.y + 1));
}
if(new Vector2Int(room.x, room.y - 1) == corridor)
{
roomCorridorCount++;
nearRoomCenter.Add(new Vector2Int(room.x, room.y - 1));
}
}
if (roomCorridorCount == 1)
{
deadEnds.Add(room);
oneCorridorRooms.Add(room);
}
}
tilemapVisualizer.PaintTiles(corridors, floorMap, white);
tilemapVisualizer.PaintTiles(newRoomCenters, floorMap, green);
tilemapVisualizer.PaintTiles(nearRoomCenter, floorMap, orange);
tilemapVisualizer.PaintTiles(oneCorridorRooms, floorMap, pink);
floor.UnionWith(corridors);
var playerSpawnRoom = deadEnds.ElementAt(Random.Range(0, deadEnds.Count));
Debug.Log(deadEnds.Count);
这是变量 uff 缺少重置。对于@derHugo,我只想在所有死胡同中拥有两个房间,所以不得到每个房间是完全可以的