我正在制作一个生成3D迷宫的程序,并且在创建算法时遇到了一些麻烦。为了便于互动,它将是一个矩形棱柱,有一个入口和一个出口。
问题是算法的实际编码:我认为最好的方法是创建一个名为MazeBlock
的类,它有六个布尔状态(上,下,左,右,进,出)这表示迷宫可以在哪个方向进行下一步。使用MazeBlock
s的3D数组,我想填充迷宫,每次迭代填充检查块左侧,右侧,上方,下方,前方和后方,以查看是否有任何开口到那边要附上。
我已经有一个可以制作边缘,将随机打开的槽放在迷宫内部。所有我遇到的麻烦都是实际内部,确保迷宫有一个入口,一个出口和一个解决方案来穿越它(我曾经在弹出书中解决了一个“困难”的3D迷宫,只需要在预定的几步之后方向。
正如我所说,我认为我对算法有基本的想法,但我不知道如何编码。有人可以为此提出一个Java算法来相对快速地完成任务吗?
解决方案不得使用外部库。
答案 0 :(得分:8)
有许多迷宫生成算法在这里运行得很好,其中大部分基于在3D网格图中创建某种spanning tree。
作为一个例子,让我们假设我们有一个2D网格的单元格(我可以使用ASCII艺术实际渲染!),如下所示:
*---*---*---*
| | | |
*---*---*---*
| | | |
*---*---*---*
| | | |
*---*---*---*
我们可以将其视为一个图形,其中每个单元格是一个顶点,并且单元格之间的每个连接都是边缘。我们的目标是找到一个连接所有节点的树。如果我们这样做,那么所有单元格将彼此可达(因为树已连接),但没有循环(因为树是最小连接的图形)。我们可以使用许多不同的树木;例如,这是一棵树:
*---*---*---*
| | | |
* * * *
| | | |
* * * *
| | | |
* * * *
这是另一个:
* *---* *
| | | |
*---* * *
| |
*---*---*---*
| |
*---* *---*
如果您正在寻找某种连接迷宫细胞的树,一种选择是在图上使用depth-first search,随机排序需要访问的边缘。这种策略是众所周知的maze generation algorithm,它产生了长而曲折的迷宫,充满了死胡同和令人困惑的分支。
另一种常用于创建迷宫的方法是将其减少到找到图的minimum spanning tree的问题。特别是,假设您创建了一个图形,其中每个单元格都是一个节点,其中包含指向其每个邻居的链接。为每个边选择随机权重,然后为图构建最小生成树。这棵树没有周期,每个节点到另一个节点都有一条独特的路径,这意味着迷宫有一个独特的解决方案。此外,该算法非常有效 - 在大小为nxnxn的3D立方体中,你有O(n 3 )节点,O(n 3 )边缘,你可以使用Prim's algorithm或Kruskal's algorithm在O(n 3 lg n)时间内找到MST。这些也会产生高质量的迷宫,尽管它们的属性与使用随机深度优先搜索创建的迷宫有很大不同。
希望这有帮助!