迷宫生成算法

这篇具有很好参考价值的文章主要介绍了迷宫生成算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

迷宫生成

① 十字分割 递归版本

② BFS(即广度算法)

十字分割方法生成

要求初始时迷宫内全是通路,然后随机十字建墙,然后随机在三面墙上打洞,使四个子空间连通。

要求:十字点横纵坐标均要求为偶数(即地图行列为奇数),打洞点要求为奇数。

DFS 方法生成:

像一只地鼠打洞一般,迷宫要求初始时全是阻碍(墙),然后随机方向打洞(挖墙)。

要求,待挖墙的通路(打洞方向)只能与访问过的节点处打穿。

实战演练

十字分割

非常简单的一个方法,不过游戏效果不是很好。下面介绍下算法过程:

首先全部围起来,然后做一个十字墙

迷宫生成算法

打通十字墙任意三堵墙

迷宫生成算法

递归生成十字墙,然后打通任意三堵墙

迷宫生成算法

然后就生成了最简单的迷宫(其实没啥卵用的迷宫,就当是温习递归)

DFS 方法

其实就是一种挖墙算法,嗯,我是这样认为的。详细讲解一下这个算法。

先看一下定义地图的Node结构,

#define MAP_ROW 20	
#define MAP_COL 25
Node map[MAP_ROW][MAP_COL] = { 0 };	//每个墙 都没打通的  每个结点 都是没有访问过
struct Node
{
    int flag;	//表示关键结点是否访问过 0:未访问 1:已访问 2:待访问
    // 3:人物 4:目的地
    bool left, right, top, buttom;	//表示这个节点周围的四堵墙 0:不可通过的墙 1:可通过的空地
};

然后就是生成迷宫地图,也就是初始化函数init(),先选中左上角作为迷宫的入口,也是人物所在地

map[0][0].flag = 1;			//这个节点已经访问过

定义辅助数组储存待访问节点

COORD waitForVisit[MAP_COL * MAP_ROW];	//存放待访问的结点
int len = 0;							//map里面的坐标的个数

同时已访问节点周围是待访问节点,将其添加到辅助数组里面去,

waitForVisit[len++] = { 1, 0 };		//下方的结点 可以访问
map[1][0].flag = 2;					//待访问
waitForVisit[len++] = { 0, 1 };		//右边的结点 可以访问
map[0][1].flag = 2;					//待访问

效果如下图:

迷宫生成算法

在绘制地图时设定白色为未访问节点粉红色为访问过的节点,蓝色为待访问节点

if (map[i][j].flag == 0)				//没有访问过这个节点
{
    setfillcolor(WHITE);
}
elseif (map[i][j].flag == 1)			//访问过
{
    setfillcolor(RGB(255, 193, 193));  
}
elseif(map[i][j].flag == 2)			//待访问
{
    setfillcolor(BLUE);
}

然后就是逐个访问待访问节点,务必要求每个节点都访问到,也就是广度优先搜索

len为待访问节点的数量,从中随机选取一个节点进行访问,并将访问后该节点周围的未访问节点初始化为待访问节点

while (len > 0)
{
    //随机选取其中的一个结点  进行访问
    m = rand() % len;	//从可以访问的结点中随机取一个
    /*打通这个节点  把这个节点相邻的结点放到map里面*/
    borderThrough(map, waitForVisit[m]);	//borderThrough作用:打通waitForVisit[m]节点的任意一面(上下左右任意一面)
    map[waitForVisit[m].X][waitForVisit[m].Y].flag = 1;		/*标记已访问*/
}

打通节点函数borderThrough()的作用就是将第二个传入参数所在节点的任意一面(上下左右任意一面)打通,打通的要求是该面相邻的节点是已经访问过了的节点

void borderThrough(Node map[][MAP_COL], const COORD node)///函数原型

打通条件:

(node.X + 1 < MAP_ROW) && map[node.X + 1][node.Y].flag == 1//向下打通
(node.Y - 1 >= 0) && map[node.X][node.Y - 1].flag == 1//向左打通

打通之后该节点设置为已访问节点(flag==1),然后周围的四个节点(未访问节点,如果有的话)设置成待访问节点。

m为随机选取的待访问节点下标

/*周围的四个节点(如果有) 全部放到map里面*/
if (waitForVisit[m].X - 1 >= 0 && map[waitForVisit[m].X - 1][waitForVisit[m].Y].flag == 0)
{
    //如果上方的结点没有访问过   设置为待访问 并且把这个位置放到map里面
    map[waitForVisit[m].X - 1][waitForVisit[m].Y].flag = 2;	/*标记待访问*/
    waitForVisit[len++] = { waitForVisit[m].X - 1, waitForVisit[m].Y };/*添加进待访问节点辅助数组里面*/
}
if (waitForVisit[m].X + 1 < MAP_ROW && map[waitForVisit[m].X + 1][waitForVisit[m].Y].flag == 0)
{
    //下
    map[waitForVisit[m].X + 1][waitForVisit[m].Y].flag = 2; /*标记待访问*/
    waitForVisit[len++] = { waitForVisit[m].X + 1, waitForVisit[m].Y };/*添加进待访问节点辅助数组里面*/
}

已经被标记为访问的节点将其从待访问节点数组里面删除

//map[m]已经访问过  从map里面删掉就可以
if (m == len - 1)
    len--;
else
{
    waitForVisit[m] = waitForVisit[len - 1];
    len--;
}

整个过程慢动作回放如下:

迷宫生成算法

迷宫生成过程文章来源地址https://www.toymoban.com/news/detail-484978.html

到了这里,关于迷宫生成算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 递归算法学习——电话号码的字母组成,括号生成,组合

    目录 一,电话号码的字母组合 1.题意 2.例子 3.题目接口  4.解题代码和思路 代码: 思路: 二,括号的生成 1.题意 2.例子 3.题目接口 四,解题代码和思路 1.先写代码: 2.思路 三,组合 1.题意 2.例子 3.题目接口 4.解题代码 1.题意 给定一个仅包含数字  2-9  的字符串,返回所有

    2024年02月10日
    浏览(36)
  • 【数据结构】迷宫问题DFS非递归(c语言实现)

    本来之前写过一个推箱子,就想着写个迷宫游戏,因为想着推箱子游戏里面也有墙,也有玩家的移动,比推箱子简单的是还不用判断前面是否有箱子的情况,但是自己写的迷宫游戏如果自己随机生成的迷宫地图的话,不一定会有通路,他要学一个什么随机迷宫的生成,刚看完

    2024年02月08日
    浏览(29)
  • 华为OD机试 - 机器人走迷宫(Python)| 递归的使用

    房间有 X*Y 的方格组成,例如下图为 6*4 的大小。每一个放个以坐标 (x,y) 描述。 机器人固定从方格 (0,0) 出发,只能向东或者向北前进, 出口固定为房间的最东北角,如下图的方格 (5,3) 。 用例保证机器人可以从入口走到出口。 房间有些方格是墙壁,如 (4,1) ,机器人不能经过那

    2024年02月09日
    浏览(45)
  • 探索Python编程的技巧:多线程魔法、网络舞台、正则魔法阵与递归迷宫

    进程: 就是一个程序,运行在系统之上,称这个程序为一个运行进程,并分配进程ID方便系统管理。 线程:线程是归属于进程的, 一个进程可以开启多个线程,执行不同的工作,是进程的实际工作最小单位。 操作系统中可以运行多个进程,即多任务运行 一个进程内可以运行

    2024年02月12日
    浏览(38)
  • 汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】

    目录 一、99乘法表 汇编代码 效果 二、整数拆分 问题描述 c代码 汇编代码 效果 三、素数环 问题描述 c代码 效果 四、迷宫问题 问题描述 c代码 汇编代码 效果 汇编代码 效果 貌似有点问题,忘了把运算结果加上...... 问题描述 问题描述 输入一个N,输出所有拆分的方式。 如

    2023年04月09日
    浏览(28)
  • python生成十字导杆形平面四杆桃形线

    绘制动画

    2024年02月10日
    浏览(19)
  • pygame迷宫生成

    项目分析        一个完整的迷宫,需要能够实现产生不同路径供玩家游戏,同时需要能够记录玩家所走过的路,避免由于迷宫的范围太大而导致无法走到最后的结尾。迷宫本身也应该自带友好的交互功能,可以让玩家可以根据提示获得愉快的游戏体验。 实验目标 1.随机生成

    2024年02月05日
    浏览(22)
  • 基于Openmv H7 Plus 的红色巡线+十字路口+多数字识别算法

    由于是采用命令集的方式控制openmv,摄像头不需要接收太多的数据,我采用的是判断串口接收的长度来区分命令集。flag为接收数据的长度,通过发送不同长度数据来改变openmv的工作模式 1.巡线 在openmv的开源库中有色块识别的关键函数blob(),可以传回识别出的矩形色块的中心

    2024年02月16日
    浏览(33)
  • DFS算法详解 ---- 走迷宫

    上期内容给大家带来了排列型dfs,这期给大家带来了 使用dfs来进行图的遍历 。 首先请看题: 咱们在看这道题的时候 ,需要首先研究 迷宫如何存 ,肯定是要定义一个浮点型的二维数组对吧,那么这里我给他定义一个char board[N][N],让这个二维数组存储迷宫。 接下来就是 怎么

    2024年01月16日
    浏览(29)
  • 【数据结构与算法】 完成用十字链表存储的稀疏矩阵的加法运算

       Qestion:   完成用十字链表存储的稀疏矩阵的加法运算。 获取两个稀疏矩阵总有多少个非零元素,记作 cnt 。 当 cnt 不为零时一直循环,每循环一次 i++ ,也就是行循环,每循环一次就转移至下一行。 先从第一行开始循环,使得两个工作指针 p 、 q 分别指向两个稀疏矩阵

    2024年02月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包