减少图的边数,使其保持连接状态


10

我正在设计一个带有随机生成的地牢的游戏。我想将其视为一个连接的,无向的图,其中节点是房间,边缘是门或走廊。然后,我选择一个“侧面”节点作为地牢入口,计算该入口与所有其他节点之间的距离,并确定最远的节点之一是地牢的“目标”(宝藏,上司,公主等)。

我看到了两种生成最终地牢地形的方法:

  • 首先生成一个随机图,然后在考虑边缘连接的情况下尝试用随机位置的房间填充2d世界。我认为这有时会很困难,因为可能会将房间生成器“锁定”以尝试将其放置在不可能的地方。
  • 生成第一个房间,将它们随机放置在合适的位置,然后将结果映射到节点和边缘。我决定尝试一下。

我的想法包括:

  • 首先生成一个包含整个地下城的大房间。
  • 在大房间内的任意位置放置一堵墙,将大房间分成2个不同面积的小房间。
  • 然后,我继续将每个房间划分为2个,直到它们变得太小或房间总数达到最大值(或其他任何条件)为止。每个新房间都是一个节点。
  • 完成后,我检查每个房间并找到所有其他相邻的房间,将2个节点标记为通过边连接。

这样,我确保所有房间在2D世界中都有可能的位置,并通过连接的图形正确映射。

我的问题是连接房间的门和走廊太多。

因此,我想使用一种算法来减少连接的无向图的边数,但最后保持连接状态(所有节点保持可达)。


如果您想知道,您的想法基本上是一个二叉搜索树。我用了 它确实是相当不错的地牢,很容易。:)
共产党鸭子

2
仅供参考:完整的图形在所有顶点对之间都有边,因此(假设不允许有重复的边),您不能删除任何边而仍然有完整的图形。正确的术语是连通图
Michael Madsen

二进制搜索树,连接图,右。我对常规名称感到很失望。
Splo

Answers:


13

使用Prim的算法获取图形的最小生成树(添加随机权重,或在入口附近添加更高的权重,或执行您选择的算法),然后随机重新添加一些门/边缘。这样,您将拥有所有连接的房间以及一些额外的冗余路径。


1
哦,对了,当然是最小的生成树了!好主意,谢谢。
Splo


0

Inkwell Ideas此列表中的某些地牢生成器是开源的或提供有关其算法的文档。Google也会通过搜索“ [[programminglanguagename]地牢生成器””为您提供丰富的信息。不幸的是,尽管这是我遇到过的最详尽的文献,但无论哪种方法都找不到我的最爱,而且由于最近我在一次硬盘崩溃中丢失了它,所以我不记得它的名字了。在该驱动器上执行恢复后,我将更新此答案。

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.