迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢?

迷宫算法有三大算法:深度优先算法、prim算法和递归分割算法。这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助。

首先我的假设是,迷宫只有一条正确的道路。

这个时候请把自己想象成一只地鼠,要在这个区域不停的挖,直到任何一块区域再挖就会挖穿了为止。

我们挖的道路就像树结构,树上有很多的分支,分支也有子分支,每个子分支都不能相交,相交了就说明墙被挖穿了,那么此时的迷宫就可能存在多条正确道路,这不是我想看到的。

那么基于唯一道路的原则,我们向某个方向挖一块新的区域时,要先判断新区域是否有挖穿的可能,如果可能挖穿要立即停止并换个方向再挖。如图:

如图所示,挖之前要确保上下左右四个位置中只有一个位置是路。了解了这一规则以后,就可以上代码了:

#include<stdio.h>
#include<Windows.h>
#include<time.h>
#include<math.h>//地图长度L,包括迷宫主体40,外侧的包围的墙体2,最外侧包围路径2(之后会解释)
#define L 44//墙和路径的标识
#define WALL  0
#define ROUTE 1//控制迷宫的复杂度,数值越大复杂度越低,最小值为0
static int Rank = 0;//生成迷宫
void CreateMaze(int **maze, int x, int y);int main(void) {srand((unsigned)time(NULL));int **Maze = (int**)malloc(L * sizeof(int *));for (int i = 0; i < L; i++) {Maze[i] = (int*)calloc(L, sizeof(int));}//最外围层设为路径的原因,为了防止挖路时挖出边界,同时为了保护迷宫主体外的一圈墙体被挖穿for (int i = 0; i < L; i++){Maze[i][0] = ROUTE;Maze[0][i] = ROUTE;Maze[i][L - 1] = ROUTE;Maze[L - 1][i] = ROUTE;}//创造迷宫,(2,2)为起点CreateMaze(Maze, 2, 2);//画迷宫的入口和出口Maze[2][1] = ROUTE;//由于算法随机性,出口有一定概率不在(L-3,L-2)处,此时需要寻找出口for (int i = L - 3; i >= 0; i--) {if (Maze[i][L - 3] == ROUTE) {Maze[i][L - 2] = ROUTE;break;}}//画迷宫for (int i = 0; i < L; i++) {for (int j = 0; j < L; j++) {if (Maze[i][j] == ROUTE) {printf("  ");}else {printf("国");}}printf("\n");}for (int i = 0; i < L; i++) free(Maze[i]);free(Maze);system("pause");return 0;
}void CreateMaze(int **maze, int x, int y) {maze[x][y] = ROUTE;//确保四个方向随机int direction[4][2] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };for (int i = 0; i < 4; i++) {int r = rand() % 4;int temp = direction[0][0];direction[0][0] = direction[r][0];direction[r][0] = temp;temp = direction[0][1];direction[0][1] = direction[r][1];direction[r][1] = temp;}//向四个方向开挖for (int i = 0; i < 4; i++) {int dx = x;int dy = y;//控制挖的距离,由Rank来调整大小int range = 1 + (Rank == 0 ? 0 : rand() % Rank);while (range>0) {dx += direction[i][0];dy += direction[i][1];//排除掉回头路if (maze[dx][dy] == ROUTE) {break;}//判断是否挖穿路径int count = 0;for (int j = dx - 1; j < dx + 2; j++) {for (int k = dy - 1; k < dy + 2; k++) {//abs(j - dx) + abs(k - dy) == 1 确保只判断九宫格的四个特定位置if (abs(j - dx) + abs(k - dy) == 1 && maze[j][k] == ROUTE) {count++;}}}if (count > 1) {break;}//确保不会挖穿时,前进--range;maze[dx][dy] = ROUTE;}//没有挖穿危险,以此为节点递归if (range <= 0) {CreateMaze(maze, dx, dy);}}
}

算法的资源消耗较大,因此我设置了Rank来降低复杂度,但因此也会使得迷宫变得非常简单,在平衡中做取舍吧。

随机迷宫生成算法——prime算法

随机迷宫生成算法——递归分割算法

防止各位没看明白,重新写了篇,个人觉得讲的更详细点

随机迷宫生成算法——深度优先算法相关推荐

  1. 迷宫生成算法---深度优先算法(基于python)

    迷宫生成算法---深度优先算法 总体的目录 版权及协议声明 更加舒服的阅读方式 一. 深度优先算法的原理与思路 二.迷宫的制作 迷宫的总体的创建. 三.代码的实现 总体的目录 版权及协议声明 本文章遵 ...

  2. 随机迷宫生成算法浅析

    摘要 本文对随机迷宫生成进行了初步的研究和分析,并给出了两种不同的生成算法.最终的算法结合了图的深度优先遍历.通过对比两种算法之间,可发现,在实际问题中,结合了离散数学的方法往往非更有效率且效果更佳. ...

  3. flutter生成源代码_Flutter随机迷宫生成和解迷宫小游戏功能的源码

    此博客旨在帮助大家更好的了解图的遍历算法,通过Flutter移动端平台将图的遍历算法运用在迷宫生成和解迷宫上,让算法变成可视化且可以进行交互,最终做成一个可进行随机迷宫生成和解迷宫的APP小游戏.本人 ...

  4. 随机迷宫生成算法——prime算法

    本以为Prime迷宫生成算法和图论的Prime算法有什么关联,貌似并没有. Prime迷宫生成算法的原理: (1)初始地图所有位置均设为墙 (2)任意插入一个墙体进墙队列 (3)判断此时墙体是否可以设 ...

  5. 随机迷宫 c语言思路,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  6. c语言随机迷宫生成方法,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  7. 随机迷宫c语言实验报告,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  8. c语言生成迷宫算法,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  9. 【Prim迷宫算法】随机迷宫生成

    最近在学Android开发,老师让我们自己做个应用,我就想做个简单的Roguelike RPG小游戏.由于要用到迷宫,所以在网上学习了一下Prim迷宫算法,先用C++手撸了一个简单的模板. Prim算 ...

最新文章

  1. 现代hy-9600音响_从音响工程师到软件工程师-为什么我要学习编码
  2. WINDOWS SERVER 2003从入门到精通之“域控制器安全策略”打开错误的解决方法
  3. android studio 一直在 svn performing vcs refresh
  4. 皮尔·卡丹的管理思想精髓:从小做到大
  5. 房产众筹项目质疑声中再推出
  6. Sharepoint 2007 用代码聚合所有子网站文章 (populating data sources in code)
  7. Python基础、条件语句和基本数据类型
  8. uos安装方法_国产UOS(统一操作系统),虚拟机安装体验
  9. kafka消息存储格式
  10. Qt学习之路3---Qt中的坐标系统
  11. 进制转换的方法 详解
  12. OPPO A55刷root获取magisk权限OPPO A55 root教程
  13. 哲学家就餐问题python_无聊的哲学家进餐问题
  14. dnf丢失clientbase_登录dnf时出现dnfbase.dll的丢失
  15. Ubuntu 常用软件推荐(QQ、微信、MATLAB等)及安装过程
  16. android 4.1.2大小,4.1.2 Activity初窥门径
  17. 8188gu驱动和su realtek_RTL8188CU 和RTL8188SU有什么区别,哪个好,谢谢
  18. 快速保存微信文章中视频的方法
  19. 实时监测文件内容变化,Python
  20. 如何免费在线破解自己的CS学位

热门文章

  1. keepalived 检测服务状态、keepalived 检测脚本
  2. 如何用AXURE制作简单的QQ登录
  3. 【运维】家有苹果——路由器端网络加速的黑白名单
  4. 小学三年级计算机教程视频教学视频,人教版小学三年级数学上册教学视频
  5. 静态成员函数如何调用非静态成员变量
  6. 原力计划【MySQL数据库】- 多表查询
  7. ps调整图片大小失真最小
  8. WebKit最新特性srcset简介(转)
  9. 小程序头像挂件-canvas生成图片
  10. git pull不同步_Git fetch和git pull的区别?