1. 程式人生 > >C語言—推箱子

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;
}