C语言—推箱子

推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

简单的推箱子游戏受到了广大人民的热爱,让我们来看看程序员眼中的推箱子是什么样子的。下面我给大家介绍一下推箱子的C源代码。

要完成推箱子项目首先要了解推箱子的几大重点:人、箱子、目的地、墙、空地。它们是如何组合在一起的,之间的关系又是什么?

我们可以用数字来代表它们和它们之间的关系,比如0代表空地,1代表墙,3代表目的地,4代表箱子,5代表人,7代表箱子已经在目的地上,8代表人站在目的地上。人物关系弄清楚后我们就可以绘制关卡的地图了。

地图完成之后就是操作,操作我们就用键盘的上下左右键来进行。

while(1)
	    {
			int ch=getch();
	     	if(ch)
	     	{
	     		ch=getch();
	     	}
	     	switch(ch)
	     	{
	     	case ch_up:
		     	Key_up(arr);
		     	break;
	     	case ch_down:
		     	Key_down(arr);
		     	break;
	     	case ch_left:
		     	Key_left(arr);
		     	break;
		    case ch_right:
		     	Key_right(arr);
		     	break;
			case ch_reset:
				Key_reset=1;
				break;
	     	default:
		     	break;
	     	}
	     	Show(arr); 
	     	if(Gameover(arr))
	     	{
				if(game_tier==TIME)
				{
					printf("********恭喜您已经通关所有关卡!!!********\n");
				}
				game_tier++;
				printf("\n\n");
				printf("******************************\n");
	     		printf("********恭喜通关!!!      **\n");
		     	printf("********请选择接下来的操作: **\n");
		     	printf("********1、重新挑战。       **\n");
		     	printf("********2、挑战下一关。     **\n");
				printf("********3、选择关卡。       **\n");
		     	printf("********4、退出游戏。       **\n");
				printf("******************************\n");
		     	scanf("%d",&Key_a);
		     	break;
		    }
			if(Key_reset==1)
			{
				Key_reset=0;
				break;
			}
	    }

用getch()函数来读取键盘的值,switch语句进行选择将要进行的操作。Key_up(),Key_down(),Key_left(),Key_right(),四个函数分别对读取到的指令进行执行,我们以Key_up()为例进行详细介绍。

void Key_up(int (*arr)[8])
{
	int i=0;
	int j=0;
	int flg_a=0;
	for(i=0;i<8;i++)             //找到人的坐标i,j
	{
		for(j=0;j<8;j++)
		{
			if(arr[i][j]==5||arr[i][j]==8)
			{
				flg_a=1;
				break;
			}
		}
		if(flg_a==1)
		{
			break;
		}
	}
    if(arr[i-1][j]==0)            //上面是空地
	{
		if(arr[i][j]==5)
		{
		    arr[i-1][j]=5;
	      	arr[i][j]=0;
		}
		else
		{
		    arr[i-1][j]=5;
	      	arr[i][j]=3;
		}

	}
	else if(arr[i-1][j]==4&&arr[i-2][j]==0)     //上面是箱子
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=4;
	     	arr[i-1][j]=5;
		    arr[i][j]=0;

		}
		else
		{
			arr[i-2][j]=4;
	     	arr[i-1][j]=5;
		    arr[i][j]=3;
		}
		
	}
	else if(arr[i-1][j]==4&&arr[i-2][j]==3)    //上面是箱子,箱子上是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=7;
	     	arr[i-1][j]=5;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i-2][j]=7;
	     	arr[i-1][j]=5;
	     	arr[i][j]=3;
		}
	
	}
	else if(arr[i-1][j]==3)                //上面是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i-1][j]=8;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i-1][j]=8;
	     	arr[i][j]=3;
		}
	}
	else if(arr[i-1][j]==7&&arr[i-2][j]==3)         //上面是箱子在目的地上,箱子的上面还是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=7;
			arr[i-1][j]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i-2][j]=7;
			arr[i-1][j]=8;
			arr[i][j]=3;
		}
	}
	else if(arr[i-1][j]==7&&arr[i-2][j]==0)        //上边是箱子在目的地上,箱子上边是空地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=4;
			arr[i-1][j]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i-2][j]=4;
			arr[i-1][j]=8;
			arr[i][j]=3;
		}
	}
}

我们的操作是对人来进行的,所以我们首先得找到人所在的具体坐标,遍历整个二维数组,找到5或者8的位置(8是指人和目的地在同一个坐标),假设人的坐标是i,j,那么arr[i][j]=5或者arr[i][j]=8;;接下来我们就得判断人上面的各种情况,

1.人上面是空地  arr[i-1][j]==0。

2.人上面是箱子,箱子上面是空地  arr[i-1][j]==4&&arr[i-2][j]==0。

3.人的上面是箱子,箱子上是目的地  arr[i-1][j]==4&&arr[i-2][j]==3。

4.人的上面是目的地  arr[i-1][j]==3。

5.人的上面是箱子在目的地上,箱子的上面还是目的地  arr[i-1][j]==7&&arr[i-2][j]==3。

6.人的上边是箱子在目的地上,箱子上边是空地  arr[i-1][j]==7&&arr[i-2][j]==0。

void Key_up(int (*arr)[8])
{
	int i=0;
	int j=0;
	int flg_a=0;
	for(i=0;i<8;i++)             //找到人的坐标i,j
	{
		for(j=0;j<8;j++)
		{
			if(arr[i][j]==5||arr[i][j]==8)
			{
				flg_a=1;
				break;
			}
		}
		if(flg_a==1)
		{
			break;
		}
	}
    if(arr[i-1][j]==0)                       //上面是空地
	{
		if(arr[i][j]==5)
		{
		    arr[i-1][j]=5;
	      	arr[i][j]=0;
		}
		else
		{
		    arr[i-1][j]=5;
	      	arr[i][j]=3;
		}

	}
	else if(arr[i-1][j]==4&&arr[i-2][j]==0)     //人上面是箱子,箱子上面是空地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=4;
	     	arr[i-1][j]=5;
		    arr[i][j]=0;

		}
		else
		{
			arr[i-2][j]=4;
	     	arr[i-1][j]=5;
		    arr[i][j]=3;
		}
		
	}
	else if(arr[i-1][j]==4&&arr[i-2][j]==3)    //上面是箱子,箱子上是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=7;
	     	arr[i-1][j]=5;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i-2][j]=7;
	     	arr[i-1][j]=5;
	     	arr[i][j]=3;
		}
	
	}
	else if(arr[i-1][j]==3)                //上面是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i-1][j]=8;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i-1][j]=8;
	     	arr[i][j]=3;
		}
	}
	else if(arr[i-1][j]==7&&arr[i-2][j]==3)         //上面是箱子在目的地上,箱子的上面还是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=7;
			arr[i-1][j]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i-2][j]=7;
			arr[i-1][j]=8;
			arr[i][j]=3;
		}
	}
	else if(arr[i-1][j]==7&&arr[i-2][j]==0)        //上边是箱子在目的地上,箱子上边是空地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=4;
			arr[i-1][j]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i-2][j]=4;
			arr[i-1][j]=8;
			arr[i][j]=3;
		}
	}
}

最后我们还得进行游戏结束的判断和游戏的输出展示,判断游戏结束的方法有很多,我选择遍历整个数组,只要数组中不存在3和4就说明所有的箱子都进了目的地。

bool Gameover(int (*arr)[8])
{
	for(int i=0;i<8;i++)
	{
		for(int j=0;j<8;j++)
		{
			if(arr[i][j]==3||arr[i][j]==4)
			{
				return false;
			}
		}
	}
	return true;
}

打印函数你可以用你自己喜欢的符号来代替冰冷的数字。

void Show(int (*arr)[8])
{
	system("cls");

	int n=2;
	printf("*********************\n");
	for(int i=0;i<8;i++)
	{
		printf("**");
		for(int j = 0;j < 8;j++)
		{
			n=arr[i][j];

			switch(n)
			{
			case 0:
				printf("  ");
				break;
			case 1:
				printf("■");
				break;
			case 3:
				printf("☆");
				break;
			case 4:
				printf("□");
				break;
			case 5:
				printf("♀");
				break;
			case 7:
				printf("★");
				break;
			case 8:
				printf("♀");
				break;
			default:
				break;
			}
		}
	    printf("***\n");
	
	}
	printf("**双击‘0’重置本关**\n");
	printf("*********************\n");
}

游戏成果展示如图所示

项目源代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define ch_up 72        //向上方向键 
#define ch_down 80      //向下方向键
#define ch_right 77     //向右方向键
#define ch_left 75      //向左方向键
#define ch_reset 48      //重置关卡
#define TIME 10          //关卡数量



int (*Map(	int (*arr)[8],int n))[8]   //0代表空地,1代表墙,3代表目的地,4代表箱子,5代表人
{
	for(int i=0;i<8;i++)
	{
		for(int j=0;j<8;j++)
		{
			arr[i][j]=0;
		}

	}
	switch(n)
	{
	case 1:                             //第1关地图
	
		for(int i=0;i<8;i++)
		{
			arr[2][i]=1;
			arr[5][i]=1;
		}
		arr[3][0]=1;arr[4][0]=1;arr[3][7]=1;arr[4][7]=1;
		arr[3][1]=5;arr[3][3]=4;arr[4][3]=4;arr[3][6]=3;arr[4][6]=3;
		break;
	case 2:                               //第2关地图
		for(int i=0;i<3;i++)
		{
			arr[0][i+2]=1;
			arr[3][i]=1;
			arr[4][i+5]=1;
			arr[7][i+3]=1;
		}
		for(int i=0;i<4;i++)
		{
			arr[2][i+4]=1;
			arr[5][i]=1;
		}
		arr[1][2]=1;arr[2][2]=1;arr[1][4]=1;arr[3][7]=1;
		arr[4][0]=1;arr[5][5]=1;arr[6][3]=1;arr[6][5]=1;
		arr[1][3]=3;arr[3][6]=3;arr[4][1]=3;arr[6][4]=3;
		arr[3][3]=4;arr[3][5]=4;arr[4][3]=4;arr[5][4]=4;arr[4][4]=5;
		break;
	case 3:                              //第3关地图
		for(int i=0;i<7;i++)
		{
			arr[i+1][1]=1;
			arr[i+1][6]=1;
		}
		for(int i=0;i<4;i++)
		{
			arr[1][i+2]=1;
			arr[7][i+2]=1;
		}
		arr[3][3]=1;arr[3][4]=5;arr[4][3]=4;arr[5][3]=3;
		arr[4][4]=7;arr[5][4]=7;
		break;
	case 4:              //第4关地图
		for(int i=0;i<4;i++)
		{
			arr[1][i+3]=1;
			arr[i+3][1]=1;
			arr[i+3][7]=1;
			arr[7][i+3]=1;
		}
		arr[7][7]=1;arr[3][2]=1;
		for(int i=0;i<2;i++)
		{
			arr[2][i+2]=1;
			arr[6][i+2]=1;
			arr[i+2][6]=1;
		}
		arr[3][3]=5;arr[3][4]=4;arr[4][3]=4;arr[4][4]=4;
		arr[3][5]=3;arr[5][3]=3;arr[5][5]=3;

		break;
	case 5:                       //第5关地图
		for(int i=0;i<5;i++)
		{
			arr[i+2][1]=1;
			arr[i+2][6]=1;
			arr[7][i+1]=1;
		}
		for(int i=0;i<2;i++)
		{
			arr[1][i+1]=1;
			arr[1][i+3]=1;
			arr[2][i+4]=1;
		}
		arr[6][5]=1;arr[5][3]=5;
		arr[4][2]=3;arr[4][3]=3;arr[4][4]=3;
		arr[3][3]=4;arr[3][4]=4;arr[5][4]=4;
		break;
	case 6:                            //第6关地图
		for(int i=0;i<6;i++)
		{
			arr[i+1][1]=1;
			arr[6][i+2]=1;
		}
		for(int i=0;i<3;i++)
		{
			arr[1][i+2]=1;
			arr[i+1][5]=1;
			arr[i+3][7]=1;
		}
		arr[3][6]=1;arr[4][5]=5;
		arr[4][4]=4;arr[4][3]=4;arr[4][2]=4;
		arr[5][4]=3;arr[5][3]=3;arr[5][2]=3;
		break;
	case 7:                       //第7关地图
		for(int i=0;i<5;i++)
		{
			arr[1][i+2]=1;
			arr[7][i+2]=1;
			arr[i+2][1]=1;
			arr[i+2][7]=1;
		}
		arr[2][2]=1;arr[2][6]=1;arr[6][2]=1;arr[6][6]=1;arr[4][4]=1;
		arr[2][3]=3;arr[2][5]=3;arr[3][3]=7;arr[3][5]=7;
		arr[5][3]=4;arr[5][5]=4;arr[6][4]=5;
		break;
	case 8:                            //第8关地图
		for(int i=0;i<4;i++)
		{
			arr[i+2][1]=1;
			arr[i+3][6]=1;
		}
		for(int i=0;i<3;i++)
		{
			arr[i][2]=1;
			arr[5+i][2]=1;
			arr[0][i+3]=1;
			arr[i+1][5]=1;
			arr[7][i+3]=1;
		}
		arr[7][6]=1;arr[6][4]=5;
		arr[2][3]=3;arr[3][3]=3;arr[6][3]=3;
		arr[3][4]=4;arr[4][4]=4;arr[5][3]=4;

		break;
	case 9:                //第9关地图
		for(int i=0;i<7;i++)
		{
			arr[0][i]=1;
			arr[i][7]=1;
			arr[i+1][0]=1;
			arr[7][i+1]=1;
		}
		arr[1][2]=3;arr[2][1]=3;arr[1][5]=3;arr[2][6]=3;
		arr[3][3]=3;arr[3][4]=3;arr[4][3]=3;arr[4][4]=3;
		arr[5][1]=3;arr[5][6]=3;arr[6][2]=3;arr[6][5]=3;
		for(int i=0;i<3;i++)
		{
			arr[2][i+2]=4;
			arr[i+2][5]=4;
			arr[i+3][2]=4;
			arr[5][i+3]=4;
		}
		arr[4][4]=8;
		break;
	case 10:                  //第10关地图
		for(int i=0;i<4;i++)
		{
			arr[1][i+1]=1;
			arr[i+2][1]=1;
			arr[2][i+4]=1;
			arr[i+3][7]=1;
			arr[7][i+3]=1;
		}
		arr[3][4]=1;arr[6][6]=1;arr[5][2]=1;arr[6][2]=1;arr[7][2]=1;
		arr[4][2]=3;arr[4][3]=4;arr[4][4]=7;arr[4][5]=7;arr[4][6]=5;
		break;
	default:
		break;

	}
	return arr;
}
void Show(int (*arr)[8])
{
	system("cls");

	int n=2;
	printf("*********************\n");
	for(int i=0;i<8;i++)
	{
		printf("**");
		for(int j = 0;j < 8;j++)
		{
			n=arr[i][j];

			switch(n)
			{
			case 0:
				printf("  ");
				break;
			case 1:
				printf("■");
				break;
			case 3:
				printf("☆");
				break;
			case 4:
				printf("□");
				break;
			case 5:
				printf("♀");
				break;
			case 7:
				printf("★");
				break;
			case 8:
				printf("♀");
				break;
			default:
				break;
			}
		}
	    printf("***\n");
	
	}
	printf("**双击‘0’重置本关**\n");
	printf("*********************\n");
}
bool Gameover(int (*arr)[8])
{
	for(int i=0;i<8;i++)
	{
		for(int j=0;j<8;j++)
		{
			if(arr[i][j]==3||arr[i][j]==4)
			{
				return false;
			}
		}
	}
	return true;
}
void Key_up(int (*arr)[8])
{
	int i=0;
	int j=0;
	int flg_a=0;
	for(i=0;i<8;i++)             //找到人的坐标i,j
	{
		for(j=0;j<8;j++)
		{
			if(arr[i][j]==5||arr[i][j]==8)
			{
				flg_a=1;
				break;
			}
		}
		if(flg_a==1)
		{
			break;
		}
	}
    if(arr[i-1][j]==0)                       //上面是空地
	{
		if(arr[i][j]==5)
		{
		    arr[i-1][j]=5;
	      	arr[i][j]=0;
		}
		else
		{
		    arr[i-1][j]=5;
	      	arr[i][j]=3;
		}

	}
	else if(arr[i-1][j]==4&&arr[i-2][j]==0)     //人上面是箱子,箱子上面是空地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=4;
	     	arr[i-1][j]=5;
		    arr[i][j]=0;

		}
		else
		{
			arr[i-2][j]=4;
	     	arr[i-1][j]=5;
		    arr[i][j]=3;
		}
		
	}
	else if(arr[i-1][j]==4&&arr[i-2][j]==3)    //上面是箱子,箱子上是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=7;
	     	arr[i-1][j]=5;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i-2][j]=7;
	     	arr[i-1][j]=5;
	     	arr[i][j]=3;
		}
	
	}
	else if(arr[i-1][j]==3)                //上面是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i-1][j]=8;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i-1][j]=8;
	     	arr[i][j]=3;
		}
	}
	else if(arr[i-1][j]==7&&arr[i-2][j]==3)         //上面是箱子在目的地上,箱子的上面还是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=7;
			arr[i-1][j]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i-2][j]=7;
			arr[i-1][j]=8;
			arr[i][j]=3;
		}
	}
	else if(arr[i-1][j]==7&&arr[i-2][j]==0)        //上边是箱子在目的地上,箱子上边是空地
	{
		if(arr[i][j]==5)
		{
			arr[i-2][j]=4;
			arr[i-1][j]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i-2][j]=4;
			arr[i-1][j]=8;
			arr[i][j]=3;
		}
	}
}
void Key_down(int (*arr)[8])
{
	int i=0;
	int j=0;
	int flg_a=0;
	for(i=0;i<8;i++)             //找到人的坐标i,j
	{
		for(j=0;j<8;j++)
		{
			if(arr[i][j]==5||arr[i][j]==8)
			{
				flg_a=1;
				break;
			}
		}
		if(flg_a==1)
		{
			break;
		}
	}
    if(arr[i+1][j]==0)            //下面是空地
	{
		if(arr[i][j]==5)
		{
		    arr[i+1][j]=5;
	      	arr[i][j]=0;
		}
		else
		{
		    arr[i+1][j]=5;
	      	arr[i][j]=3;
		}

	}
	else if(arr[i+1][j]==4&&arr[i+2][j]==0)     //下面是箱子
	{
		if(arr[i][j]==5)
		{
			arr[i+2][j]=4;
	     	arr[i+1][j]=5;
		    arr[i][j]=0;

		}
		else
		{
			arr[i+2][j]=4;
	     	arr[i+1][j]=5;
		    arr[i][j]=3;
		}
		
	}
	else if(arr[i+1][j]==4&&arr[i+2][j]==3)    //下面是箱子,箱子下是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i+2][j]=7;
	     	arr[i+1][j]=5;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i+2][j]=7;
	     	arr[i+1][j]=5;
	     	arr[i][j]=3;
		}
	
	}
	else if(arr[i+1][j]==3)                //下面是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i+1][j]=8;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i+1][j]=8;
	     	arr[i][j]=3;
		}
	}
	else if(arr[i+1][j]==7&&arr[i+2][j]==3)         //下面是箱子在目的地上,箱子的下面还是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i+2][j]=7;
			arr[i+1][j]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i+2][j]=7;
			arr[i+1][j]=8;
			arr[i][j]=3;
		}
	}
	else if(arr[i+1][j]==7&&arr[i+2][j]==0)        //下边是箱子在目的地上,箱子下边是空地
	{
		if(arr[i][j]==5)
		{
			arr[i+2][j]=4;
			arr[i+1][j]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i+2][j]=4;
			arr[i+1][j]=8;
			arr[i][j]=3;
		}
	}
}
void Key_left(int (*arr)[8])
{
	int i=0;
	int j=0;
	int flg_a=0;
	for(i=0;i<8;i++)             //找到人的坐标i,j
	{
		for(j=0;j<8;j++)
		{
			if(arr[i][j]==5||arr[i][j]==8)
			{
				flg_a=1;
				break;
			}
		}
		if(flg_a==1)
		{
			break;
		}
	}
    if(arr[i][j-1]==0)            //左边是空地
	{
		if(arr[i][j]==5)
		{
		    arr[i][j-1]=5;
	      	arr[i][j]=0;
		}
		else
		{
		    arr[i][j-1]=5;
	      	arr[i][j]=3;
		}

	}
	else if(arr[i][j-1]==4&&arr[i][j-2]==0)     //左边是箱子,箱子左边是空地
	{
		if(arr[i][j]==5)
		{
			arr[i][j-2]=4;
	     	arr[i][j-1]=5;
		    arr[i][j]=0;

		}
		else
		{
			arr[i][j-2]=4;
	     	arr[i][j-1]=5;
		    arr[i][j]=3;
		}
		
	}
	else if(arr[i][j-1]==4&&arr[i][j-2]==3)    //左边是箱子,箱子左边是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i][j-2]=7;
	     	arr[i][j-1]=5;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i][j-2]=7;
	     	arr[i][j-1]=5;
	     	arr[i][j]=3;
		}
	
	}
	else if(arr[i][j-1]==3)                //左边是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i][j-1]=8;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i][j-1]=8;
	     	arr[i][j]=3;
		}
	}
	else if(arr[i][j-1]==7&&arr[i][j-2]==3)         //左边是箱子在目的地上,箱子的左边还是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i][j-2]=7;
			arr[i][j-1]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i][j-2]=7;
			arr[i][j-1]=8;
			arr[i][j]=3;
		}
	}
	else if(arr[i][j-1]==7&&arr[i][j-2]==0)        //左边是箱子在目的地上,箱子左边是空地
	{
		if(arr[i][j]==5)
		{
			arr[i][j-2]=4;
			arr[i][j-1]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i][j-2]=4;
			arr[i][j-1]=8;
			arr[i][j]=3;
		}
	}
}
void Key_right(int (*arr)[8])
{
	int i=0;
	int j=0;
	int flg_a=0;
	for(i=0;i<8;i++)             //找到人的坐标i,j
	{
		for(j=0;j<8;j++)
		{
			if(arr[i][j]==5||arr[i][j]==8)
			{
				flg_a=1;
				break;
			}
		}
		if(flg_a==1)
		{
			break;
		}
	}
    if(arr[i][j+1]==0)            //右边是空地
	{
		if(arr[i][j]==5)
		{
		    arr[i][j+1]=5;
	      	arr[i][j]=0;
		}
		else
		{
		    arr[i][j+1]=5;
	      	arr[i][j]=3;
		}

	}
	else if(arr[i][j+1]==4&&arr[i][j+2]==0)     //右边是箱子,箱子右边是空地
	{
		if(arr[i][j]==5)
		{
			arr[i][j+2]=4;
	     	arr[i][j+1]=5;
		    arr[i][j]=0;

		}
		else
		{
			arr[i][j+2]=4;
	     	arr[i][j+1]=5;
		    arr[i][j]=3;
		}
		
	}
	else if(arr[i][j+1]==4&&arr[i][j+2]==3)    //右边是箱子,箱子右边是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i][j+2]=7;
	     	arr[i][j+1]=5;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i][j+2]=7;
	     	arr[i][j+1]=5;
	     	arr[i][j]=3;
		}
	
	}
	else if(arr[i][j+1]==3)                //右边是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i][j+1]=8;
	     	arr[i][j]=0;
		}
		else
		{
			arr[i][j+1]=8;
	     	arr[i][j]=3;
		}
	}
	else if(arr[i][j+1]==7&&arr[i][j+2]==3)         //右边是箱子在目的地上,箱子的右边还是目的地
	{
		if(arr[i][j]==5)
		{
			arr[i][j+2]=7;
			arr[i][j+1]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i][j+2]=7;
			arr[i][j=1]=8;
			arr[i][j]=3;
		}
	}
	else if(arr[i][j+1]==7&&arr[i][j+2]==0)        //右边是箱子在目的地上,箱子右边是空地
	{
		if(arr[i][j]==5)
		{
			arr[i][j+2]=4;
			arr[i][j+1]=8;
			arr[i][j]=0;
		}
		else
		{
			arr[i][j+2]=4;
			arr[i][j+1]=8;
			arr[i][j]=3;
		}
	}
}
void Gamebegin()
{
	int Key_a=0;
	int Key_reset=0;
	int game_tier=0;   //最大通关层数
	int game_choose=0;  //将要选择的关数
	int n=1;           //关卡数
	int brr[8][8]={{0,0,0,0,0,0,0,0},       //空地图
	               {0,0,0,0,0,0,0,0},
                   {0,0,0,0,0,0,0,0},
	               {0,0,0,0,0,0,0,0},
	               {0,0,0,0,0,0,0,0},
	               {0,0,0,0,0,0,0,0},
	               {0,0,0,0,0,0,0,0},
	               {0,0,0,0,0,0,0,0}};

	int (*arr)[8]=Map(brr,n);
	


	while(n!=0&&n<=TIME)
	{
		arr=Map(brr,n);
		Show(arr);

		while(1)
	    {
			int ch=getch();
	     	if(ch)
	     	{
	     		ch=getch();
	     	}
	     	switch(ch)
	     	{
	     	case ch_up:
		     	Key_up(arr);
		     	break;
	     	case ch_down:
		     	Key_down(arr);
		     	break;
	     	case ch_left:
		     	Key_left(arr);
		     	break;
		    case ch_right:
		     	Key_right(arr);
		     	break;
			case ch_reset:
				Key_reset=1;
				break;
	     	default:
		     	break;
	     	}
	     	Show(arr); 
	     	if(Gameover(arr))
	     	{
				if(game_tier==TIME)
				{
					printf("********恭喜您已经通关所有关卡!!!********\n");
				}
				game_tier++;
				printf("\n\n");
				printf("******************************\n");
	     		printf("********恭喜通关!!!      **\n");
		     	printf("********请选择接下来的操作: **\n");
		     	printf("********1、重新挑战。       **\n");
		     	printf("********2、挑战下一关。     **\n");
				printf("********3、选择关卡。       **\n");
		     	printf("********4、退出游戏。       **\n");
				printf("******************************\n");
		     	scanf("%d",&Key_a);
		     	break;
		    }
			if(Key_reset==1)
			{
				Key_reset=0;
				break;
			}
	    }
		switch(Key_a)
		{
		     case 1:
				 Key_a=0;
			     break;
		     case 2:
				 Key_a =0;
				 n++;
			     break;
			 case 3:
				 Key_a =0;
				 printf("请输入你已经挑战过得关卡\n");
				 scanf("%d",&game_choose);
				 while(game_choose<=0 || game_choose>game_tier+1)
				 {
					 printf("输入有误,请重新输入你已经通过的关卡或将要挑战的关卡。");
					 scanf("%d",&game_choose);
				 }
				 n=game_choose;
				 break;
		     case 4:
				 Key_a =0;
				 n=0;
			     break;
		     default:
			     break;

     	}
	    
	}
	if(game_tier==TIME)
	{
     	printf("********恭喜您已经通关所有关卡!!!********\n");
	}
	else
	{
		printf("********再接再厉!!!**********************\n");
	}

	


}

int main()
{
	Gamebegin();

	return 0;
}

猜你喜欢

转载自blog.csdn.net/Pluto_God/article/details/81980107