推箱子的思路:用一个二维数组代表地图,二维数组里面的值代表,人,箱子,围墙,目的地;
人物,箱子移动,其实是二维数组里面的值改变
人物,箱子,人分别代表不同的值:
1111111111111111
1000000002000001
1000020000000001
1000004000000001
1000000003000001
1111111111111111
就是这样的思路。
但是呢,这个地图只有一个,没有多开发出别的
#include<iostream>
#include<conio.h>//为了使用_getch()
using namespace std;
int map[10][10]={
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 2, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 3, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 4, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};
//0空地 1围墙 2人 3箱子 4目的地 6人在目的地上 7箱子在目的地
void Draw()//画地图
{
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
cout<<map[i][j]<<" ";
}
cout<<endl;
}
}//打印了推箱子的
bool win()
{
int x=0;//记录空地上的箱子的个数,是0个游戏结束
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(map[i][j]==3)//3指的是箱子
x++;
}
}
//找空地有没有箱子在死角,在死角,游戏结束
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(map[i][j]==3)
{
if(map[i-1][j]==1||map[i+1][j]==1)//上或下是否有墙,有墙进入下一个
{
if(map[i][j-1]==1||map[i][j+1]==1)
{
return true;//结束游戏,因为箱子在死角
}
}
}
}
}
if(x==0)//是0,游戏胜利
return true;//结束游戏
return false;//空地上还有箱子,继续游戏
}
void play()
{
int x=0,y=0;
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(map[i][j]==2)
{
x=i;
y=j;//获取人的坐标
}
}
}
switch(_getch())
{
case 'w':
if(map[x-1][y]==0||map[x-1][y]==4)//即前面的路是目的地或者是空地,人走过去就是加2之前的路就就是减2
{
map[x-1][y]+=2;
map[x][y]-=2;
}
else if(map[x-1][y]==3||map[x-1][y]==7)//如果前面是箱子或者箱子加目的地
{
if(map[x-2][y]==0||map[x-2][y]==4)//前前面是空地或者是箱子的目的地
{
map[x][y]-=2;//那当前的路就减2
map[x-1][y]-=1;//那下一个路就减一
map[x-2][y]+=3;//前前面就加3
}
}
break;
case 's':
if (map[x + 1][y] == 0||map[x + 1][y] == 4)
{
map[x + 1][y] += 2;
map[x][y] -= 2;
}
else if (map[x + 1][y] == 3 || map[x + 1][y] == 7)
{
if (map[x + 2][y] == 0 || map[x + 2][y] == 4)
{
map[x][y] -= 2;
map[x + 1][y] -= 1;
map[x + 2][y] += 3;
}
}
break;
case 'a':
if (map[x][y - 1] == 0 || map[x][y - 1] == 4)
{
map[x][y-1] += 2;
map[x][y] -= 2;
}
else if (map[x][y - 1] == 3 || map[x][y - 1] == 7)
{
if (map[x][y-2] == 0 || map[x][y-2] == 4)
{
map[x][y] -= 2;
map[x][y-1] -= 1;
map[x][y-2] += 3;
}
}
break;
case 'd':
if (map[x][y + 1] == 0 || map[x][y + 1] == 4)
{
map[x][y + 1] += 2;
map[x][y] -= 2;
}
else if (map[x][y + 1] == 3 || map[x][y + 1] == 7)
{
if (map[x][y + 2] == 0 || map[x][y + 2] == 4)
{
map[x][y] -= 2;
map[x][y + 1] -= 1;
map[x][y + 2] += 3;
}
}
break;
}
}
void Drwa()
{
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
cout<<map[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
Drwa();
while(1)
{
play();
system("cls");//清屏会使程序在控制台上显示的稳定
Drwa();//然后就是会重新画图
if(win())
break;//就跳出游戏了
}
cout<<"游戏结束"<<endl;
system("pause");
return 0;
}
我用的是VS软件编的