📄 puzzle2.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 + -