2D 房间的程序生成

问题描述 投票:0回答:3

我想生成一个由相连的房间组成的综合体。每个房间旁边可以有1-4个房间。

Room complex

我的算法生成了这个由相连房间组成的复合体。

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
}

在创建新房间之前,我想检查新房间的位置是否已经有房间。有没有比遍历所有房间并检查位置是否与新房间的位置匹配更简单的方法?

c# algorithm unity-game-engine procedural-generation
3个回答
2
投票

如果您在创建新房间之前已经决定了新房间的位置,并且考虑到您的房间位于列表或类似的内容中,则可以使用与此类似的内容:

var existingRoom = (from room in rooms where room.roomOffset = newRoomOffset select room).Any();

如果返回

true
,则该位置已存在房间。

如果您不想使用 linq,您可以创建一个多维数组,其中每个元素对应于一个可能的房间位置,并检查数组中是否存在房间。


1
投票

我知道你可能已经确定了你的解决方案并且有很好的理由,但我将在这里留下我将如何做到这一点:

假设房间不仅仅是一个提供迷宫的空空间(可以包含敌人,宝藏等),我会创建一个

Room
数组
rooms[,]
(否则
bool[,]
就足够了)。

我有一个具有最大允许迷宫尺寸的应用程序级别常量(或用户选项),并且我将相应地创建我的数组:

rooms[MAXDIMENSION, MAXDIMENSION]

然后我的算法将通过分配房间实例来设置数组中的房间。第一个维度将代表北/南(行)遍历,第二个维度将代表东/西(列)遍历。

一个例子:

rooms = new [3,2] { { new Room(), new Room() }, {null, new Room()} , {new Room(), new Room() } };

相邻

null
单元格或数组范围边界意味着房间在该方向上没有路径。在示例中,如果起始节点是
[0,0]
,则可能的路径将是 东、西/南、北/南、北/西、东

请注意,来自任何给定房间的可能遍历不会包含在

Room
实例中,因为不再需要它;您可以在渲染迷宫时动态生成该信息,只需检查
rooms[x, y]
邻居。

这种方法的一个有趣的事情是它也可以扩展到迷宫级别。

room[,][MAXLEVELS]
其中最后一个维度代表级别数量。它们都共享相同的基本网格,并且动态检查 updown 遍历也同样容易。

只是一个想法...


0
投票

天哪,地板布局哈哈!11!!1111111111!!1!!!!!11

© www.soinside.com 2019 - 2024. All rights reserved.