#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int arr[9][11] =
{
{ 0,1,1,1,1,1,1,1,1,1,0 },//0代表空地
{ 0,1,0,0,0,1,0,0,0,1,0 },//1代表墙
{ 0,1,0,4,4,4,4,4,0,1,0 },//3代表目的地
{ 1,1,0,4,0,4,0,4,0,1,1 },//4代表箱子
{ 0,1,0,0,0,5,0,0,4,0,1 },//5代表人
{ 1,1,0,0,0,1,1,0,4,0,1 },
{ 1,0,3,3,3,3,3,1,0,0,1 },
{ 1,0,3,3,3,3,3,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,0 }
};
void drawMap()
{
for(int i = 0; i < 9; i++)
{
for(int j = 0 ; j < 11; j++)
{
switch(arr[i][j])
{
case 0:
cout<<" ";//0代表空地
break;
case 1:
cout<<"■";//1代表墙
break;
case 3:
cout<<"☆";//3代表目的地
break;
case 4:
cout<<"□";//4代表箱子
break;
case 5:
cout<<"♀";//5代表人
break;
case 7:
cout<<"★";//箱子在目的地中
break;
case 8:
cout<<"♀";//人在目的地中
break;
}
}
cout<<endl;
}
}
void playGame()
{
int r,c; //首先要找到人的所在位置,记住人的下标
for(int i = 0; i < 9; i++)
{
for(int j = 0 ; j < 11; j++)
{
if(arr[i][j] == 5 || arr[i][j] == 8)
{
r=i;
c=j;
break;
}
}
}
char ch;//键盘的输入保存到字符中
ch = getch();
//getch() 直接接受,不显示回文,getchar()显示回文可以修改 enter键结束
/*
有哪些情况可以移动?
1人前面是空地
2人前面是目的地
3人前面是箱子
3.1箱子前面是空地
3.2箱子前面是目的地
*/
switch(ch)
{
case 'W': //W A S D方向 72 80 75 77
case 'w':
case 72:
/* 优化为下面的代码
if(arr[r-1][c] == 0 )
{
arr[r-1][c]=5;
arr[r][c]=0;
}
if()
{
arr[r-1][c]=8;
arr[r][c]-=5;
}
*/
if(arr[r-1][c] == 0 ||arr[r-1][c] == 3 )//人向上移动
{ //人的上面是空地 或者 人的上面是木的地
arr[r-1][c]+= 5; //人到达的地方数字加5
arr[r][c] -=5; //人离开的地方数字减5
}
if(arr[r-1][c] == 4 || arr[r-1][c] == 7)
{
if(arr[r-2][c] ==0 || arr[r-2][c] ==3)
{
arr[r-2][c]+=4;//箱子到了的地方原来地方+4
arr[r-1][c]+=1;//箱子离开-4,人来了+5所以只+1
arr[r][c] -=5;//人离开了减5
}
}
break;
//搞清楚了向上运动的规律,向下arr[r+1][c],向左arr[r][c-1],向右arr[r][c+1]一样的规律
case 'A':
case 'a':
case 80:
if(arr[r][c-1] == 0 ||arr[r][c-1] == 3 )
{
arr[r][c-1]+= 5;
arr[r][c] -=5;
}
if(arr[r][c-1] == 4 || arr[r][c-1] == 7)
{
if(arr[r][c-2] ==0 || arr[r][c-2] ==3)
{
arr[r][c-2]+=4;
arr[r][c-1]+=1;
arr[r][c] -=5;
}
}
break;
case 'S':
case 's':
case 75:
if(arr[r+1][c] == 0 ||arr[r+1][c] == 3 )
{
arr[r+1][c]+= 5;
arr[r][c] -=5;
}
if(arr[r+1][c] == 4 || arr[r+1][c] == 7)
{
if(arr[r+2][c] ==0 || arr[r+2][c] ==3)
{
arr[r+2][c]+=4;
arr[r+1][c]+=1;
arr[r][c] -=5;
}
}
break;
case 'D':
case 'd':
case 77:
if(arr[r][c+1] == 0 ||arr[r][c+1] == 3 )
{
arr[r][c+1] += 5;
arr[r][c] -= 5;
}
if(arr[r][c+1] == 4 || arr[r][c+1] == 7)
{
if(arr[r][c+2] ==0 || arr[r][c+2] ==3)
{
arr[r][c+2] += 4;
arr[r][c+1] += 1;
arr[r][c] -= 5;
}
}
break;
}
}
int endGame(int count)
{
for(int i = 0; i < 9; i++)
{
for(int j = 0 ; j < 11; j++)
{
if(arr[i][j] == 7)
{
count++;
}
}
}
return count;
}
int main()
{
int count=0;
while(1)
{
system("cls");
drawMap();
playGame();
if(endGame(count) == 10)
{
break;
}
}
cout<<"恭喜你完成了!"<<endl;
system("pause");
return 0;
}
程序运行效果图,可以实现推箱子游戏的各种移动。