创建一个(真正的)随机迷宫的最佳逻辑

4
我一直在尝试制作一个简单的游戏来测试我的逻辑,它是一个简单的迷宫,很丑,到目前为止还很糟糕。引擎运行得非常好,因为迷宫已经存在(一个矩阵),所以它可能会很有趣,但我没有意图绘制一堆地图,这可能会在一个矩阵的400个字段上设置值。不好玩。然后我创建了一个函数来随机化它,为每个字段设置地板/墙壁,并且(我期望)并非每个地图都是可赢的。然后我又做了另一个函数来检查地图是否可玩(接收两个点,并检查它们之间是否有有效路径,然后我只传递起点和终点。非常巧妙),结果它起作用了。如果你还没有注意到,这是一个非常愚蠢的创建随机迷宫的方式,原因如下: 1 - 可能会很容易(大片的地面或一堵墙连在一起,只有一条非常明显的路径,形成一个愚蠢(尽管有效)的迷宫
2 - 这可能是创建完美随机迷宫的最快方法,但同时也可能是最慢的方法,需要无限长的时间。当我将网格设置为30x30或更多时(当某些内容没有溢出时),这种差异更加明显
3 - 这很愚蠢,是对逻辑本身的冒犯。

为了辩护自己,我并没有从一开始就计划以这种方式制作它,正如所述,一件事情引发了另一件事情。

因此,我开始思考如何制作一个美丽(充满路径,棘手且可赢得的)迷宫,然后我想到了制作微小的5x5块,并预先设计入口,然后将它们组合在一起,使其适合,但这将违反我的真正随机愿望,以及我不愿意手工绘制它的意愿。

我考虑了一个创建随机路径的函数,运行一次到结束,再运行几次接近结尾的地方,交叉和其他一些东西,有些会创造死胡同,这对我来说似乎更好,但我无法想象它能够创造出一个像样的迷宫。 您可以在此链接中查看我目前所做的。 注意:我没有任何意图使用任何方法损害任何人的电脑。
第一个打开它的人,请在这里评论说它是安全的。 - 已完成(谢谢,Jonno_FTW)
如果您仍然不信任它,请使用虚拟机。 注:我知道这不是开发任何东西的最佳方式。我应该得到一个像样的游戏引擎,等等,这是一种对自己的挑战。

2
问题是什么?此外,您是否对迷宫生成算法进行了任何研究?(http://en.wikipedia.org/wiki/Maze_generation_algorithm) - Mark Rushakoff
2
我宁愿说,这不是特定于某种编程语言的问题... - ShinTakezou
1
虽然我不是游戏设计方面的专家,但你在这些原则上挑战自己的精神值得赞扬。拥有“黑匣子”固然好,但如果你能通过场景来思考而不总是依赖“给定”,那么你未来基于知识的开发将会更加成功...在我看来...祝你好运。 - DRapp
4
我不怀疑有人会从某个随机来源下载可执行文件。 - dash-tom-bang
3
这个可执行文件是合法的。但是,当你点击新地图时,它会让你从之前的地图离开的位置开始,而不是原来左上角的位置。增加一个步数计数器也会很不错。我还希望能够增加一个更大的地图,至少让游戏变得有挑战性一些。 - Jonno_FTW
显示剩余7条评论
7个回答

5
我已经完成了迷宫的生成。你不想随机放置物品并进行验证,相反,你要从起点开始生成它。
选择一个起点,向一个随机方向移动。有一个随机概率选择一个新方向。永远不要移动到占用的方格中,如果撞到一个,当前路径就会结束。如果当前路径结束,请选择一个已经访问过的方格并选择一个新方向,像你为第一个方向做的随机漫步一样。重复直到迷宫达到所需的填充程度。
方向变化的概率应该是一个输入参数,因为它会产生很大的影响。请注意,如果你正在做一个三维迷宫,垂直转弯的几率应该比水平移动的几率低得多。

4

3

请查看我在Roguelike游戏Tyrant中的源代码:

Code for Dungeon.java

有许多不同的地图生成技术用于产生不同类型的关卡。但最基本的模式是迭代以下步骤:

  1. 从一个空白地图开始
  2. 在地图中创建一个随机房间/开放空间
  3. 随机选择当前开放区域边缘的一个图块
  4. 尝试从该空间“生长”一个走廊或房间(如果不适合,请不要进行任何操作)
  5. 重复步骤3,直到创建出一个像样的迷宫
  6. 最后,遍历整个地图,并将其余的空白空间转换为墙壁

这是一个截图,展示了你可以得到的类型(从迷宫结构的小地图中看):

Tyrant截图 http://www.freeimagehosting.net/uploads/af45502c9c.png


2

2

1

如何创建一个随机迷宫将取决于你想要的外观。如果你正在创建一个设计有很多死路的东西,那么你可以“随机”地从起点到终点跟踪路径,然后随机填充空白空间,基本上是从坚实的材料中雕刻出路径。例如,想象一下你有一块石碑。第一步是雕刻“解决方案”路径。然后你会进去制造所有的死路。

如果你想要的是更多的“游戏”而不是“谜题”,那么创建一堆拼合在不同方式的瓦片可能是正确的方法。这就是暗黑破坏神游戏所做的事情,据我所知;许多预先设计的“套装”和它们如何拼合的规则。你会用“三个开放空间后跟两个关闭”的东西标记块的四个侧面,然后如果另一个块也有匹配的描述,它们可以组合在一起。

之后,你只需要弄清楚如何始终呈现“随机”行为即可。


这对于制作更好的地形来说很有好处,但代价是远远没有足够的灵活性。细节可能会有所不同,但是由瓦片生成的关卡的基本特性都是相同的。你需要一个真正疯狂数量的瓦片才能避免这个问题。 - Loren Pechtel
好的,OP提出了交错式平铺的想法。在图形保真度和地图复杂度之间需要做出权衡。 - dash-tom-bang

1

实际上,Al Lowe 在他的 Leisure Suit Larry 游戏之一(我相信是 LSL 3)中使用了一个技巧,可能会有所帮助。

基本上,他制作了一个竹林“迷宫”,玩家必须穿越其中。然而,他并没有为每个屏幕创建单独的迷宫“方块”,而是简单地“翻转”了他已经创建的一个屏幕,并通过用单个“竹墙”图形阻挡各种入口来制造死胡同。

也许你可以做同样的事情:让生成器雕刻出一个有效的迷宫,然后告诉它在某些路径上放置死胡同块。这将确保至少有一条有效的开放路径通向“终点”,同时防止玩家轻松通过超级简单的布局。

这也将使一个30x30的迷宫更加可操作,因为计算机不必测试900个方格的每一个方格的有效性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接