来源:微信公众号「编程学习基地」

迷宫

  • 迷宫生成
    • 十字分割方法生成
    • DFS 方法生成:
  • 实战演练
    • 十字分割
    • DFS 方法

迷宫生成

​ ① 十字分割 递归版本

​ ② 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);
}
else if (map[i][j].flag == 1)         //访问过
{setfillcolor(RGB(255, 193, 193));
}
else if(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--;
}

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

人物的移动已经讲解过很多次了,可通过上一篇/下一篇查看往期[推箱子]等教程。

更多详细操作后台发送关键字【迷宫算法】获取源码

Easyx图形库小游戏---迷宫相关推荐

  1. C语言实训 easyx 2048小游戏(带背景音乐)

    easyx2048小游戏 如果对你有帮助的话,希望可以给我点个赞支持一下. 想要别的实训代码源码的可以私信QQ2542909300找我,或者程序有什么内容的话也可以找我帮忙看看. https://gi ...

  2. easyx赛车小游戏(新手小白)

    2021新年快乐呀,两天都没出去玩终于写完这个小游戏. 之前上一篇博文说过要写跑酷来着,但因为我实在太菜了就中途放弃了,换成了公路障碍赛车... 界面如图,感觉是个比较劣质的游戏...但是它还是一个有 ...

  3. 打字游戏c语言easyx,打字小游戏(天降字母)Visual Studio+EasyX

    #include #include #include #include #include #include #include #pragma comment(lib,"WinMM.Lib&q ...

  4. h5小游戏--迷宫功能设计(HTML+JavaScript + canvas)

    原始JS + canvas 网页设计,这是一个非常不错的H5插件开发,非常适合初学者学习使用

  5. 【C/C++小游戏】2048 大作战!(基于Easyx图形窗口实现)

    目录 目录 目录 写在前面 游戏简介 Easyx 图形库 编写游戏 预编译代码 第一步:初始化棋盘 第二步:绘制棋盘 第三步:用户操作 第四步:封装函数 完整代码 效果展示 写在前面 大家好!本人是一 ...

  6. c语言使用easyX图形库制作打气球小游戏

    大一c语言使用easyX图形库制作打气球小游戏 如果你是入门easyX图形库,那么这个打气球小游戏将会是和不错的入门项目选择,easyX开创了可视化窗口,使用户更加直观的了解到对象的变化,总代码以及素 ...

  7. c语言循环写回合制小游戏_告别黑框框——用C语言Easyx图形库实现图形界面

    很早以前就接触到了Easyx图形库,当时感叹还有这么简单的C图形库供我们使用.后开用Easyx做过推箱子.图形界面钢琴等等简单的小游戏.今天给大家介绍一下Easyx图形库. Easyx图形库是针对C+ ...

  8. 贪吃蛇小游戏 c++ easyx图形库实现

    贪吃蛇小游戏 c++ easyx图形库实现 实施思路 1.用上下左右键来控制方向 2.按enter键开始 暂停 3.通过随机函数来实现食物的随机出现 4.通过单链表来构造蛇 5.蛇撞墙    咬到自己 ...

  9. c语言跑酷游戏,C++用easyx图形库实现障碍跑酷小游戏

    用easyx图形库做一个简单的c++小游戏-障碍跑酷 开发环境:visual c++6.0 库:easyx图形库 下载地址 当时我原本是想模仿做一个Flappy Bird的小游戏,在想如何写的时候突然 ...

  10. 【C/C++小游戏】见缝插针(EasyX 图形库)

    目录 游戏简介 开始编写 1 预编译 2 初始化 全局变量 初始化函数 3 插入新的针 检测键盘 新的针 判断游戏失败 CreatePin 函数 4 移动针 5 绘制屏幕 针 圆 得分 按钮 Draw ...

最新文章

  1. JDK 15 JAVA 15的新特性展望
  2. 大型ERP等数据库系统常见几种设计------(转)
  3. c++11多线程之packaged_task<>介绍与实例
  4. 2.1 maven配置多镜像地址
  5. Ubuntu 安装截图工具Shutter,并设置快捷键 Ctrl+Alt+A
  6. php 设置 server 变量,php 服务器变量 $_SERVER
  7. git相关常用基本用法命令及分支操作指南命令
  8. linux启动参数怎么传给内核,如何启动内核(vivi与Linux kernel的参数传递情景分析)...
  9. 计算机网络章末总结,计算机网络 (前两章总结)
  10. 精选| 2019年4月R新包推荐(Top40)
  11. Java速成:Boot入门
  12. 前端下载文件方式之:创建a标签下载文件
  13. 喝杯java冷静一下是什么梗_大哥喝冰阔落是什么梗 喝冰阔落的出处在哪
  14. mac系统Airtest环境安装教程
  15. ssm毕设项目鲲龙装饰公司在线管理系统的设计与开发前台模块iub6h(java+VUE+Mybatis+Maven+Mysql+sprnig)
  16. 医院排队叫号系统(JAVA版)
  17. 单元测试总结反思_单元测试小反思200字
  18. 苹果手机聊天记录恢复方法有哪些?这2个恢复技巧值得收藏
  19. JAVA设计模式之概述
  20. C++内存管理方式——new/delete

热门文章

  1. python获取表格中的所有数据_【经验分享】用Python读取电子表格中的数据
  2. 网络显示dns服务器错误,电脑出现网络dns异常是怎么回事
  3. 新xp系统无法连接网络连接服务器,WinXP系统本地连接受限制或无连接怎么办?...
  4. PGSQL Key (id)=(1) already exists.
  5. selenium 复制粘贴
  6. Python 爬取豆瓣电影Top250
  7. STM32串口通信编程
  8. 【零样本学习】Zero-Shot Learning via Class-Conditioned Deep Generative Models
  9. MATLAB学习笔记 plotyy双y轴
  10. 关于wintc编译成功,输出黑框中无结果显示