#include<stdio.h>
#include <stdlib.h>
#include <conio.h>
void keydown();
void draw();
int yanzheng();
int a[8][8]={
{1,1,1,1,1,1,1,1},
{1,1,0,0,0,0,1,1},
{1,1,0,1,0,0,1,1},
{1,0,0,1,1,0,1,1},
{1,0,4,4,3,3,0,1},
{1,0,0,0,1,1,0,1},
{1,1,5,0,1,0,0,1},
{1,1,1,1,1,1,1,1}
};
//打印一个8行8列的map
void draw()
{
//0:空的 1:▆ 3:☆ 4:★ 5:※ 7:⊙ 8:※
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
switch(a[i][j])
{
case 1:
printf("▆"); //表示墙壁
break;
case 0:
printf(" "); //表示空地
break;
case 3:
printf("☆"); //表示目的地
break;
case 4:
printf("★"); //表示箱子
break;
case 5:
printf("※"); //表示人
break;
case 7:
printf("⊙"); //表示箱子在目的地
break;
case 8:
printf("※"); //表示人站在目的地上
break;
}
}
printf("\n");
}
}
//键盘输入与游戏逻辑
void keydown()
{
int i,j;
char c=_getch(); //看不家的字符输入,要加头文件coni0.h
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(a[i][j]==5||a[i][j]==8)
{
break;
}
}
if(a[i][j]==5||a[i][j]==8)
{
break;
}
} //找到人的位置
switch(c)
{
case 'w':
case 'W':
case 72:
{
if(a[i-1][j]==0||a[i-1][j]==3) //判断前方是不是空地或者目的地
{
a[i-1][j]+=5; //把上一个赋值加上5,表示人或者人站在目的地的上
a[i][j]-=5; //把原来的赋值减5,表示空地或者目的地
}
else if(a[i-1][j]==4||a[i-1][j]==7) //判断前方是不是箱子或者箱子在目的地上
{
if(a[i-2][j]==0||a[i-2][j]==3) //在原来的判断上判断前方的前方是不是空地或者目的地
{
a[i-2][j]+=4; //把前方的前方的赋值加4,表示箱子或者箱子在目的地上
a[i-1][j]+=1; //把前方的赋值加1,表示表示人或者人站在目的地的上
a[i][j]-=5; //把原来位置的赋值减5,表示空地或者目的地
}
}
}
break; //前进变换
case 's':
case 'S':
case 80:
{
if(a[i+1][j]==0||a[i+1][j]==3) //判断前方是不是空地或者目的地
{
a[i+1][j]+=5; //把上一个赋值加上5,表示人或者人站在目的地的上
a[i][j]-=5; //把原来的赋值减5,表示空地或者目的地
}
else if(a[i+1][j]==4||a[i+1][j]==7) //判断前方是不是箱子或者箱子在目的地上
{
if(a[i+2][j]==0||a[i+2][j]==3) //在原来的判断上判断前方的前方是不是空地或者目的地
{
a[i+2][j]+=4; //把前方的前方的赋值加4,表示箱子或者箱子在目的地上
a[i+1][j]+=1; //把前方的赋值加1,表示表示人或者人站在目的地的上
a[i][j]-=5; //把原来位置的赋值减5,表示空地或者目的地
}
}
}
break; //后退变换
case 'a':
case 'A':
case 75:
{
if(a[i][j-1]==0||a[i][j-1]==3) //判断前方是不是空地或者目的地
{
a[i][j-1]+=5; //把上一个赋值加上5,表示人或者人站在目的地的上
a[i][j]-=5; //把原来的赋值减5,表示空地或者目的地
}
else if(a[i][j-1]==4||a[i][j-1]==7) //判断前方是不是箱子或者箱子在目的地上
{
if(a[i][j-2]==0||a[i][j-2]==3) //在原来的判断上判断前方的前方是不是空地或者目的地
{
a[i][j-2]+=4; //把前方的前方的赋值加4,表示箱子或者箱子在目的地上
a[i][j-1]+=1; //把前方的赋值加1,表示表示人或者人站在目的地的上
a[i][j]-=5; //把原来位置的赋值减5,表示空地或者目的地
}
}
}
break; //向左变换
case 'd':
case 'D':
case 77:
{
if(a[i][j+1]==0||a[i][j+1]==3) //判断前方是不是空地或者目的地
{
a[i][j+1]+=5; //把上一个赋值加上5,表示人或者人站在目的地的上
a[i][j]-=5; //把原来的赋值减5,表示空地或者目的地
}
else if(a[i][j+1]==4||a[i][j+1]==7) //判断前方是不是箱子或者箱子在目的地上
{
if(a[i][j+2]==0||a[i][j+2]==3) //在原来的判断上判断前方的前方是不是空地或者目的地
{
a[i][j+2]+=4; //把前方的前方的赋值加4,表示箱子或者箱子在目的地上
a[i][j+1]+=1; //把前方的赋值加1,表示表示人或者人站在目的地的上
a[i][j]-=5; //把原来位置的赋值减5,表示空地或者目的地
}
}
}
break; //向右变换
}
}
//验证是否已经结束游戏
int yanzheng()
{
int i,j;
int count=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(a[i][j]==7)
{
count+=1;
}
}
}
return count;
}
int main()
{
int c;
while(1)
{
draw();
c=yanzheng();
if(c==2)
{
printf("game over\n");
break;
}
keydown();
system("cls");
}
system("pause");
return 0;
}