生成迷宫算法

一个困扰了我很久的问题,如何生成一个有通路且足够复杂的迷宫

后来,我发现了一个很特别的思路,如果对深度优先遍历算法加入一个随机化的能力,生成的就是一个迷宫,为了增加迷宫的复杂性,我选择从终点搜索到起点的方法,而不是从起点搜索到终点的方法。

由于迷宫需要用UI显示,故我用C#写了以下的算法。。。

 

迷宫的入口是左上角,出口时右下角

C语言中随机生成迷宫算法有多种,常见的是Prim算法。Prim算法生成迷宫时,生成迷宫算法和寻址算法有相似之处,只是一个用了遍历一个用了递归,该算法可参考网上的Mike Gold的算法[^1]。 另外,还有一种C++随机生成迷宫算法中,涉及到坐标点和迷宫状态判断,例如在某个判断条件中,当 `m==0 && n!=0 && n!=N/2 - 1 && maze[m][n - 1]==maze[0][0] && maze[m][n + 1]==maze[0][0] && maze[m + 1][n]==maze[0][0]` 时,会将 `T` 置为0,表示第一行死路情况[^2]。 以下是一个简单的使用Prim算法生成迷宫的C语言示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define WIDTH 21 #define HEIGHT 21 typedef struct { int x, y; } Point; int maze[HEIGHT][WIDTH]; Point walls[WIDTH * HEIGHT]; int wallCount = 0; void addWalls(int x, int y) { if (x > 1 && maze[y][x - 2] == 1) { walls[wallCount].x = x - 1; walls[wallCount].y = y; wallCount++; } if (x < WIDTH - 2 && maze[y][x + 2] == 1) { walls[wallCount].x = x + 1; walls[wallCount].y = y; wallCount++; } if (y > 1 && maze[y - 2][x] == 1) { walls[wallCount].x = x; walls[wallCount].y = y - 1; wallCount++; } if (y < HEIGHT - 2 && maze[y + 2][x] == 1) { walls[wallCount].x = x; walls[wallCount].y = y + 1; wallCount++; } } void generateMaze() { for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { maze[y][x] = 1; } } srand(time(NULL)); int startX = 2 * (rand() % (WIDTH / 2)) + 1; int startY = 2 * (rand() % (HEIGHT / 2)) + 1; maze[startY][startX] = 0; addWalls(startX, startY); while (wallCount > 0) { int randomIndex = rand() % wallCount; int wx = walls[randomIndex].x; int wy = walls[randomIndex].y; if ((wx % 2 == 1 && wy % 2 == 0) || (wx % 2 == 0 && wy % 2 == 1)) { int dx = 0, dy = 0; if (wx % 2 == 1) { if (wy > 0 && maze[wy - 1][wx] == 0 && maze[wy + 1][wx] == 1) { dy = 1; } else if (wy < HEIGHT - 1 && maze[wy + 1][wx] == 0 && maze[wy - 1][wx] == 1) { dy = -1; } } else { if (wx > 0 && maze[wy][wx - 1] == 0 && maze[wy][wx + 1] == 1) { dx = 1; } else if (wx < WIDTH - 1 && maze[wy][wx + 1] == 0 && maze[wy][wx - 1] == 1) { dx = -1; } } if (dx != 0 || dy != 0) { maze[wy][wx] = 0; maze[wy + dy][wx + dx] = 0; addWalls(wx + dx, wy + dy); } } walls[randomIndex] = walls[wallCount - 1]; wallCount--; } } void printMaze() { for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { if (maze[y][x] == 0) { printf(" "); } else { printf("#"); } } printf("\n"); } } int main() { generateMaze(); printMaze(); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值