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