首页 > 其他 > 详细

迷宫的自动生成和深度遍历

时间:2018-06-24 10:17:45      阅读:792      评论:0      收藏:0      [点我收藏+]

这个程序是本人在github上看到的,通过对代码的解析学到了很多知识

在这里感谢原作者,原作者的文章https://zhuanlan.zhihu.com/p/37061369

关于迷宫的生成:

迷宫如下

技术分享图片

生成心型的函数:

 1 //利用函数构建心形坐标,存放到数组area中
 2 void initHeart()
 3 {
 4     int i = 0, j = 0;
 5     for (float y = 1.2f; y > -1.0f; y -= 0.06f)
 6     {
 7         for (float x = -1.1f; x < 1.2f; x += 0.05f)
 8         {
 9             float a = x * x + y * y - 1;
10             if (a * a * a - x * x * y * y * y <= 0.0f)
11                 area[i][j] = true;
12             else
13                 area[i][j] = false;
14             j++;
15         }
16         i++;
17         j = 0;
18     }
19 }

 

 


关于自动生成路径的小方法

技术分享图片

 

代码太长就不写下来了,

已将代码上传到我的github:https://github.com/yangliqin666/Game/tree/master/04_Heart_Maze

将地图布局好后就要开始深度遍历自动寻路了

深度遍历:

 空心方块是走过的路径

技术分享图片

深度遍历采用的数据结构是 栈(后入先出)

 部分代码


 1 //自动寻路函数
 2 void findPath(Maze maze[N][M], Block in, Block out)
 3 {
 4     Block block;
 5     SqStack S;//创建一个栈,先入后出
 6     initStack(S);//为栈开辟空间
 7     int curBlockX = in.x;
 8     int curBlockY = in.y;
 9     int step = 1;
10     do {  
11         gotoxy(78,30);
12         printf("第%d步", step);
13            //如果改点在方形地图中且所在点是路
14         if (inMaze(curBlockX, curBlockY) && maze[curBlockX][curBlockY] == ROAD)
15         {
16             initBlock(block, curBlockX, curBlockY, EAST);//右边  设置该坐标点的方向
17             push(S, block);//将该点入栈
18 
19             maze[curBlockX][curBlockY] = block.di;
20             updateMaze(maze);
21             //如果寻路成功
22             if (curBlockX == out.x&&curBlockY == out.y)
23             {
24                 gotoxy(78, 30);
25                 printf("寻路成功 共%d步", step);
26                 Sleep(5000);
27                 gotoxy(78, 32);
28                 system("pause");
29                 return;
30             }                              
31             curBlockX = nextBlockX(block.x, block.di);
32             curBlockY = nextBlockY(block.y, block.di);
33             step++;
34         }
35         else
36         {
37             pop(S, block);
38 
39             if (block.di < NORTH)//40             {
41                 block.di++;
42                 maze[block.x][block.y] = block.di;
43                 push(S, block);
44                 curBlockX = nextBlockX(block.x, block.di);
45                 curBlockY = nextBlockY(block.y, block.di);
46                 updateMaze(maze);
47             }
48             else
49             {    //沿着原路返回,将该点设为以走过的点
50                 maze[block.x][block.y] = BACK;
51                 updateMaze(maze);
52                 step--;
53             }
54         }
55     } while (!isEmpty(S));
56     gotoxy(78, 30);
57     printf("寻路失败");
58 }
 

采用深度遍历会沿着一条路走到最深,直到无路可走才会沿着原路返回,使用栈能很好的解决这个问题

全部代码github:https://github.com/yangliqin666/Game/tree/master/04_Heart_Maze

这上面的方法是深度遍历,下一篇文章将会是迷宫的广度遍历

 

迷宫的自动生成和深度遍历

原文:https://www.cnblogs.com/yangliqin/p/9219242.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!