C语言实现简单迷宫

C语言实现迷宫程序


前言

大家小时候一定都玩过迷宫这个游戏,很吸引人吧,有那种走不出来就不罢休的执着,然后走出来了觉得自己很强,自己可以了,接着激动的开始下一个关卡,慢慢的沉溺在迷宫的世界里了。

然后我就有了这么个想法,自己做一个迷宫,直到今天,终于有了初步结果

提示:以下是本篇文章正文内容

一、程序代码

1.读入数据

输入的数据即为迷宫的地图(这么叫吧)

代码如下:

char a[21][22]={							//21个0.但有一个'\0'所以申请22个空间 
				    "000000000000000000000",
				    "0 0 0 0     0     0 0",
				    "0 0 0 00000 00000 0 0",
				    "0 0               0 0",
				    "0 000 000 0 000 0 0 0",
				    "0 0     0 0 0   0 0 0",
					"0 0 0 00000 000 000 0",
					"0 0 0     0   0 0    ",
					"0 000 0 0 000 0 0 0 0",
					"0     0 0 0 0 0 0 0 0",
				    "0 00000 000 000 0 0 0",
				    "0     0       0   0 0",
					"000 0 0 0 000 0 0 0 0",
					"0 0 0 0 0 0   0 0 0 0",
					"0 0000000 0 000 00000",
					"*   0   0 0         0",
					"0 0 0 0 0 00000000000",
					"0 0 0 0             0",
					"000 0 00000 0 000 000",
					"0         0 0   0   0",
					"000000000000000000000"};

2.控制@的移动

用户通过按“w,a,s,d”来控制@的移动,需要注意的是当@碰到墙壁(即0)时,不能再移动
代码如下:

if (ch=='s')
			{
				if (a[x+1][y]!='0')		//判断是否可移
				{
					a[x][y]=' ';
					x++;
					a[x][y]='@';
				}
			}							//用户按下's'时,'@'往下移一位 
		else if (ch=='w')
			{
				if (a[x-1][y]!='0')		//判断是否可移
				{
					a[x][y]=' ';
					x--;
					a[x][y]='@';
				}
			}							//用户按下'w'时,'@'往上移一位 
		else if (ch=='a')
			{
				if (a[x][y-1]!='0')		//判断是否可移
				{
					a[x][y]=' ';
					y--;
					a[x][y]='@';
				}
			}							//用户按下'a'时,'@'往左移一位 
		else if (ch=='d')
			{
				if (a[x][y+1]!='0')		//判断是否可移 
				{
					a[x][y]=' ';
					y++;
					a[x][y]='@';
				}
			}							//用户按下'd'时,'@'往右移一位

3.清屏再打印

在每次移动之后,需要清除移动前的地图,再打印新的地图
代码如下:

system("cls");					//清屏操作 
		for (i=0;i<=20;i++)
			{
				puts(a[i]);
			}							//打印'@'移动后的迷宫

4.循环控制@的移动

这里有一个很重要的事情需要强调一下:在每次移动后肯定要继续移动直到走出迷宫,不能移动一次就程序结束了,因此循环就显得很重要了
代码如下:

while (x!=p || y!=q)		//p,q为迷宫出口的横纵坐标
	{
	}

5.宣布结果

当你走出迷宫的时候是不是应该庆祝一下呢
因此这里有一句"You win."庆祝你的成功

庆祝之前记得清屏哦
代码如下:

system("cls");
printf ("You win.");

二、完整程序

接下来便是将各组代码组合在一起,形成一个完整的程序
完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h> 
int main ()
{
	char a[21][22]={							//21个0.但有一个'\0'所以申请22个空间 
				    "000000000000000000000",
				    "0 0 0 0     0     0 0",
				    "0 0 0 00000 00000 0 0",
				    "0 0               0 0",
				    "0 000 000 0 000 0 0 0",
				    "0 0     0 0 0   0 0 0",
					"0 0 0 00000 000 000 0",
					"0 0 0     0   0 0    ",
					"0 000 0 0 000 0 0 0 0",
					"0     0 0 0 0 0 0 0 0",
				    "0 00000 000 000 0 0 0",
				    "0     0       0   0 0",
					"000 0 0 0 000 0 0 0 0",
					"0 0 0 0 0 0   0 0 0 0",
					"0 0000000 0 000 00000",
					"@   0   0 0         0",
					"0 0 0 0 0 00000000000",
					"0 0 0 0             0",
					"000 0 00000 0 000 000",
					"0         0 0   0   0",
					"000000000000000000000"};	//至此迷宫打印完毕 
	int i,x,y,p,q;
	char ch;
	
	x=15; y=0; p=7; q=20;
	for (i=0;i<=20;i++)
		{
			puts(a[i]);
		}								//输出初始迷宫地图 
	
	while (x!=p || y!=q)				//没有完成迷宫之前一直循环 
	{
		ch=getch();						//获取指示操作 
		
		if (ch=='s')
			{
				if (a[x+1][y]!='0')		//判断是否可移
				{
					a[x][y]=' ';
					x++;
					a[x][y]='@';
				}
			}							//用户按下's'时,'@'往下移一位 
		else if (ch=='w')
			{
				if (a[x-1][y]!='0')		//判断是否可移
				{
					a[x][y]=' ';
					x--;
					a[x][y]='@';
				}
			}							//用户按下'w'时,'@'往上移一位 
		else if (ch=='a')
			{
				if (a[x][y-1]!='0')		//判断是否可移
				{
					a[x][y]=' ';
					y--;
					a[x][y]='@';
				}
			}							//用户按下'a'时,'@'往左移一位 
		else if (ch=='d')
			{
				if (a[x][y+1]!='0')		//判断是否可移 
				{
					a[x][y]=' ';
					y++;
					a[x][y]='@';
				}
			}							//用户按下'd'时,'@'往右移一位 
	
	
		system("cls");					//清屏操作 
		for (i=0;i<=20;i++)
			{
				puts(a[i]);
			}							//打印'@'移动后的迷宫 
	}
	system("cls");						//清屏操作 
	Sleep(500);
	printf ("You win.");				//恭喜你,你赢了 
	Sleep(3*1000);
	exit(0);
	system("pause");
	return 0;
} 

三、疑惑

1.迷宫地图怎样用横竖代替(用0多少有些麻烦)

2.如何使最后打印的"You win."字体变大

四、总结

本文简单介绍了用C语言做迷宫并执行的程序,过程还是很开心的,终于有了自己的迷宫,各位大佬如果有其他的建议记得下方评论区告诉我哦,万分感谢
原迷宫地图:
地图

深度优先搜索(Depth First Search, DFS)是一种用于图和树的遍历算法。它可以用来生成迷宫。下面是一个用C语言实现DFS迷宫生成的简单示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> // 定义迷宫的行数和列数 #define ROW 10 #define COL 10 // 定义迷宫的墙壁和路径符号 #define WALL '#' #define PATH ' ' // 定义四个方向的移动向量:上、右、下、左 int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; char maze[ROW][COL]; // 迷宫地图 // 初始化迷宫地图,所有位置都设置为墙壁 void initMaze() { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { maze[i][j] = WALL; } } } // 检查位置(x, y)是否在迷宫范围内 int isValid(int x, int y) { return (x >= 0 && x < ROW && y >= 0 && y < COL); } // 以点(x, y)为起点,进行DFS遍历生成迷宫 void DFS(int x, int y) { maze[x][y] = PATH; // 将当前位置标记为路径 // 随机打乱四个方向的顺序 int dirs[4] = {0, 1, 2, 3}; for (int i = 0; i < 4; i++) { int j = rand() % 4; int temp = dirs[i]; dirs[i] = dirs[j]; dirs[j] = temp; } // 在四个方向上进行探索 for (int i = 0; i < 4; i++) { int nx = x + dx[dirs[i]]; int ny = y + dy[dirs[i]]; // 判断新位置(nx, ny)是否有效及是否是墙壁 if (isValid(nx, ny) && maze[nx][ny] == WALL) { int wallCount = 0; // 统计周围的墙壁数量 for (int j = 0; j < 4; j++) { int adjX = nx + dx[j]; int adjY = ny + dy[j]; if (isValid(adjX, adjY) && maze[adjX][adjY] == WALL) { wallCount++; } } // 如果周围有多于1个的墙壁,则打通新位置(nx, ny) if (wallCount >= 2) { maze[nx][ny] = PATH; DFS(nx, ny); // 递归探索新位置 } } } } // 打印迷宫地图 void printMaze() { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { printf("%c ", maze[i][j]); } printf("\n"); } } int main() { srand(time(0)); // 设置随机数种子,以保证每次生成的迷宫都不一样 initMaze(); // 初始化迷宫地图 DFS(0, 0); // 以起点(0, 0)开始进行DFS生成迷宫 printMaze(); // 打印迷宫地图 return 0; } ``` 这是一个简单的使用DFS算法生成迷宫的示例程序。该程序使用一个二维字符数组`maze`来表示迷宫地图,`'#'`表示墙壁,`' '`表示路径。通过递归调用`DFS`函数,从起点开始生成迷宫。在`DFS`函数中,首先将当前位置标记为路径,然后随机打乱四个方向的顺序,从每个方向上递归探索新的位置,直到所有位置都被访问完毕。最后,调用`printMaze`函数打印生成的迷宫地图。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值