#include <stdio.h>
#include <conio.h>
#define YS1 9
#define YS2 9
//全局变量控制上下左右方向
//0 空地 1 墙壁 3 目的地 4 箱子 5 玩家
//7 箱子和目的地重合 8 玩家和目的地重合
int ditu[10][12] = {
{0,0,0,0,1,1,1,0,0,0,0,0},
{0,0,0,0,1,3,1,0,0,0,0,0},
{0,0,0,0,1,0,1,1,1,1,1,1},
{1,1,1,1,1,4,0,4,0,0,3,1},
{1,3,0,0,0,4,5,1,1,1,1,1},
{1,1,1,1,1,1,4,1,0,0,0,0},
{0,0,0,0,0,1,0,1,0,0,0,0},
{0,0,0,0,0,1,0,1,0,0,0,0},
{0,0,0,0,0,1,3,1,0,0,0,0},
{0,0,0,0,0,1,1,1,0,0,0,0}
};
void xianshiditu(int ditu[][12]); //显示地图
void kongzhi(void); //控制上下左右
int main(void)
{
while(1)
{
system("cls");
xianshiditu(ditu);
kongzhi();
}
getch();
return 0;
}
void kongzhi(void)
{
int i, j, k = 0;
int rows, cols;
for(i = 0; i < 10; i++)
{
for(j = 0; j < 12; j++)
{
if(ditu[i][j] == 5 || ditu[i][j] == 7) //获取玩家当前坐标
{
rows = i;
cols = j;
}
}
}
printf("坐标(%d, %d)\n", rows+1, cols+1);
printf("分数:%d\n", k);
switch(getch()) //从键盘获取键盘输入方向
{
case 72 :
case 'w': //上移
case 'W':
// 1 玩家的前面是空地 玩家的前面是目的地
if(ditu[rows-1][cols] == 0 || ditu[rows-1][cols] == 3)
{
ditu[rows][cols] -= 5;
ditu[rows-1][cols] += 5;
}
// 2 玩家前面是箱子 玩家的前面是箱子和目的地重合
else if(ditu[rows-1][cols] == 4 || ditu[rows-1][cols] == 7)
{
//箱子前面是空地 箱子的前面的是目的地
if(ditu[rows-2][cols] == 0 || ditu[rows-2][cols] == 3)
{
ditu[rows-2][cols] += 4;
ditu[rows-1][cols] += 1;
ditu[rows][cols] -= 5;
}
}
break;
case 80 :
case 's': //下移
case 'S':
// 1 玩家的前面是空地 玩家的前面是目的地
if(ditu[rows+1][cols] == 0 || ditu[rows+1][cols] == 3)
{
ditu[rows][cols] -= 5;
ditu[rows+1][cols] += 5;
}
// 2 玩家前面是箱子 玩家的前面是箱子和目的地重合
else if(ditu[rows+1][cols] == 4 || ditu[rows+1][cols] == 7)
{
//箱子前面是空地 箱子的前面的是目的地
if(ditu[rows+2][cols] == 0 || ditu[rows+2][cols] == 3)
{
ditu[rows+2][cols] += 4;
ditu[rows+1][cols] += 1;
ditu[rows][cols] -= 5;
}
}
break;
case 75 :
case 'a': //左移
case 'A':
// 1 玩家的前面是空地 玩家的前面是目的地
if(ditu[rows][cols-1] == 0 || ditu[rows][cols-1] == 3)
{
ditu[rows][cols] -= 5;
ditu[rows][cols-1] += 5;
}
// 2 玩家前面是箱子 玩家的前面是箱子和目的地重合
else if(ditu[rows][cols-1] == 4 || ditu[rows][cols-1] == 7)
{
//箱子前面是空地 箱子的前面的是目的地
if(ditu[rows][cols-2] == 0 || ditu[rows][cols-2] == 3)
{
ditu[rows][cols-2] += 4;
ditu[rows][cols-1] += 1;
ditu[rows][cols] -= 5;
}
}
break;
case 77 :
case 'd': //右移
case 'D':
// 1 玩家的前面是空地 玩家的前面是目的地
if(ditu[rows][cols+1] == 0 || ditu[rows][cols+1] == 3)
{
ditu[rows][cols] -= 5;
ditu[rows][cols+1] += 5;
}
// 2 玩家前面是箱子 玩家的前面是箱子和目的地重合
else if(ditu[rows][cols+1] == 4 || ditu[rows][cols+1] == 7)
{
//箱子前面是空地 箱子的前面的是目的地
if(ditu[rows][cols+2] == 0 || ditu[rows][cols+2] == 3)
{
ditu[rows][cols+2] += 4;
ditu[rows][cols+1] += 1;
ditu[rows][cols] -= 5;
}
}
break;
}
}
//0 空地 1 墙壁 3 目的地 4 箱子 5 玩家
//7 箱子和目的地重合 8 玩家和目的地重合
void xianshiditu(int ditu[][12]) //显示地图
{
int i, j;
for(i = 0; i < 10; i++)
{
for(j = 0; j < 12; j++)
{
switch(ditu[i][j])
{
case 0 : //空地
printf(" ");
break;
case 1 : // 墙壁
printf("〓");
break;
case 4 : //箱子
printf("□");
break;
case 3 : // 目的地
printf("∷");
break;
case 5 : //玩家
case 8 : //玩家和目的地重合
printf("♂");
break;
case 7 : // 箱子和目的地重合
printf("■");
break;
}
}
printf("\n");
}
}