生成随机迷宫(2)--深度优先(递归回溯)算法
这是我2019年坚持制作的第87次推文
深度优先算法也叫“不撞南墙不回头”,由它生成的迷宫极度扭曲,但有着一条明显的主路;如果当前单元有相邻的未访问过的迷宫单元,就一直向前搜索,直到当前单元没有未访问过的迷宫单元,才返回查找之前搜索路径上未访问的迷宫单元,所以用堆栈来维护已访问过的迷宫单位。
————————————————
算法主循环,重复下面步骤2直到堆栈为空:
1 随机选择一个迷宫单元作为起点,加入堆栈并标记为已访问
2 当堆栈非空时,从栈顶获取一个迷宫单元(不用出栈),进行循环
如果当前迷宫单元有未被访问过的相邻迷宫单元
随机选择一个未访问的相邻迷宫单元
去掉当前迷宫单元与相邻迷宫单元之间的墙
标记相邻迷宫单元为已访问,并将它加入堆栈
否则,当前迷宫单元没有未访问的相邻迷宫单元
则栈顶的迷宫单元出栈
其实这个算法很简单也很好理解,不要以为算法就是很高深莫测的样子,它其实就是解决某一类问题的模板,比如很多的RPG游戏,只有一条主线外加好多支线;支线走不通就回溯到主线上,最终都会到达终点。
言归正传,首先要将地图初始化成周围是一圈墙,迷宫单元被墙分隔开来的状态。
代码如下:
说明一下,为了处理方便,将迷宫的行列数设置为奇数,将每个单元的状态(显示、访问状态)存储在列表里,具体操作用到四个列表。
主程序就按照算法步骤一步一步走的,逻辑非常简单。
其他方法代码如下:
返回某个单元周围情况有上下左右四个特殊情况需要排除,代码有点长只粘贴了一部分
地图状态列表全部判断生成后,就是根据列表状态生成相应的迷宫了。
————————————————