迷宫游戏源代码

 说明:这是我大二开学时候课程设计用c语言做的一个小游戏,在一个.txt文档中放入一个迷宫的初始矩阵(0标识通路,1表示墙),然后运行程序,便可找出迷宫的出路

 

#include"stdio.h"
#include"windows.h"
#define max 100        //设置迷宫的最大长和宽
#define TU '-'         //宏定义当迷宫能够走通时非通路路线的图形
#define LU '#'         //宏定义当迷宫能够走通时通路路线的图形

/*结构体中node存放群找出路时当前节点的数据, 
zhan[]存放堆栈中的各个节点的数据 
move[]存放上下左右四个方位*/
struct yu_su
{
	int row;  //存放行号
	int col;  //存放列号
	int dir;  //存放4个方位, 0为右, 1为下, 2为左, 3为上
}node,zhan[max],move[4]={{1, 0, 0}, {0, 1, 0}, {-1, 0, 0}, {0, -1, 0}};

/*mi_row存放迷宫的行数, mi_col存放迷宫的列数,make[max][max]对迷宫各个节点是否遍历进行标记*/
int mi_row = 0, mi_col = 0, mark[max][max];

/*对迷宫进行初始化*/
int chu_shi(int mi_gong[max][max])  
{
	int choise,temp_col = 0;
	char temp;
	printf("作者:侯青青 \t\t\t\t 完成时间:2010.07.15\n\n");
	printf(" -------------------------------迷宫游戏开始---------------------------------");  
	printf("\n请在  迷宫矩阵图.txt  文件中输入迷宫");
	printf("\n迷宫矩阵左上角第一个元素为迷宫入口,右下角最后一个元素为迷宫出口");
	printf("\n矩阵中数字0代表可通过,数字1代表有障碍物");
	while(1)                                                   //判断迷宫文件是否已经准备好
	{
		printf("\n\n请问是否将迷宫放入  迷宫矩阵图.txt  文件中:");
		printf("\n  1.已经放入");
		printf("\n  2.未放入,退出程序将迷宫放入\n\n请选择相应的数字: ");
	    scanf("%d", &choise);
		if(choise == 1 || choise == 2)
			break;
		else
			printf("\n选择错误,请重新选择!");
	}
	if(choise == 2)     //迷宫文件未准备好,退出程序
	{
		printf("请按 任意键+回车 退出程序!\n");
		return 0;
	}
	else                //迷宫文件准备好了,从文件中将迷宫读出
	{
		FILE *fp;
	    if((fp = fopen("迷宫矩阵图.txt", "r")) == NULL)  //如果不能打开文件,提示用户,并退出程序
		{
			printf("\n不能打开 迷宫矩阵图.txt 文件,请检查文件知否存在或正确!");
			return 0;
		}
		while(1) //将迷宫矩阵的行号存入mi_row中,列号存入mi_col中,并检查迷宫矩阵的行列元素数是否都相等
		{
			temp = fgetc(fp);
			if(temp == EOF)  //文件读取完,跳出循环
			{
				if(temp_col != mi_col)   //如果迷宫矩阵的列号不是全都相同,显示提示语,并退出程序
				{
				 	printf("\n迷宫矩阵任意一列的元素个数必须相同,请修改 迷宫矩阵图.txt 中的迷宫图后再运行程序!");
			        return 0;
				}
				else
				{
					mi_row++;
				    break;
				}
			}
			if(temp != '\n')
		    	temp_col++;
			else 
			{
			    if(temp_col == mi_col)
					temp_col = 0;
				else 
				{
					if(mi_col == 0)
					{
						mi_col = temp_col;
					    temp_col = 0;
					}
					else      //如果迷宫矩阵的行号不是全都相同,显示提示语,并退出程序
					{
						printf("\n迷宫矩阵任意一行的元素个数必须相同,请修改 迷宫矩阵图.txt 中的迷宫图后再运行程序!");
					    return 0;
					}
				}
				mi_row++;
			}

		}//while(1)
		rewind(fp); //文件指针指向文件开头
		for(int i = 0; i < mi_row ; i++)
		{
			for(int j = 0; j < mi_col ; j++)
			{
				temp = fgetc(fp) - 48;  //将迷宫中的ASSIC码转换成数字
                if(temp != 0 && temp != 1)
				{
					printf("\n文件中的内容只能是0或1,请查看并修改!");
					return 0;
				}
				else
				mi_gong[i][j] = temp; //文件中的数没有错误,将其存入到 数组mi_gong[][]中
				mark[i][j] = 0;       //将文件中每个元素的遍历标记清零
				zhan[j + i * mi_row].dir = 0; //将 栈 的方向元素清零
			}
			fgetc(fp);
		}
		fclose(fp);
	}//while(1)
    system("cls");  //清屏
	printf("\n\t\t这是一个 %d行 %d列 的迷宫矩阵!\n", mi_row, mi_col);
	return 1;
}


/*寻找出路函数,如果存在出路,则把出路打印出来*/
void chulu(int mi_gong[max][max])
{
	/*top为栈定数,found存放出路是否找到的标记,found为1则表示出路找到,
      dir存放当前元素正遍历的方位,0为右, 1为下, 2为左, 3为上
	  next_row, next_col分别存放当前元素的下一个元素的行列值*/
	int top = 1, found = 0,dir = 0, next_row, next_col;
	int choise; //  选择输出
	zhan[0].row = 0;  //对栈底进行初始化
	zhan[0].col = 0;
	zhan[0].dir = 0;
	mark[0][0] = 1;  //对0行0列元素标记,说明此元素已经遍历
	while(top > -1 && !found)  //如果栈未假溢出并且迷宫出路没有找到
	{
		top--;
		node = zhan[top]; //将栈顶元素的各项值赋予node
		dir  = node.dir;   
		while(dir < 4 && !found) //当4个方向没有遍历完,并且迷宫出路没有找到
		{
			next_row = node.row + move[dir].row;  //对下一个元素的行值赋值
			next_col = node.col + move[dir].col;  //对下一个元素的列值赋值
			if(next_row >= 0 && next_col >= 0)    //下一个元素的行列值没有溢出
			{
				if(next_row == mi_row - 1 && next_col == mi_col - 1)  //如果下一个元素为出口
				    found = 1;
			    else if(!mi_gong[next_row][next_col] && !mark[next_row][next_col]) //如果下一个元素可通,并且未被标记
				{ 
				    mark[next_row][next_col] = 1;   //此元素标记已经遍历
		    		zhan[top].dir = ++dir;          //当前元素的下一个方向赋值给当前元素
		    	  	top++;	                        //将此元素放入栈顶	
		    		zhan[top].row = node.row = next_row;
		    		zhan[top].col = node.col = next_col;
		      		dir = 0;                        //方向控制dir清零
				}
				else
					dir++;
			}
			else
				dir++;
		}// while(dir < 4 && !found)
	}//while(top > -1 && !found)
	if(found)  //如果迷宫出路找到,则将出路输出
	{
		char tu[max][max];   //tu[][]存放迷宫的出路路径图中的元素 
		for(int q = 0; q < mi_row; q++)  
			for(int w = 0; w < mi_col; w++)
				tu[q][w] = TU;
		printf("\n请选择显示方式:\n  1.显示迷宫出路路径坐标\n  2.显示迷宫出路模拟图\n  0.结束游戏\n");
		printf("\n请选择相应的数字: ");
		scanf("%d", &choise);
		while(choise)
		{
    		switch(choise)    //选择显示方式
			{
	    	case 1:
				{
		     		printf("\n出路路径为:");     //输出出路路径
             		printf("\n行\t列");
	            	for(int i = 0; i <= top; i++)
		            	printf("\n%d\t%d", zhan[i].row+1, zhan[i].col+1);
					printf("\n%d\t%d",mi_row,mi_col);
					choise = 0;
			    	break;
				}
	    	case 2:
				{
		    		for(int i = 0; i <= top; i++)
		            	tu[zhan[i].row][zhan[i].col] = LU;
	     	    	tu[mi_row - 1][mi_col - 1] = LU;    	
         	    	printf("\n迷宫的出路模拟图为\n");
        	    	for(q = 0; q < mi_row; q++)    //将出路路线图输出
					{
	            		for(int w = 0; w < mi_col; w++)
								printf("%c ",tu[q][w]);
	            		printf("\n");
					}
					choise = 0;
					break;
				}
    		default:
				{
			    	printf("输入错误,请重新输入!\n");
					scanf("%d", &choise);
				}
			}//switch(choise)
		}//while(choise)
	}//if(found)
	else    //如果迷宫出路没有找到,提示输出
		printf("\n 此迷宫没有出路!\n");
}

int main()
{
	int mi_gong[max][max];
	if(chu_shi(mi_gong) == 0)//如果迷宫的初始化失败,则退出程序
	{
		getchar();getchar();
		return 0;
	}
	printf("\n迷宫的初始状态为:\n");
	for(int i = 0; i < mi_row; i++) //迷宫的初始化成功,输出迷宫的初始状态
	{
		for(int j = 0; j < mi_col; j++)
			printf("%d ",mi_gong[i][j]);
		printf("\n");
	}
	chulu(mi_gong);  //调用寻找出路函数
	printf("\n-----------------------------游戏结束---------------------------------");
	printf("\n\n\t\t\t\t\t\t作者:侯青青\n\t\t\t\t\t\t完成时间:2010.07.15");
	getchar();getchar();
	return 0;
}


 

 程序运行效果图:

 

 

 

 

 

欢迎大家转载,如有转载请注明文章来自:   http://blog.csdn.net/q345852047

 

你可能感兴趣的:(算法)