【问题标题】:Procedural Generation of 2D Rooms2D房间的程序生成
【发布时间】:2014-11-09 16:36:05
【问题描述】:

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

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

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 unity3d procedural-generation


    【解决方案1】:

    如果您在制作新房间之前已经确定了新房间的位置,并且考虑到您将房间列在列表或类似内容中,则可以使用类似这样的内容:

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

    如果返回true,则该位置已存在一个房间。

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

    【讨论】:

      【解决方案2】:

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

      假设房间不仅是一个提供迷宫的空空间(可以包含敌人、宝藏等),我将创建一个 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] 最后一个维度代表级别的数量。它们都将共享相同的基本网格,并且动态检查 updown 遍历将同样容易。

      只是一个想法......

      【讨论】:

      • 我认为这是最好的解决方案。我做了一个新算法,使用数组更容易。
      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 2020-09-19
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多