⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 puzzle2.c

📁 自动创建一个迷宫地图,并在置一小人物,实现动态的找迷宫出口,是数据结构中一个非常典型的例子.
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define UNIT "█"		//当值等于0时,输出█
#define GOOVER "※"     //当值等于-1时,输出※
#define PEOPLE "♀"		//当值※等于3时,输出♀
#define RIGHT "→"		//当值等于4时,输出→
#define DOWN "↓"		//当值等于5时,输出↓
#define LEFT "←"		//当值等于6时,输出←
#define UP "↑"			//当值等于7时,输出↑

int unit[36][21];       //迷宫的框架


typedef struct SNode{
	int data;
	struct SNode *next;
}SNode;

typedef struct{
	SNode *top;
	int length;
}SqStack;

void Push(SqStack *Stack,int indata);		//入栈
int Pop(SqStack *Stack,int *exdata);		//出栈
void InitPuz();			//初始化迷宫框架
void ShowPuz();			//显示迷宫
void PlayPuz();			//开始游戏

main()
{	
	int i=1;
	system("color 2A");		//设置程序的界面颜色,保护眼睛~
	PlayPuz();
	system("pause");		//为了不让程序自行关闭,在此设置了一个停止
}

//入栈,indata为入栈的数据
void Push(SqStack *Stack,int indata)
{
	SNode *NewNode;
	int i;
	NewNode=(SNode *)malloc(sizeof(SNode));
	if(!NewNode)
	{
		printf("内存分配错误!程序将自动退出!");
		for(i=0;i<10000;i++);
	}
	NewNode->data=indata;
	NewNode->next=Stack->top;
	Stack->top=NewNode;
	Stack->length++;
	return;
}

//出栈,exdata为出栈数据
int Pop(SqStack *Stack,int *exdata)
{
	SNode *p;
	p=Stack->top;
	if(Stack->top!=NULL)
	{
		*exdata=Stack->top->data;
		Stack->top=p->next;
		Stack->length--;
		free(p);
		return 1;
	}
	return 0;	
}


//初始化迷宫的框架
void InitPuz()
{
	int i,j;
	int random;
	srand(time(NULL));
	
	for(i=1;i<36;i++)		//为数组赋值,0为障碍,1为可行路径
	{
		for(j=1;j<21;j++)
		{
			if(1==i||35==i||1==j||20==j)
				unit[i][j]=0;
			else
			{
				random=rand()%9;
				if(random<6)	unit[i][j]=1;		//6为难度系数,可设置难度,数字越大,难度越小
				else	unit[i][j]=0;
			}
		}
	}
}


//打印迷宫
void ShowPuz()
{	
	int i,j;
	system("cls");
	printf("	   ╔━━━━━━━━━━━━━━━━━━━━━╗\n");
	printf("	   ┃       迷宫——栈的应用	by 郑康生      ┃ \n");
	printf("	   ╚━━━━━━━━━━━━━━━━━━━━━╝\n");
	for(j=1;j<21;j++)											
	{
		for(i=1;i<36;i++)
		{
			switch(unit[i][j])			//根据unit[][]中存储的值,来输出已定义好的字符
			{
			case -1:
				printf("%s",GOOVER);		//由于所使用到的图形都占两个字符,所以要用%s
				break;
			case 0:
				printf("%s",UNIT);			//当unit[][]为0时输出█,即为障碍				
				if(35==i)	printf("\n");
				break;
			case 1:
				printf("  ");
				break;
			case 2:
				printf("日\n");			//出口
				break;
			case 3:
				printf("%s",PEOPLE);
				break;
			case 4:
				printf("%s",RIGHT);
				break;
			case 5:
				printf("%s",DOWN);
				break;
			case 6:
				printf("%s",LEFT);
				break;
			case 7:
				printf("%s",UP);
				break;
			}
		}
	}
}/**/

//开始游戏
void PlayPuz()
{
	SNode *NUL;
	int i=2,j=2,exdata;
	SqStack Stack;
	InitPuz();
	unit[35][19]=2;		//2为终点位置的值
	unit[2][2]=3;		//3为输出人的代码,也就是人的位置
	Stack.top=NULL;		//栈的初始化
	Stack.length=0;
	ShowPuz();
	while(i>=1&&i<36&&j>=1&&j<21)		//核心,循环主要是用来探路的,还有就是出栈,入栈就用在于此
	{
		ShowPuz();
		if(2==unit[i+1][j])			//达到终点
		{
			unit[i][j]=4;
			i++;
			unit[i][j]=3;
			Push(&Stack,4);
			printf("\n\n\n                     恭喜您已成功迷走出迷宫!\n");
			for(;Stack.top!=NULL;)			//及时清理内存,否则将导致电脑奇卡无比~
			{
				NUL=Stack.top;
				Stack.top=NUL->next;
				free(NUL);
			}
			return;
		}
		if(1==unit[i+1][j])		//向右走
		{
			unit[i][j]=4;
			i++;
			unit[i][j]=3;
			Push(&Stack,4);
		}
		else
		{
			if(1==unit[i][j+1])//向下走
			{
				unit[i][j]=5;
				j++;
				unit[i][j]=3;
				Push(&Stack,5);
			}
			else
			{
				if(1==unit[i-1][j])//向左走
				{
					unit[i][j]=6;
					i--;
					unit[i][j]=3;
					Push(&Stack,6);
				}
				else
				{
					if(1==unit[i][j-1])//向上走
					{
						unit[i][j]=7;
						j--;
						unit[i][j]=3;
						Push(&Stack,7);
					}
					else
					{
						if(Stack.top==NULL)			//迷宫无出口,回到初始位置
						{
							printf("\n\n                           迷宫无出口!\n\n");
							return;
						}
						else
						{
							if(Pop(&Stack,&exdata))	
							{
								switch(exdata)
								{
								case 4:
									unit[i][j]=-1;
									i--;
									unit[i][j]=3;
									break;
								case 5:
									unit[i][j]=-1;
									j--;
									unit[i][j]=3;
									break;
								case 6:
									unit[i][j]=-1;
									i++;
									unit[i][j]=3;
									break;
								case 7:
									unit[i][j]=-1;
									j++;
									unit[i][j]=3;
									break;
								}
							}
						}
					}
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -