无贴图版推箱子控制台之代码

推箱子的思路:用一个二维数组代表地图,二维数组里面的值代表,人,箱子,围墙,目的地;
人物,箱子移动,其实是二维数组里面的值改变

人物,箱子,人分别代表不同的值:
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软件编的

发布了5 篇原创文章 · 获赞 9 · 访问量 132

猜你喜欢

转载自blog.csdn.net/weixin_41946168/article/details/105514242