什么是一个很好的迷宫生成算法,开发人员可以任意选择入口和出口点(当然,它们都应位于边缘)?一段伪代码或任何语言的实现将是最有帮助的。
虽然不完全是算法,但我在这里描述了创建迷宫的一些步骤。这些步骤中的每一步都需要转换为代码,但我认为它们是一个很好的起点。
稍后,这些墙壁中的一些将被切割,例如创建路径。在下图中,将切割将与路径相交的每个墙;所有未被任何路径切割的墙都将被保留.
第1步:我们从以下方式开始:在入口点和出口点之间创建最简单的路径;该路径将仅由一条水平线和一条垂直线组成。
接下来,因为这条路太简单了,我们试图让它更复杂(更扭曲,有更多转弯);我们通过逐渐替换现有路径的片段来实现这一点,矩形的三个边(与移除的片段一起,将代表整个矩形);我们会根据需要多次重复此步骤,只关注路径不会相交。
第2步:现在我们有一条相对复杂的路径连接迷宫中的入口和出口点。然而,矩阵中仍有细胞,四面都有围绕它们的墙壁。我已经找到了一些迷宫的例子,我注意到迷宫中的每个细胞都可以从入口点进入,即使它是死路一条。 (换句话说,迷宫中的所有路径都形成一棵树)。
我们现在需要做的是将迷宫中的所有剩余单元连接到现有路径。作为惯例,我将“主路径”称为我们刚刚从入口到出口点创建的路径;分支出来的所有其他路径将被命名为“辅助路径”。那么我们如何创建次要路径?通过在迷宫的大区域中挑选一个未被主路径遍历的随机点,以及主路径上的另一个随机点。然后以与我们对入口和出口点类似的方式链接这些点:用尽可能最简单的路径链接它们,稍后使这条路径变得更复杂 - 通过用3个段替换一个段来构成矩形的补码。我们不需要多次重复此步骤,因为辅助路径不需要比主路径更复杂。
第3步:现在我们通过将迷宫中的一些随机点与主路径相关联,创建了几个辅助路径。仍然有一些区域无法进入,但它们很小。因此,对于这些单元格,我们可以将它们与直线连接到主路径或辅助路径中的最近点,就是这样。迷宫中的所有方块都可以访问。我们现在需要做的就是移除任何与路径相交的墙壁,并保留所有其他墙壁。
有许多算法用于生成迷宫:我希望您可以通过一些小工作来更改它们以允许指定起点和终点。
我对迷宫的最佳参考是Jamis Buck的Mazes For Programmers。 Jamis blogs about many things software-related,在他的帖子中你可以找到很多迷宫算法。以下是对他博客上的内容的回顾:
祝你好运。
对于从任何平面图生成随机迷宫的实现,请查看this web app。对于稍微不同的看法,以及双图的一般描述,我也把a presentation放在一起。
请注意,进入或退出的概念是我根本没有解决的问题。但是,如果定义明确的迷宫,您可以随时将入口和出口点放在任何位置。 (当然,有些可能导致琐碎的遍历作为解决方案。)在任何迷宫中,你应该总是能够在任何两点或“房间”之间旅行。
在给定特定迷宫的情况下找到导致有趣或足够复杂的解决方案的进入和退出点可能只是确保具有足够长度的解决方案的问题。如果您想预先指定一个条目作为任意图形的退出点,那么也可以非常简单地完成。
如果你有一个图表并想要添加一个起点或终点,你需要做的就是在周边添加一个“房间”。这个房间必须可以到达迷宫的其他部分,只能通过拆除它与迷宫的其余部分之间的墙壁才能到达。这个想法如下所示,开始和结束房间为左上角和右下角的三角形:
.
图中的随机迷宫如下: