1.
引言 在平常的游戏中,我们常常会碰到随机生成的地图。这里我们就来看看一个简单的随机迷宫是如何生成。
2. 迷宫描述随机生成一个m *
n的迷宫,可用一个矩阵maze[m][n]来表示,如图:
图1.1 图1.2
这里是两个迷宫的例子,其中“■”表示障碍物(Obstacle
block)。以图1.1迷宫为例,我们可用一个9 * 9的矩阵来表示:
1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 0 1
1 0 0 0 0 0 1 0 1
1 0 1 1 1 1 1 0 1
1 0 1 0 0 0 0 0 1
1 0 1 0 1 1 1 1 1
1 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1
(矩阵中1表示是障碍物,0表示可以行走)
3、迷宫生成算法
(蓝色表示可以行走,棕色表示是墙壁)
图3.1
如图3.1所示为迷宫的初始化情形,迷宫如果除去其迷宫的外围框架就是一个7*7的矩阵,如果要生成一个完整的迷宫,那么就要遍历完图3.1所示的每一个可以行走的点,其中遍历的点也包含了入口和出口,如果每一个点都遍历完了就会生成一棵完整的遍历树,这棵遍历树包含了入口和出口所以这颗树所描述的迷宫是有解的(即:入口到出口时连通的。)图3.2就表示图1.1迷宫遍历所得到的遍历树,树包含了入口和出口所以此迷宫有解。
图3.2
图3.3
图3.3表示的是图3.2进一步的处理后得到的最终迷宫图,就是在图3.2的基础上把遍历树上的是墙壁的元素置为可行走的元素。
3.1元素的遍历
图3.1.1描述了各个遍历点的连接关系其中1元素为起始遍历点,49元素为终点遍历点我们声明一个mazepoint类用来描述每一个遍历点xtemp表示当前点在数组中的x坐标,ytemp表示当前点在数组中的y坐标,定义为mazepoint对象的next用来链表一个点的地址last用来链表上一个地址。
图3.1.1
声明了两个mazepoint的变量head和tail用于存储迷宫的链表的头地址和尾地址由于在迷宫刚刚开始的时候初始化元素是第一个所以头尾是相同的在主函数中把head赋值给了p1,(p1是我们声明的一个临时存储的变量;p1和p2用于新的链表元素生成)
如图3.1.2所示元素1它连接到元素3和元素15,所以它可以遍历这两个元素,假设遍历的方向是随机的,如果第一次现在向右遍历那么元素3就被遍历并把它标志为flag(flag表示已经遍历过了不容许再次遍历),所以元素1和元素3都标志位flag说明在其它元素想遍历它们的时候是不能再次被遍历了。这就有可能会遍历成一棵完整的树。