Bootstrap

用C语言实现推箱子小游戏

 

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

//1.绘制游戏地图
void DrawMap(int Map[8][8])  //函数封装,方便使用  
{
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			switch (Map[i][j])
			{
			case 0:printf("  "); break;//空地

			case 1:printf("■"); break;//墙壁

			case 3:printf("☆"); break;//目的地

			case 4:printf("□"); break;//箱子

			case 6:printf("♀"); break;//人物

			case 7:printf("□"); break;//箱子与目的地重合,显示箱子

			case 9:printf("♀"); break;//人和目的地重合,显示人



			}
		}
		printf("\n");
	}
}
int main()
{                              //要设置多个关卡,需要用到多维数组
	int Map[8][8] = {
		0,0,1,1,1,0,0,0,
		0,0,1,3,1,0,0,0,
		0,0,1,0,1,1,1,1,
		1,1,1,4,0,4,3,1,   //3,4向上  
		1,3,0,4,6,1,1,1,   //4,4人    4,3向左,4,5向右
		1,1,1,1,4,1,0,0,   //5,4向下
		0,0,0,1,3,1,0,0,
		0,0,0,1,1,1,0,0,
	};


	//多次输入,用循环
	while (1) {
		//清屏
		system("cls");  //清屏,需要头文件stdlib.h
		DrawMap(Map);
		int count = 0;//计算分数
		//2.移动角色
		int i, j;
		for (i = 0; i < 8; i++)
		{
			for (j = 0; j < 8; j++)
			{
				if (Map[i][j] == 6 || Map[i][j] == 9)//只会退出j循环
					break;
			}
			if (Map[i][j] == 6 || Map[i][j] == 9)//9表示人物与目的地重合
				break;
		}

		printf("角色坐标:(%d,%d)\n", i, j);

		//3.从键盘获取字符,确定人物移动的方位

		int input = getch();//从键盘那获取字符存储到input中
		switch (input)
		{
		case 'w':
			//判断角色前方是空地0或者是目的地3,表示人物可以向上移动
			if (Map[i - 1][j] == 0 || Map[i - 1][j] == 3)    //行变列不变,即i-1
			{
				//移动角色
				Map[i - 1][j] += 6;//0+6=6,3+6=9
				Map[i][j] -= 6;
			}
			//判断角色的前方是箱子,或者箱子在目的地
			else if (Map[i - 1][j] == 4 || Map[i - 1][j] == 7)
			{
				//箱子前面的内容i-2,若为空地0或者目的地3,表示人物可以箱子推着走
				if (Map[i - 2][j] == 0 || Map[i - 2][j] == 3)
				{
					Map[i - 2][j] += 4;//0+4=4  3+4=7
					Map[i - 1][j] += 2;//4+2=6  7+2=9
					Map[i][j] -= 6;//6-6=0  9-6=3

				}
			}
			break;
		case 's':
			//判断角色后面是空地0或者是目的地3,表示人物可以向下移动
			if (Map[i + 1][j] == 0 || Map[i + 1][j] == 3)    //行变列不变,即i-1
			{
				//移动角色
				Map[i + 1][j] += 6;//0+6=6,3+6=9
				Map[i][j] -= 6;
			}
			//判断角色的前方是箱子,或者箱子在目的地
			else if (Map[i + 1][j] == 4 || Map[i + 1][j] == 7)
			{
				//箱子前面的内容i-2,若为空地0或者目的地3,表示人物可以箱子推着走
				if (Map[i + 2][j] == 0 || Map[i + 2][j] == 3)
				{
					Map[i + 2][j] += 4;//0+4=4  3+4=7
					Map[i + 1][j] += 2;//4+2=6  7+2=9
					Map[i][j] -= 6;//6-6=0  9-6=3

				}
			}break;
		case 'a':
			//判断角色左边是空地0或者是目的地3,表示人物可以向左移动
			if (Map[i][j - 1] == 0 || Map[i][j - 1] == 3)    //行变列不变,即i-1
			{
				//移动角色
				Map[i][j - 1] += 6;//0+6=6,3+6=9
				Map[i][j] -= 6;
			}
			//判断角色的左边是箱子,或者箱子在目的地
			else if (Map[i][j - 1] == 4 || Map[i][j - 1] == 7)
			{
				//箱子前面的内容i-2,若为空地0或者目的地3,表示人物可以箱子推着走
				if (Map[i][j - 2] == 0 || Map[i][j - 2] == 3)
				{
					Map[i][j - 2] += 4;//0+4=4  3+4=7
					Map[i][j - 1] += 2;//4+2=6  7+2=9
					Map[i][j] -= 6;//6-6=0  9-6=3

				}
			}break;
		case 'd':
			//判断角色右边是空地0或者是目的地3,表示人物可以向右移动
			if (Map[i][j + 1] == 0 || Map[i][j + 1] == 3)    //行变列不变,即i-1
			{
				//移动角色
				Map[i][j + 1] += 6;//0+6=6,3+6=9
				Map[i][j] -= 6;
			}
			//判断角色的左==右边是箱子,或者箱子在目的地
			else if (Map[i][j + 1] == 4 || Map[i][j + 1] == 7)
			{
				//箱子前面的内容i-2,若为空地0或者目的地3,表示人物可以箱子推着走
				if (Map[i][j + 2] == 0 || Map[i][j + 2] == 3)
				{
					Map[i][j + 2] += 4;//0+4=4  3+4=7
					Map[i][j + 1] += 2;//4+2=6  7+2=9
					Map[i][j] -= 6;//6-6=0  9-6=3

				}
			}
			break;

		}

		for (int m = 0; m < 8; m++)
		{
			for (int n = 0; n < 8; n++)
			{
				if (Map[m][n] == 7)
					count++;
			}
		}
		if (count == 4) {
			system("cls");
			DrawMap(Map);

			printf("你过关!!!\n");
			return 0;
		}
		//DrawMap(Map);


	}//}为while的循环
	return 0;
}

注:以上代码为推箱子小游戏的最初代码,未配图.

;