vlambda博客
学习文章列表

生成随机迷宫(2)--深度优先(递归回溯)算法

这是我2019年坚持制作的第87次推文


   

       深度优先算法也叫“不撞南墙不回头”,由它生成的迷宫极度扭曲,但有着一条明显的主路;如果当前单元有相邻的未访问过的迷宫单元,就一直向前搜索,直到当前单元没有未访问过的迷宫单元,才返回查找之前搜索路径上未访问的迷宫单元,所以用堆栈来维护已访问过的迷宫单位。


————————————————


算法主循环,重复下面步骤2直到堆栈为空:


1 随机选择一个迷宫单元作为起点,加入堆栈并标记为已访问

2 当堆栈非空时,从栈顶获取一个迷宫单元(不用出栈),进行循环


        如果当前迷宫单元有未被访问过的相邻迷宫单元

               随机选择一个未访问的相邻迷宫单元

               去掉当前迷宫单元与相邻迷宫单元之间的墙

               标记相邻迷宫单元为已访问,并将它加入堆栈

      否则,当前迷宫单元没有未访问的相邻迷宫单元

               则栈顶的迷宫单元出栈


      其实这个算法很简单也很好理解,不要以为算法就是很高深莫测的样子生成随机迷宫(2)--深度优先(递归回溯)算法,它其实就是解决某一类问题的模板,比如很多的RPG游戏,只有一条主线外加好多支线;支线走不通就回溯到主线上,最终都会到达终点。


        言归正传,首先要将地图初始化成周围是一圈墙,迷宫单元被墙分隔开来的状态。


生成随机迷宫(2)--深度优先(递归回溯)算法


代码如下


生成随机迷宫(2)--深度优先(递归回溯)算法


       说明一下,为了处理方便,将迷宫的行列数设置为奇数,将每个单元的状态(显示、访问状态)存储在列表里,具体操作用到四个列表。


生成随机迷宫(2)--深度优先(递归回溯)算法


主程序就按照算法步骤一步一步走的,逻辑非常简单。



生成随机迷宫(2)--深度优先(递归回溯)算法


其他方法代码如下:


返回某个单元周围情况有上下左右四个特殊情况需要排除,代码有点长只粘贴了一部分


生成随机迷宫(2)--深度优先(递归回溯)算法



生成随机迷宫(2)--深度优先(递归回溯)算法


地图状态列表全部判断生成后,就是根据列表状态生成相应的迷宫了。




————————————————