C语言,推箱子游戏

一个C语言简易推箱子游戏

#include <stdio.h>     
#include <stdlib.h>
#include <string.h>   
#include <conio.h> 

int i,j,k; 
int row=8,col=8;
int boxNum;
int*** maps;
int index=0,round_num=4;
int rows[]={8,9,10,8};
int cols[]={8,9,10,8};
int boxNums[]={4,3,4,4};

void draw_map(int** map); //声明画图函数

void arrayCopy(int* src,int** des,int row,int col){
	int i,j;

	for(i=0;i<row;i++){
		for(j=0;j<col;j++){
			des[i][j] = *(src+col*i+j);
		}
	}
}

//2:边缘空白,0:空地,6:小人,3:目的地,7:目的地+箱子,2:空白,1:墙,4:箱子

int map1[8][8] = {    //地图1
	{2,2,1,1,1,2,2,2},
	{2,2,1,3,1,2,2,2},
	{2,2,1,0,1,1,1,1},
	{1,1,1,4,0,4,3,1},
	{1,3,0,4,6,1,1,1},
	{1,1,1,1,4,1,2,2},
	{2,2,2,1,3,1,2,2},
	{2,2,2,1,1,1,2,2}
};

int map2[9][9] = {
	{1,1,1,1,1,2,2,2,2},
	{1,6,0,0,1,2,2,2,2},
	{1,0,4,4,1,2,1,1,1},
	{1,0,4,0,1,2,1,3,1},
	{1,1,1,0,1,1,1,3,1},
	{2,1,1,0,0,0,0,3,1},
	{2,1,0,0,0,1,0,0,1},
	{2,1,0,0,0,1,1,1,1},
	{2,1,1,1,1,1,2,2,2}
};

int map3[10][10] = {
	{2,1,1,1,1,1,1,1,2,2},
	{2,1,0,0,0,0,0,1,1,1},
	{1,1,4,1,1,1,0,0,0,1},
	{1,0,6,0,4,0,0,4,0,1},
	{1,0,3,3,1,0,4,0,1,1},
	{1,1,3,3,1,0,0,0,1,2},
	{2,1,1,1,1,1,1,1,1,2},
	{2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2}
};

int map4[8][8] = {    
	{2,1,1,1,1,2,2,2},
	{1,1,0,0,1,2,2,2},
	{1,6,4,0,1,2,2,2},
	{1,1,4,0,1,1,2,2},
	{1,1,0,4,0,1,2,2},
	{1,3,4,0,0,1,2,2},
	{1,3,3,0,3,1,2,2},
	{1,1,1,1,1,1,2,2}
};

int main(){
	char input;   
	int count=0;   //定义记分变量
	
	int** current_map;

	maps = (int***)malloc(sizeof(int***)*10);
	maps[0] = (int**)malloc(sizeof(map1));
	
	maps[0][0] = map1;
	maps[0][1] = map2;
	maps[0][2] = map3;
	maps[0][3] = map4;

	index=3;
	while(index<round_num){

		row = rows[index];
		col = cols[index];
		boxNum = boxNums[index];

		current_map = (int**)malloc(sizeof(int*)*row);

		for(k=0;k<row;k++){
			current_map[k] = (int*)malloc(sizeof(int)*col);
		}

		arrayCopy(maps[0][index],current_map,row,col);

			while (1) {  //循环,等待用户命令
				system("CLS");
				printf("Round %d:\n",index+1);
				printf("\n");
				draw_map(current_map);
				printf("current points: %d\n",count);

				//找初始位置
				for (i=0;i<row;i++)
				{
					for (j=0;j<col;j++)
					{
						if (current_map[i][j]==6||current_map[i][j]==9)
							break;
					}
					if (current_map[i][j]==6||current_map[i][j]==9)
						break;
				}
				printf("current position (%d,%d)",i,j);        
				input = getch();   //用getch()函数无需回车确认地获取用户输入,用于控制行走方向。
				if(input<0)
					input = getch();
				switch (input)
				{
				case 72:
					//如果人前面是空地。  //0代表空地  6代表人  //3代表目的地
					if(current_map[i-1][j]==0)
					{
						current_map[i-1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
						if(current_map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
							current_map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
						else
							current_map[i][j]=0;    //否则原地ID修改为空地ID 。      
					}
					//如果人前面是目的地。
					else if((current_map[i-1][j]==3)||(current_map[i-1][j]==9))
					{
						current_map[i-1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
						if(current_map[i][j]==9) //如果原地也是目的地(ID为)。
							current_map[i][j]=3; //人走后把原地ID修改回目的地ID。
						else
							current_map[i][j]=0; //否则原地ID修改为为空地ID
					}
					//如果人前面是箱子。//4代表箱子   //7箱子进入目的地
					else if(current_map[i-1][j]==4)
					{
						//如果人前面是箱子,而箱子前面是空地。
						if (current_map[i-2][j]==0)
						{ 
							current_map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
							//下面是对箱子原地进行判断
							if(current_map[i-1][j]==7) //如果箱子原地为目的地。
								current_map[i-1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
							else
								current_map[i-1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
							//下面是对人原地进行判断
							if(current_map[i][j]==9) //如果之前是目的地。
								current_map[i][j]=3; //人走了之后修改回目的地ID。
							else
								current_map[i][j]=0; //否则就是空地。
						}
						//如果人的前面是箱子,而箱子前面是目的地。
						else if (current_map[i-2][j]==3)
						{ 
							current_map[i-2][j]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
							count++;
							//下面是对箱子原先位置的判断,同上。
							if(current_map[i-1][j]==7)
								current_map[i-1][j]=9;
							else
								current_map[i-1][j]=6;
							//下面是对人原先位置进行判断,同上。
							if(current_map[i][j]==9)
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
					}
					//如果人前面是已经进入某目的地的箱子(ID=7)。
					else if(current_map[i-1][j]==7)
					{
						//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
						if(current_map[i-2][j]==0)
						{
							count--;
							current_map[i-2][j]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
							current_map[i-1][j]=9;   //人自然而然的就站在了原先的目的地上了。
							//下面是对人原先地进行判断,方法同上。
							if(current_map[i][j]==9) 
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
						//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
						if(current_map[i-2][j]==3)
						{
							current_map[i-2][j]=7;   //把箱子推入了另一目的地,自然,ID也应是。
							current_map[i-1][j]=9;   //人站在了目的地上。
							//下面是对人原先站立地进行判断,方法同上。
							if(current_map[i][j]==9) 
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
					}
					break;
				case 80:     //down

					//如果人前面是空地。
					if(current_map[i+1][j]==0)
					{
						current_map[i+1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
						if(current_map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
							current_map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
						else
							current_map[i][j]=0;    //否则原地ID修改为空地ID 。      
					}
					//如果人前面是目的地。
					else if(current_map[i+1][j]==3)
					{
						current_map[i+1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
						if(current_map[i][j]==9) //如果原地也是目的地(ID为)。
							current_map[i][j]=3; //人走后把原地ID修改回目的地ID。
						else
							current_map[i][j]=0; //否则原地ID修改为为空地ID
					}
					//如果人前面是箱子。
					else if(current_map[i+1][j]==4)
					{
						//如果人前面是箱子,而箱子前面是空地。
						if (current_map[i+2][j]==0)
						{ 
							current_map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
							//下面是对箱子原地进行判断
							if(current_map[i+1][j]==7) //如果箱子原地为目的地。
								current_map[i+1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
							else
								current_map[i+1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
							//下面是对人原地进行判断
							if(current_map[i][j]==9) //如果之前是目的地。
								current_map[i][j]=3; //人走了之后修改回目的地ID。
							else
								current_map[i][j]=0; //否则就是空地。
						}
						//如果人的前面是箱子,而箱子前面是目的地。
						else if (current_map[i+2][j]==3)
						{ 
							current_map[i+2][j]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
							count++;
							//下面是对箱子原先位置的判断,同上。
							if(current_map[i+1][j]==7)
								current_map[i+1][j]=9;
							else
								current_map[i+1][j]=6;
							//下面是对人原先位置进行判断,同上。
							if(current_map[i][j]==9)
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
					}
					//如果人前面是已经进入某目的地的箱子(ID=7)。
					else if(current_map[i+1][j]==7)
					{
						//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
						if(current_map[i+2][j]==0)
						{
							count--;
							current_map[i+2][j]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
							current_map[i+1][j]=9;   //人自然而然的就站在了原先的目的地上了。
							//下面是对人原先地进行判断,方法同上。
							if(current_map[i][j]==9) 
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
						//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
						if(current_map[i+2][j]==3)
						{
							current_map[i+2][j]=7;   //把箱子推入了另一目的地,自然,ID也应是。
							current_map[i+1][j]=9;   //人站在了目的地上。
							//下面是对人原先站立地进行判断,方法同上。
							if(current_map[i][j]==9) 
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
					}
					break;
				case 75:
					//如果人前面是空地。
					if(current_map[i][j-1]==0)
					{
						current_map[i][j-1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
						if(current_map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
							current_map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
						else
							current_map[i][j]=0;    //否则原地ID修改为空地ID 。      
					}
					//如果人前面是目的地。
					else if(current_map[i][j-1]==3)
					{
						current_map[i][j-1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
						if(current_map[i][j]==9) //如果原地也是目的地(ID为)。
							current_map[i][j]=3; //人走后把原地ID修改回目的地ID。
						else
							current_map[i][j]=0; //否则原地ID修改为为空地ID
					}
					//如果人前面是箱子。
					else if(current_map[i][j-1]==4)
					{
						//如果人前面是箱子,而箱子前面是空地。
						if (current_map[i][j-2]==0)
						{ 
							current_map[i][j-2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
							//下面是对箱子原地进行判断
							if(current_map[i][j-1]==7) //如果箱子原地为目的地。
								current_map[i][j-1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
							else
								current_map[i][j-1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
							//下面是对人原地进行判断
							if(current_map[i][j]==9) //如果之前是目的地。
								current_map[i][j]=3; //人走了之后修改回目的地ID。
							else
								current_map[i][j]=0; //否则就是空地。
						}
						//如果人的前面是箱子,而箱子前面是目的地。
						else if (current_map[i][j-2]==3)
						{ 
							count++;
							current_map[i][j-2]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
							//下面是对箱子原先位置的判断,同上。
							if(current_map[i][j-1]==7)
								current_map[i][j-1]=9;
							else
								current_map[i][j-1]=6;
							//下面是对人原先位置进行判断,同上。
							if(current_map[i][j]==9)
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
					}
					//如果人前面是已经进入某目的地的箱子(ID=7)。
					else if(current_map[i][j-1]==7)
					{
						//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
						if(current_map[i][j-2]==0)
						{
							count--;
							current_map[i][j-2]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
							current_map[i][j-1]=9;   //人自然而然的就站在了原先的目的地上了。
							//下面是对人原先地进行判断,方法同上。
							if(current_map[i][j]==9) 
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
						//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
						if(current_map[i][j-2]==3)
						{
							current_map[i][j-2]=7;   //把箱子推入了另一目的地,自然,ID也应是。
							current_map[i][j-1]=9;   //人站在了目的地上。
							//下面是对人原先站立地进行判断,方法同上。
							if(current_map[i][j]==9) 
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
					}
					break;
				case 77:
					//如果人前面是空地。
					if(current_map[i][j+1]==0)
					{
						current_map[i][j+1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
						if(current_map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
							current_map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
						else
							current_map[i][j]=0;    //否则原地ID修改为空地ID 。      
					}
					//如果人前面是目的地。
					else if(current_map[i][j+1]==3)
					{
						current_map[i][j+1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
						if(current_map[i][j]==9) //如果原地也是目的地(ID为)。
							current_map[i][j]=3; //人走后把原地ID修改回目的地ID。
						else
							current_map[i][j]=0; //否则原地ID修改为为空地ID
					}
					//如果人前面是箱子。
					else if(current_map[i][j+1]==4)
					{
						//如果人前面是箱子,而箱子前面是空地。
						if (current_map[i][j+2]==0)
						{ 
							current_map[i][j+2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
							//下面是对箱子原地进行判断
							if(current_map[i][j+1]==7) //如果箱子原地为目的地。
								current_map[i][j+1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
							else
								current_map[i][j+1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
							//下面是对人原地进行判断
							if(current_map[i][j]==9) //如果之前是目的地。
								current_map[i][j]=3; //人走了之后修改回目的地ID。
							else
								current_map[i][j]=0; //否则就是空地。
						}
						//如果人的前面是箱子,而箱子前面是目的地。
						else if (current_map[i][j+2]==3)
						{ 
							count++;
							current_map[i][j+2]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
							//下面是对箱子原先位置的判断,同上。
							if(current_map[i][j+1]==7)
								current_map[i][j+1]=9;
							else
								current_map[i][j+1]=6;
							//下面是对人原先位置进行判断,同上。
							if(current_map[i][j]==9)
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
					}
					//如果人前面是已经进入某目的地的箱子(ID=7)。
					else if(current_map[i][j+1]==7)
					{
						//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
						if(current_map[i][j+2]==0)
						{
							count--;
							current_map[i][j+2]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
							current_map[i][j+1]=9;   //人自然而然的就站在了原先的目的地上了。
							//下面是对人原先地进行判断,方法同上。
							if(current_map[i][j]==9) 
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
						//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
						if(current_map[i][j+2]==3)
						{
							current_map[i][j+2]=7;   //把箱子推入了另一目的地,自然,ID也应是。
							current_map[i][j+1]=9;   //人站在了目的地上。
							//下面是对人原先站立地进行判断,方法同上。
							if(current_map[i][j]==9) 
								current_map[i][j]=3;
							else
								current_map[i][j]=0;
						}
					}
					break;
				}
				if(count==boxNum) {   //如果分数达到分
					system("CLS"); //清屏
					draw_map(current_map); 
					break;    //退出死循环
				}
			}
		count = 0;
		printf("\nCongratulations! \n"); //过关提示
		index++;
	}
	return 0;
}

void draw_map(int** map){

	for(i=0;i<row;i++){
		for(j=0;j<col;j++){
			switch(map[i][j]){
			case 0:
				printf(" "); //数字代表道路
				break;
			case 1:
				printf("#"); //数字代表墙壁
				break;
			case 2:
				printf(" "); //数字是游戏边框的空白部分
				break;
			case 3:
				printf("!"); //数字代表目的地
				break;
			case 4:
				printf("*"); //数字代表箱子
				break;
			case 7:
				printf("$"); //数字代表箱子进入目的地
				break;
			case 6:
				printf("@"); //数字代表人
				break;
			case 9:
				printf("@"); //数字代表人进入目的地
				break;
			}            
		}
		printf("\n");    //分行输出
	}
}

参考地址:http://blog.csdn.net/hgj125073/article/details/8278243

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值