推箱子-二位数组

推箱子-二位数组,第1张

箱子-二位数组
#include
#include
#include
#include  //按键 *** 作

#define ROW 10
#define COL 10

#define SPACE 0 //空地
#define WALL 1	//墙
#define DEST 2	//目的地	
#define BOX  3	//箱子
#define	PLAYER  4 //玩家
//#define       5//目的地+箱子
//#define       6//目的地+玩家
//定义地图
//输出map[curLevel]
//当前关卡
//int map[3][ROW][COL] = { 0 };
int curLevel = 0;

//3个关卡
char map[3][ROW][COL] =  
{ 
	{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,1,1,1,0,0,0,0},
	{0,0,0,1,2,1,0,0,0,0},
	{0,1,1,1,3,1,1,1,1,0},
	{0,1,2,3,4,0,3,2,1,0},
	{0,1,1,1,1,0,1,1,1,0},
	{0,0,0,0,1,3,1,0,0,0},
	{0,0,0,0,1,2,1,0,0,0},
	{0,0,0,0,1,1,1,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,1,1,0,0,1,1,0,0},
	{0,1,0,2,1,1,2,0,1,0},
	{1,0,0,3,0,0,3,0,0,1},
	{1,0,0,0,4,0,0,0,0,1},
	{0,1,0,0,0,0,0,0,1,0},
	{0,0,1,0,3,3,0,1,0,0},
	{0,0,0,1,2,2,1,0,0,0},
	{0,0,0,0,1,1,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	},
	{
	{1,0,0,0,0,0,0,0,0,1},
	{0,1,0,1,1,1,1,0,1,0},
	{0,0,1,1,0,0,1,1,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,4,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,3,0,0,0,0,3,0,0},
	{0,0,2,0,0,0,0,2,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	}

};

void show()
{
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			switch (map[curLevel][i][k])
			{
			case SPACE:
				printf("  ");
				break;
			case WALL:
				printf("▓");
				break;
			case DEST:
				printf("☆");
				break;
			case BOX:
				printf("□");
				break;
			case PLAYER:
				printf("♀");
				break;
			case DEST + BOX:  //箱子在目的地
				printf("★");
				break;
			case DEST + PLAYER:  //玩家在目的地
				printf("♂");
				break;
			}

		}
		printf("n");
	}
}
//移动
void move()
{
	//查找玩家所在地下标
	int r = -1, c = -1;
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			if (map[curLevel][i][k] == PLAYER || map[curLevel][i][k] == DEST + PLAYER)
			{
				r = i;
				c = k;
				goto endloop;
			}

			//break;
		}

	}

	//怎么样获取按键 getchar()输入后需要回车
	//还有一个函数和getchar()很像,但是不需要按回车 _getch(),需要包含conio.h
	//int key=_getch();
	//printf("%d %cn", key, key);
endloop:
	if (r == -1 || c == -1)
		return;
	switch (_getch())
	{
	case 72:
	case 'W':
	case 'w':
		//玩家的前面是否是空地或者目的地
		if (map[curLevel][r - 1][c] == SPACE || map[curLevel][r - 1][c] == DEST)
		{
			//1.把玩家移动到空地
			map[curLevel][r - 1][c] += PLAYER;
			//2.把玩家从原来的位置清楚掉
			map[curLevel][r][c] -= PLAYER;
		}
		else if (map[curLevel][r - 1][c] == BOX)//玩家的前面是箱子
		{
			//箱子的前面是空地或目的地
			if (map[curLevel][r - 2][c] == SPACE || map[curLevel][r - 2][c] == DEST)
			{
				//1把箱子移动到前面
				map[curLevel][r - 2][c] += BOX;
				//2把箱子从原来的地方清除
				map[curLevel][r - 1][c] -= BOX;
				//3把玩家移动到空地
				map[curLevel][r - 1][c] += PLAYER;
				//4把玩家从原来的位置清除
				map[curLevel][r][c] -= PLAYER;
			}

		}
		break;
	case 80:
	case 'S':
	case 's':
		//玩家的前面是否是空地或者目的地
		if (map[curLevel][r + 1][c] == SPACE || map[curLevel][r + 1][c] == DEST)
		{
			//1.把玩家移动到空地
			map[curLevel][r + 1][c] += PLAYER;
			//2.把玩家从原来的位置清楚掉
			map[curLevel][r][c] -= PLAYER;
		}
		else if (map[curLevel][r + 1][c] == BOX)//玩家的前面是箱子
		{
			//箱子的前面是空地或目的地
			if (map[curLevel][r + 2][c] == SPACE || map[curLevel][r + 2][c] == DEST)
			{
				//1把箱子移动到前面
				map[curLevel][r + 2][c] += BOX;
				//2把箱子从原来的地方清除
				map[curLevel][r + 1][c] -= BOX;
				//3把玩家移动到空地
				map[curLevel][r + 1][c] += PLAYER;
				//4把玩家从原来的位置清除
				map[curLevel][r][c] -= PLAYER;
			}

		}
		break;
	case 75:
	case 'A':
	case 'a':
		//玩家的前面是否是空地或者目的地
		if (map[curLevel][r][c - 1] == SPACE || map[curLevel][r][c - 1] == DEST)
		{
			//1.把玩家移动到空地
			map[curLevel][r][c - 1] += PLAYER;
			//2.把玩家从原来的位置清楚掉
			map[curLevel][r][c] -= PLAYER;
		}
		else if (map[curLevel][r][c - 1] == BOX)//玩家的前面是箱子
		{
			//箱子的前面是空地或目的地
			if (map[curLevel][r][c - 2] == SPACE || map[curLevel][r][c - 2] == DEST)
			{
				//1把箱子移动到前面
				map[curLevel][r][c - 2] += BOX;
				//2把箱子从原来的地方清除
				map[curLevel][r][c - 1] -= BOX;
				//3把玩家移动到空地
				map[curLevel][r][c - 1] += PLAYER;
				//4把玩家从原来的位置清除
				map[curLevel][r][c] -= PLAYER;
			}

		}
		break;
	case 77:
	case 'D':
	case 'd':
		//玩家的前面是否是空地或者目的地
		if (map[curLevel][r][c + 1] == SPACE || map[curLevel][r][c + 1] == DEST)
		{
			//1.把玩家移动到空地
			map[curLevel][r][c + 1] += PLAYER;
			//2.把玩家从原来的位置清楚掉
			map[curLevel][r][c] -= PLAYER;
		}
		else if (map[curLevel][r][c + 1] == BOX)//玩家的前面是箱子
		{
			//箱子的前面是空地或目的地
			if (map[curLevel][r][c + 2] == SPACE || map[curLevel][r][c + 2] == DEST)
			{
				//1把箱子移动到前面
				map[curLevel][r][c + 2] += BOX;
				//2把箱子从原来的地方清除
				map[curLevel][r][c + 1] -= BOX;
				//3把玩家移动到空地
				map[curLevel][r][c + 1] += PLAYER;
				//4把玩家从原来的位置清除
				map[curLevel][r][c] -= PLAYER;
			}

		}
		break;

	}
}

//什么情况下才过关,如果地图上没箱子了就过关了
bool judge()
{
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			if (map[curLevel][i][k] == BOX)
			{
				return false;
			}
		}
	}
	return true;
}


//推箱子
int main()
{
	while (true)
	{
		system("cls");//清屏
		show();
		if (judge())
		{
			curLevel++;
		}
		//不断的检测键盘按键,不断的绘制 72 80 75 77 上下左右
		move();
	}

	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5699055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存