#include <stdio.h>
#include <conio.h>
#include <windows.h>
/*
1.人,箱子,空地,墙,目的地,在目的地的箱子,在目的地的人
人->1
箱子->2
空地->0
墙->3
目的地->4
在目的地的箱子->2+4=6
在目的地的人->4+1=5;
*/
//定义地图
int win=0;//判断输赢的标志
int place=0;//目的地的个数
int place_box=0;//在目的地的箱子的个数
int map[8][8] = {
{ 0,0,3,3,3,0,0,0 },
{ 0,0,3,4,3,0,0,0 },
{ 0,0,3,0,3,3,3,3 },
{ 3,3,3,2,0,2,4,3 },
{ 3,4,0,2,1,3,3,3 },
{ 3,3,3,3,2,3,0,0 },
{ 0,0,0,3,4,3,0,0 },
{ 0,0,0,3,3,3,0,0 }
};
//计算目的地的个数
void number_place()
{
for(int i = 0; i < 8;i++)
{
for(int j = 0; j < 8; j++)
{
if(map[i][j] == 4)
{
place++;
}
}
}
}
//上下左右移动
/*
上 w;
下 s,
左 a,
右 d
*/
void move()
{
int row, col;
//找到人的位置
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (map[i][j] == 1)
{
row = i;
col = j;
break;
}
}
}
char ch;
ch = getch();//获取方向
switch (ch)
{
case 'w':
if (map[row - 1][col] == 0)//如果人的上方是空地,直接空地与人交换
{
map[row - 1][col] = 1;
map[row][col] = 0;
}
else if (map[row - 1][col] == 2 && map[row - 2][col] == 0)//如果人的上方是箱子,箱子的上方是空地
{
map[row - 2][col] = 2;
map[row - 1][col] = 1;
map[row][col] = 0;
}
else if(map[row - 1][col] == 2 && map[row - 2][col] == 4)//如果人的上方是箱子,箱子的上方是目的地
{
map[row - 2][col] = 6;
map[row - 1][col] = 1;
map[row][col] = 0;
place_box++;
}
break;
case 's':
if (map[row + 1][col] == 0)//如果人的下方是空地,直接空地与人交换
{
map[row + 1][col] = 1;
map[row][col] = 0;
}
else if (map[row + 1][col] == 2 && map[row + 2][col] == 0)//如果人的下方是箱子,箱子的上方是空地
{
map[row + 2][col] = 2;
map[row + 1][col] = 1;
map[row][col] = 0;
}
else if(map[row + 1][col] == 2 && map[row + 2][col] == 4)//如果人的下方是箱子,箱子的上方是目的地
{
map[row + 2][col] = 6;
map[row + 1][col] = 1;
map[row][col] = 0;
place_box++;
}
break;
case 'a':
if (map[row][col - 1] == 0)//如果人的左方是空地,直接空地与人交换
{
map[row][col - 1] = 1;
map[row][col] = 0;
}
else if (map[row][col - 1] == 2 && map[row][col - 2] == 0)//如果人的左方是箱子,箱子的左方是空地
{
map[row][col - 2] = 2;
map[row][col - 1] = 1;
map[row][col] = 0;
}
else if(map[row][col - 1] == 2 && map[row][col - 2] == 4)//如果人的左方是箱子,箱子的左方是目的地
{
map[row][col - 2] = 6;
map[row][col - 1] = 1;
map[row][col] = 0;
place_box++;
}
break;
case 'd':
if (map[row][col + 1] == 0)//如果人的右方是空地,直接空地与人交换
{
map[row][col + 1] = 1;
map[row][col] = 0;
}
else if (map[row][col + 1] == 2 && map[row][col + 2] == 0)//如果人的右方是箱子,箱子的右方是空地
{
map[row][col + 2] = 2;
map[row][col + 1] = 1;
map[row][col] = 0;
}
else if (map[row][col + 1] == 2 && map[row][col + 2] == 4)//如果人的右方是箱子,箱子的右方是目的地
{
map[row][col + 2] = 6;
map[row][col + 1] = 1;
map[row][col] = 0;
place_box++;
}
break;
}
if(place_box == place)//如果在目的地的箱子数等于目的地数,就赢了
{
win=1;
return ;
}
}
//绘制界面
void print()
{
system("cls");
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (map[i][j] == 1 || map[i][j] == 5)
{
printf("▲");
}
else if (map[i][j] == 2 || map[i][j] == 6)
{
printf("□");
}
else if (map[i][j] == 3)
{
printf("■");
}
else if (map[i][j] == 4)
{
printf("★");
}
else
{
printf(" ");
}
}
printf("\n");
}
if(win == 1)//如果已经赢了,就只需打印最后一次,不必再移动
{
return ;
}
move();
}
int main()
{
number_place();
while (1)
{
print();
if(win == 1)//如果赢了
{
print();//打印最后一次,然后退出循环
break;
}
}
printf("恭喜你!游戏通关了!\n");
return 0;
}