1. 程式人生 > >迷宮的自動生成和深度遍歷

迷宮的自動生成和深度遍歷

pan ron float Go == str false 代碼上傳 wid

這個程序是本人在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

這上面的方法是深度遍歷,下一篇文章將會是迷宮的廣度遍歷

迷宮的自動生成和深度遍歷