c语言随机生成迷宫地图确保有通路代码
时间: 2023-08-12 19:20:33 浏览: 216
随机迷宫C++代码
以下是一个基于深度优先搜索算法的C语言实现,可以随机生成一个二维迷宫地图,并保证地图上有至少一条通路。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 15 // 迷宫的行数
#define COL 15 // 迷宫的列数
int maze[ROW][COL]; // 迷宫地图
int visited[ROW][COL]; // 记录每个位置是否被访问过
// 随机选择一个方向(上下左右),返回值为方向编号(0表示上,1表示下,2表示左,3表示右)
int random_direction() {
return rand() % 4;
}
// 检查当前位置是否可以向指定方向移动
int can_move(int row, int col, int direction) {
switch (direction) {
case 0: // 上
if (row > 1 && !visited[row-2][col])
return 1;
break;
case 1: // 下
if (row < ROW-2 && !visited[row+2][col])
return 1;
break;
case 2: // 左
if (col > 1 && !visited[row][col-2])
return 1;
break;
case 3: // 右
if (col < COL-2 && !visited[row][col+2])
return 1;
break;
}
return 0;
}
// 按指定方向移动当前位置
void move(int *row, int *col, int direction) {
switch (direction) {
case 0: // 上
*row -= 2;
break;
case 1: // 下
*row += 2;
break;
case 2: // 左
*col -= 2;
break;
case 3: // 右
*col += 2;
break;
}
}
// 深度优先搜索生成迷宫
void dfs(int row, int col) {
visited[row][col] = 1; // 标记当前位置已访问
while (1) {
int direction = random_direction(); // 随机选择一个方向
if (can_move(row, col, direction)) {
move(&row, &col, direction); // 按指定方向移动
visited[row][col] = 1; // 标记新位置已访问
maze[row/2][col/2] = 0; // 将路径上的位置设为通路
dfs(row, col); // 递归搜索新位置
}
if (visited[row-2][col] && visited[row+2][col] &&
visited[row][col-2] && visited[row][col+2]) {
// 如果当前位置的四个方向都已访问过,回溯到上一个位置
break;
}
}
}
int main() {
srand(time(NULL)); // 初始化随机种子
// 初始化迷宫地图和访问记录
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
maze[i][j] = 1;
visited[i][j] = 0;
}
}
// 随机选择起点和终点
int start_row = 1, start_col = rand() % (COL/2) * 2 + 1;
int end_row = ROW-2, end_col = rand() % (COL/2) * 2 + 1;
maze[start_row][start_col] = 0;
maze[end_row][end_col] = 0;
// 从起点开始生成迷宫
dfs(start_row, start_col);
// 打印迷宫地图
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (maze[i][j])
printf("# ");
else
printf(" ");
}
printf("\n");
}
return 0;
}
```
该代码使用了递归实现深度优先搜索算法,通过随机选择方向和判断当前位置是否可以移动来生成迷宫。在生成迷宫的过程中,将路径上的位置都设为通路,并在起点和终点处打开一个洞。最终输出的是一个二维数组,1代表墙壁,0代表通路。
阅读全文