Scratch之迷宫自动生成一(深度优先递归)

迷宫生成的算法,深度优先。
深度优先算法生成的迷宫,其实只有一条路径,其它的都是障眼法。
根据对深度优先算法的介绍,在配合迷宫生成的逻辑,简单概括一下,就是说:
首先,我们需要生成一个被完全包围起来的迷宫,迷宫中的小房间被 “墙” 隔离起来,而我们要做的就是,使用变量表记录所有小房间状态,先将所有小房间标记为未访问,然后从某一房间开始遍历,先将起始房间标记为已访问,然后或者顺序或者随机查看相邻房间状态,如果未访问过,则访问该 相邻房间,去掉 “墙”,标记相邻房间为已访问,然后继续下一步,直到所有的房间都被访问过为止。

首先上一张原始图,其实不用画的,只是作为理解用。
在这里插入图片描述
本例在生成迷宫时,有些特殊的地方。首先将最外层的小房间替换成了围墙,当遍历时进入围墙内部则本次遍历结束,每一个“房间”,都是由上下左右四个线条围成,所以需要针对每一个“房间”的实际情况,画墙块。每个房间的大小为24*24,所以计算时需要定义这个尺寸值。

开始编程
第一步,创建一个角色,全程隐藏,用于生成初始迷宫。在这里插入图片描述

然后初始代码,先定义三个变量,配置行列书以及每一块即“房间”大小
在这里插入图片描述

定义变量列表,用于存放每个房间墙的状态(上下左右是否有墙块),用于记录是否访问过该房间,用于新的一次访问的访问列表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
定义position用于记录当前位置信息

先自定义一个积木块,用于生成最外部的围墙,即不会被遍历的区域
在这里插入图片描述

在该积木中初始化了变量和变量列表,将围墙内的区域标记为访问过,该区域与行列数的值有关,由于是20*15的迷宫,所以其实围墙区域为1~20,281~300,然后21,40,41,60以此类推。如果此时画图,则如图所示
在这里插入图片描述
忽略其它的东西,注意蓝紫色围墙和浅色房间。
代码如图
在这里插入图片描述
具体画图部分后面才会涉及。
此时迷宫已经生成了围墙,已经完全封闭的小房间,接下来需要拆除小房间之间的墙块了
首先定义两个本地角色变量 j,visted
以及自定义积木,用于判断是否完成所有房间的遍历
在这里插入图片描述

当visted的值等于column*row的值时,才算遍历完成。
再定义一个积木,用于当检查到遍历未完成时操作
在这里插入图片描述
访问列表里记录了所有访问过的房间的位置信息,即position信息

开始完成迷宫最后的生成。

定义积木块迷宫生成
在这里插入图片描述

破墙运算积木
在这里插入图片描述

主程序代码
在这里插入图片描述

此时画图情况
在这里插入图片描述

每次生成都是随机的迷宫图形。
砖块信息存放在上下左右墙块变量列表里,这也是画图的依据。
好,接下来画迷宫的墙块和围墙以及起始位置图了(待续…)

猜你喜欢

转载自blog.csdn.net/jackwsd/article/details/107763774