这个程序是本人在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