#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//定义迷宫大小
#define ROW 10
#define COL 10
//定义节点状态
#define WALL 0
#define PATH 1
//初始化迷宫
int maze[ROW][COL]={0};
//给第一个元素赋初值0,其他元素也会被赋为0,因为C语言规定未显式初始化的静态和全局变量类型默认值为0
//生成迷宫
void createMaze(int row, int col) {
//设置起点和终点
maze[0][0] = PATH;
maze[row - 1][col - 1] = PATH;
//设置当前位置和方向
int x = 0, y = 0, dir = 0;
//定义四个方向上的偏移量
int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};
//这段代码定义了两个整型数组 dx和dy,分别包含了四个数字 {0, 1, 0, -1}和 {-1, 0, 1, 0}。这两个数组通常被用作表示在平面上四个方向的位移量(偏移量)。
数组 dx 存储的是按照“上、右、下、左”(或“北、东、南、西”)方向进行移动时,对应横坐标(或列数)的位移量。具体来说,当进行 “向右移动” 时,横坐标(列数)应该增加1,因此对应的偏移量是dx[1] = 1,而在向左移动时,横坐标应该减少1,所以对应的偏移量是 dx[3] = -1。
同理,“向下移动” 时纵坐标(或行数)增加1,对应的位移量是 dy[2] = 1,而“向上移动” 时纵坐标减少1,对应的位移量是 dy[0] = -1。
这种数组存储模式在解决表示图像中的像素或表示二维平面上的图形对象等问题时常常会被用到。通过在代码中使用这样的数组来表示平面上的移动方向,可以使代码更加清晰易读和易于编写。
//随机生成路径
while (1) {
//寻找当前节点的邻居节点
int neighbor[4] = {0};
int count = 0;
int i;
for ( i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == WALL) {
neighbor[count++] = i;
}
}
//如果当前节点没有可访问的邻居节点,则回溯
if (count == 0)
{
int flag = 0;
int i;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == PATH)
{
x = nx;
y = ny;
flag = 1;
break;
}
}
if (flag == 0) break;
}
//随机选择一个邻居节点
int index = neighbor[rand() % count];
x += dx[index];
y += dy[index];
maze[x][y] = PATH;
}
}
//打印迷宫
void printMaze(int row, int col) {
int i,j;
for (i = 0; i < row; i++) {
for ( j = 0; j < col; j++) {
if (maze[i][j] == WALL) printf("■");
else if (maze[i][j] == PATH) printf(" ");
}
printf("\n");
}
}
int main() {
srand(time(NULL)); //初始化随机数生成器
createMaze(ROW, COL);
printMaze(ROW, COL);
return 0;
}
退出代码为3221225620