#include <stdio.h>//标准输入输出头文件
#include <stdlib.h>//system函数的头文件
#include <conio.h>//getch函数的头文件
char map[14][16];//存放读出的地图
int n=1;//用于控制从文件中读出的字符数,过关n++
static goal =0;//在每次读地图前记录下目的地的个数
int totalBox =0;//箱子的数量
int person_x =1,person_y = 1;//人的初始化坐标
int goalPlace[22]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void ReadMap()//读入地图并打开地图
{
int goalNum = 0;
FILE *fp;
fp = fopen("","r");//以输出的方式打开文件
if(fp == NULL)//如果打不开
{
printf("you can not open map\n");
exit(0);
}
char guan = 0;
char lastChar = NULL;//把最后一个字符赋值为空
for(int y=0;y<(n-1)*(14*17+4);y++)
guan= fgetc(fp);//打开文件中的地图
for(int x=0;x<4;x++)
{guan=fgetc(fp);
}
for(int i = 0;i<14;i++)
{for(int j=0;j<17;j++)
{guan = fgetc(fp);
if(guan == '6')//计算并存储"人"的坐标
{
person_x = i;
person_y = j;
}
if(guan == '3')//计算并存储"目的地"的坐标,与箱子的个数
{
totalBox++;
goalPlace[goalNum++] = i;
goalPlace[goalNum++] = j;
}
if(j != 17)
map[i][j] = guan;
}
}
fclose(fp);//关闭地图文件
goal = goalNum/2;
}
void ShowMap()//输出地图并使地图美观
{
char display;
system("cls");//清屏函数,清除上一步的地图并张显下一关的地图
system("color 0D");//增加颜
printf("\n\n----------欢迎进入推箱子游戏!-------------\n");
printf("\nw=up\na=left\nd=right\ns=down\n");
for(int i = 0;i<14;i++)//美化并输出地图
{
for(int j=0;j<16;j++)
{
display = map[i][j];
if(display =='0')  printf("  ");
else if(display == '1') printf("▇");
else if(display == '2') printf("  ");
else if(display == '3') printf("★");
else if(display == '4') printf("⊙");
else if(display == '6') printf("●");
}
printf("\n");
}
}
bool PlayGame()//人的移动的每一步的走法
{bool flag = false;
char play;
play = getch();//输入一个字符让人走动
switch(play)//当输入的是指定字符的时候
{
case 'w'://如果是向上移动
{
if(map[person_x-1][person_y] == '4')//人的前面是箱子
{
if(map[person_x-2][person_y]=='2'||map[person_x-2][person_y]=='3')//是空地或目的地
{
map[person_x-2][person_y] = '4';//把"箱子"推到前面
map[person_x-1][person_y] = '6';//人"往前走一步
map[person_x][person_y] = '2';//"人"走过的地方补为"空地"
flag = true;//移动合法
}
}
else if(map[person_x-1][person_y] == '3'||map[person_x-1][person_y] == '2')//人的前面是目的地或空地
{
map[person_x-1][person_y] = '6';//人往前一步
map[person_x][person_y] = '2';//走过的地方变为空地
flag = true;//如
果移动合法
}
if(flag)//如果人移动合法并完成移动
{
person_x =person_x-1;//进行坐标的交换
person_y = person_y;
}
}
break;
case 'a':
{
if(map[person_x][person_y-1] == '4')//如果人的左面是箱子
{
if(map[person_x][person_y-2]=='2'||map[person_x][person_y-2]=='3')//箱子的左面是空地或目的地
{
map[person_x][person_y-2] = '4';//空地或目的地就变成箱子
map[person_x][person_y-1] = '6';
map[person_x][person_y] = '2';
flag = true;//移动合法
}
}
else if(map[person_x][person_y-1] == '3'||map[person_x][person_y-1] == '2')//如果人左面是目的地或空地
{
map[person_x][person_y-1] = '6';
map[person_x][person_y] = '2';
flag = true;
}
system的头文件
if(flag)//如果"人"移动合法并完成移动
{
person_x =person_x;
person_y = person_y-1;
}
}
break;
case 's':
{
if(map[person_x+1][person_y] == '4')//下面是箱子
{
if(map[person_x+2][person_y]=='2'||map[person_x+2][person_y]=='3')//箱子下面又是空地或目的地
{
map[person_x+2][person_y] = '4';//目的地或空地变成箱子
map[person_x+1][person_y] = '6';//箱子原来的位置变换成人
map[person_x][person_y] = '2';//人的原来位置变为空地
flag = true;//移动合法
}
}
else if(map[person_x+1][person_y] == '3'||map[person_x+1][person_y] == '2')//人的下面是目的地或空地
{
map[person_x+1][person_y] = '6';
map[person_x][person_y] = '2';
flag = true;
}
if(flag)//人的移动合法并完成移动
{
person_x =person_x+1;//进行坐标的交换
person_y = person_y;
}
}
break;
case 'd':
{
if(map[person_x][person_y+1] == '4')//如果右面是箱子
{
if(map[person_x][person_y+2]=='2'||map[person_x][person_y+2]=='3')
{
map[person_x][person_y+2] = '4';
map[person_x][person_y+1] = '6';
map[person_x][person_y] = '2';
flag = true;
}
}
else if(map[person_x][person_y+1] == '3'||map[person_x][person_y+1] == '2')//如果"人"右是"空地"或者是"目的地"。
{
map[person_x][person_y+1] = '6';
map[person_x][person_y] = '2';
flag = true;
}
if(flag)//如果"人"移动合法并完成移动
{
person_x =person_x;//则进行"人"坐标的转换
person_y = person_y+1;
}
}
break;
default:
break;
}
int num =0;
for(int forMap =0;forMap<11;forMap++)//让人走过的目的地不会变为空地
{
if(map[goalPlace[num]][goalPlace[num+1]] =='2')//如果目的地是空地
map[goalPlace[num]][goalPlace[num+1]] = '3';//就变回原来的目的地
num+=2;//是一维数组两个来存目的地坐标的,因此要+2才能读出下一个坐标
}
int number=0;
for(int i=0;i<goal;i++)//计算目的地的个数
{
if(map[goalPlace[number++]][goalPlace[number+1]] != '4')
retu
rn true;
number++;
}
return false;
}
int main()//主函数完成对每个函数的调用,完成计分
{
start: ReadMap();//调用函数
while(1)//默认为真
ShowMap();
if(PlayGame());//如果移动了并且合法
else{
ShowMap();
n++; //进入下一关
system("color 0A");
int count=-1;
count=count+n;//过一关得一分,累加计分函数
{printf("\n\n当前得分:%d\n",count);
}
printf("\n\n加油哦!^-^");
printf("过关了!\n欢迎进入下一关\n");
system("pause");
goto start;//转到start
break;
}
}
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。