用C语言实现迷宫

 

 上面是运行结果,我改的参数是52,比较大,大家可以改小一点。

 迷宫创建的思路是参考该大佬的,只是大佬用的是C++迷宫生成算法_jjwwwww的博客-CSDN博客_迷宫设计算法

以下代码在VS2013中 C文件与C++文件中都可运行,具体思路可以看注释(我写的比较详细)关于迷宫入口出口的函数部分,我留了两个指针,后面可以做迷宫自动寻路。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 32		//迷宫区域大小,最外层是保护区
#define WALL 0		//表示该位置是墙 wall
#define ROUTE 1		//表示该位置是路 route
void InitMaze(int(*maze)[N]);
void CreatMaze(int(*maze)[N], int x, int y);
void print(int(*maze)[N]);
void CreatInAndOut(int(*maze)[N], int*in, int*out);


//初始化迷宫
void InitMaze(int(*maze)[N]){
	//生成墙体
	for (int i = 0; i < N; ++i){
		for (int j = 0; j < N; ++j){
			*(*(maze + i) + j) = WALL;
		}
	}
	//迷宫外围保护,防止挖穿
	for (int i = 0; i < N; ++i){
		*(*(maze)+i) = ROUTE;
		*(*(maze + N - 1) + i) = ROUTE;
		*(*(maze + i)) = ROUTE;
		*(*(maze + i) + N - 1) = ROUTE;
	}

}
//创建迷宫,将其存储在二维数组maze[N][N]中(备注:迷宫创建的算法是参考CSDN上某位大佬的,我把链接放在这 https://blog.csdn.net/jjwwwww/article/details/106586256)
void CreatMaze(int(*maze)[N], int x, int y){
	if (*(*(maze + x) + y) == WALL){//如果该出是墙体,则开始创建迷宫

		//判断迷宫是否会形成环
		if (*(*(maze + x + 1) + y) + *(*(maze + x - 1) + y) + *(*(maze + x) + y + 1) + *(*(maze + x) + y - 1) <= ROUTE) {

			*(*(maze + x) + y) = ROUTE;//调用成功,将该位置设置为:路

			int direction[4] = { 0, 1, 2, 3 };
			for (int i = 4; i > 0; --i){//四个方向都要尝试
				int ret = rand() % i;//随机生成 0 -- i-1 中的数  (0,1,2,3)

				//交换,防止重复
				int tmp = direction[ret];
				direction[ret] = direction[i - 1];
				direction[i - 1] = tmp;


				//由于每次循环i都会变化,故不会出现重复的下标
				switch (direction[i - 1]){
				case 0:CreatMaze(maze, x - 1, y); break;//数组标记上移一位
				case 1:CreatMaze(maze, x + 1, y); break;//数组标记下移一位
				case 2:CreatMaze(maze, x, y - 1); break;//数组标记左移一位
				case 3:CreatMaze(maze, x, y + 1); break;//数组标记右移一位
				default:{printf("CreatMaze函数出错!"); return; }
				}
			}
		}
	}
}
//打印迷宫
void print(int(*maze)[N]){
	for (int i = 0; i < N; ++i){
		for (int j = 0; j < N; ++j){
			if (*(*(maze + i) + j) == ROUTE){
				printf("  ");
			}
			else printf("国");
		}
		printf("\n");
	}
	printf("\n");
}
//随机生成迷宫的入口与出口,将结果赋予两个指针参数
void CreatInAndOut(int(*maze)[N], int*in, int*out) {
	int a, b;
	int flag_a = 0;
	int flag_b = 0;

	while (1){
		if (flag_a + flag_b == 2) {
			break;
		}

		//产生下标与迷宫最外层相符的随机数,可以排除下标为1和N-2的位置
		a = 2 + rand() % (N - 4);//随机产生 2 -- N-3 之间的数
		b = 2 + rand() % (N - 4);
		//由于传入的是指针,故无需返回值
		if (*(*(maze + a) + 2) == ROUTE) {//若条件成立,则使指针in指向入口下标a
			*in = a;
			*(*(maze + a) + 1) = ROUTE;
			flag_a = 1;
		}
		if (*(*(maze + b) + N - 3) == ROUTE) {//若条件成立,则使指针out指向入口下标b
			*out = b;
			*(*(maze + b) + N - 2) = ROUTE;
			flag_b = 1;
		}

	}
}


int main(){
	int maze[N][N];//添加的下标表示迷宫边界墙体
	int in = 0;
	int out = 0;
	int *inp = &in;//该指针指向迷宫入口位置
	int *outp = &out;//该指针指向迷宫出口位置
	srand(time(NULL));

	InitMaze(maze);
	CreatMaze(maze, 14, 14);//从maze[14][14]的位置开始创建迷宫
	CreatInAndOut(maze, inp, outp);


	print(maze);
	return 0;
}

 感谢你认真的看到了这里,我有个问题,就是怎么让代码显示的时候是黑色,有谁会的话,可不可以告诉我,谢谢啦。

  • 3
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是使用C语言实现迷宫问题的示例代码: ```c #include <stdio.h> #define MAX_ROW 5 #define MAX_COL 5 int maze[MAX_ROW][MAX_COL] = { {0, 1, 0, 0, 0}, {0, 1, 0, 1, 0}, {0, 0, 0, 0, 0}, {0, 1, 1, 1, 0}, {0, 0, 0, 1, 0}, }; int goal[MAX_ROW][MAX_COL] = { {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, }; struct point { int row, col, predecessor; } queue[512]; int head = 0, tail = 0; void enqueue(struct point p) { queue[tail] = p; tail++; } struct point dequeue(void) { head++; return queue[head - 1]; } int is_empty(void) { return head == tail; } int visited[MAX_ROW][MAX_COL]; void visit(int row, int col, int predecessor) { struct point visit_point = { row, col, predecessor }; visited[row][col] = 1; enqueue(visit_point); } void print_maze(void) { int i, j; for (i = 0; i < MAX_ROW; i++) { for (j = 0; j < MAX_COL; j++) printf("%d ", maze[i][j]); putchar('\n'); } printf("*********\n"); } void print_path(int row, int col) { printf("(%d, %d)\n", row, col); while (row != 0 || col != 0) { int p = visited[row][col]; struct point predecessor = queue[p]; row = predecessor.row; col = predecessor.col; printf("(%d, %d)\n", row, col); } } void breadth_first(void) { struct point p = { 0, 0, 0 }; visit(p.row, p.col, -1); while (!is_empty()) { p = dequeue(); if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) break; if (p.col+1 < MAX_COL /* right */ && maze[p.row][p.col+1] == 0 && !visited[p.row][p.col+1]) visit(p.row, p.col+1, head-1); if (p.row+1 < MAX_ROW /* down */ && maze[p.row+1][p.col] == 0 && !visited[p.row+1][p.col]) visit(p.row+1, p.col, head-1); if (p.col-1 >= 0 /* left */ && maze[p.row][p.col-1] == 0 && !visited[p.row][p.col-1]) visit(p.row, p.col-1, head-1); if (p.row-1 >= 0 /* up */ && maze[p.row-1][p.col] == 0 && !visited[p.row-1][p.col]) visit(p.row-1, p.col, head-1); print_maze(); } if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) print_path(p.row, p.col); else printf("No path!\n"); } int main() { breadth_first(); return 0; } ``` 这段代码是通过广度优先搜索解决迷宫问题的程序。在这个迷宫问题中,0代表可以通过的路径,1代表墙壁。goal矩阵指定了迷宫的结束位置,在这个程序中,默认为maze的右下角。该程序先将起始点加入队列中,然后一直检查队列中的点,直到找到目标位置或队列为空。在这个过程中,程序会将可行的路径加入队列中,并将前驱节点记录到visited矩阵中,以便在找到目标位置后,可以回溯路径输出。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值