程序地牢生成:是否有一种简单的算法来确保所有这些房间都使用最少的走廊连接起来?


9

是否可以得到一个像蜂巢一样的结构,连接所有房间而没有太多的走廊?(太多是来自一个房间的3-4条走廊)

以下是我的房间外观的输出,基本上是它们随机放置的。

网格房间的输出,随机放置

我希望能在走廊上有所作为。

http://i.imgur.com/9GUi6Yy.png


我不认为3或4是“走廊太多”。特别是如果您的地牢中有9个房间。另外,我不确定您所说的“蜂巢状结构”是什么意思,能否详细说明您要寻找的外观?

也许包括一张“完成的”地图,以显示您感兴趣的东西。
MichaelHouse

是的,我的意思是每个房间最多只能容纳3或4个走廊。
Blenderer

我添加了一张我正在努力的走廊图像。
Blenderer

2
如果没有任何房间的3条走廊,则只能对这些房间进行简单的线性连接,因此只需选择一个,然后将其连接到其最近的两个不相连的邻居即可。
尼克,

Answers:


6

好吧,我想到的最简单的方法是确保所有房间至少由1条走廊连接起来:

  1. 从最后一个房间或第一个房间开始。
  2. 在1个距离内抓取一个随机房间,该房间尚未连接到某个房间(所有房间开始断开连接,因此您在进行过程中将一直保持跟踪状态)。
  3. 如果没有这样的房间,请转到距离+1。如果可以在其他房间上方/下方穿行,则假设您不想连接走廊,这样会更容易。
  4. 伪随机地进行操作,直到所有房间都连接好为止。

现在我们知道您可以进入所有房间,但是现在,如果您想要的不仅仅是这种严格的线性迷宫,您可以单步穿过您的房间并随机创建一条新的连接房间的路径,每个房间最多可容纳2-3个,或者直到一定百分比的房间达到最大连接数-等等。

最后,您可以添加规则,以更改结果以适合各种情况。例如,您可能会发现,按照定义,只有1个走廊的任何房间都是死胡同;您可以做出更多死胡同,或者可以通过确保所有事物至少具有2个连接来消除它们。您可以使死胡同有一个秘密通道。您可以确保老板房间是死胡同。您可以确保起始房间是一个死胡同,但是请确保第二个房间的X连接数最少。广告无限。

每个假设和规则都可以从根本上改变您的关卡外观,但这很有趣!这至少应该使您开始蜂巢/类似洞穴的房间。


这与Kruskal的最小生成树算法非常接近-将2中的条件从“尚未连接到某个房间”修改为“尚未连接到同一集群 ”,从而修复了上述规则中的错误每个房间都连接到某个房间,但整个地牢仍然形成多个不相连的岛屿的情况。保证Kruskal可以找到具有最小总走廊长度的连接图。
DMGregory


2

由于这些房间是嵌入在2d平原中的图顶点,因此从理论上讲,这可以通过解决旅行商问题来解决(只有几个房间就可以了)。显然,简单的启发式就可以了,并允许合理的可伸缩性。

您计算所有房间之间的边缘(走廊长度)。您按长度对其进行排序。您添加最短的道路,除非它创建一个循环或将顶点(房间)的度数增加到所需的最大值(3-4)(重复)之上。要检查周期,可以应用UnionFind或对小数据进行快速BFS。


这个答案比公认的答案要好。首先选择最短连接走廊的贪婪策略应该起作用。为避免循环,请勿与已连接走廊的房间建立连接。
Jelle van Campen

@JellevanCampen谢谢。;)您可能有两个隔离的连接组件。因此,您可能要使用联合查找或与BFS进行检查,看看两个节点是否已连接。
AturSams,2015年

是的,您的权利,我不好。
Jelle van Campen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.