手敲推箱子小游戏

#include <stdio.h>
#include <algorithm>
#include <conio.h>
#include <tchar.h>
#include <Windows.h>
#include <stdbool.h>

//人的坐标
typedef struct location {
	int x;
	int y;
}MAPLOCATION;
MAPLOCATION location = { -1, -1 }; //获取人的位置

//目的地坐标
typedef struct dastination {
	int x;
	int y;
}dastination;
dastination DStion[100] = { 0 };  //目的地坐标
int DESTINATION = 0;            //目的地个数
int customs = 1;                //关卡
//0: 空地   1:墙壁   2: 目的地
//3: 箱子   4:人     
int MAP[23][10] =
{ 
	{0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
	{0, 1, 0, 0, 0, 0, 0, 1, 1, 1},
	{1, 1, 3, 1, 1, 1, 0, 0, 0, 1},
	{1, 4, 0, 0, 3, 0, 0, 3, 0, 1},
	{1, 0, 2, 2, 1, 0, 3, 0, 1, 1},
	{1, 1, 2, 2, 1, 0, 0, 0, 1, 0},
	{0, 1, 1, 1, 1, 1, 1, 1, 1, 0},//第一关 0~7

    {0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
	{0, 0, 1, 4, 0, 1, 1, 1, 0, 0},
	{0, 0, 1, 0, 3, 0, 0, 1, 0, 0},
	{0, 1, 1, 1, 0, 1, 0, 1, 1, 0},
	{0, 1, 2, 1, 0, 1, 0, 0, 1, 0},
	{0, 1, 2, 3, 0, 0, 1, 0, 1, 0},
	{0, 1, 2, 0, 0, 0, 3, 0, 1, 0},
	{0, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //第二关7~15

    {0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
	{0, 0, 1, 1, 0, 0, 1, 0, 4, 1},
	{0, 0, 1, 0, 0, 0, 1, 0, 0, 1},
	{0, 0, 1, 3, 0, 3, 0, 3, 0, 1},
	{0, 0, 1, 0, 3, 1, 1, 0, 0, 1},
	{1, 1, 1, 0, 3, 0, 1, 0, 1, 1},
	{1, 2, 2, 2, 2, 2, 0, 0, 1, 0},
	{1, 1, 1, 1, 1, 1, 1, 1, 1, 0}  //第三关15~23
};
void Swap(int *a, int *b); //交换
void map();         //画地图
void GetLocation(); //获取人的位置
void Getdastination(); //获取目的地坐标
void UP();          //上
void below();       //下
void left();        //左
void right();       //右

int main() {
	int next;
	char KEY;
	int flag = 0;  //箱子是否全部到达的标志
	next:Getdastination();//获取目的地的坐标
	while (1) {
		GetLocation(); //获取人的位置
		map();         //画地图
		if (flag == DESTINATION) {   //过关
			break;
		}
		flag = 0;
		KEY = _getch();
		switch (KEY) {
		case 'w': case 'W':   //上
			UP();
			break;
		case 's': case 'S':   //下
			below();
			break;
		case 'a': case 'A':   //左
			left();        
			break;
		case 'd': case 'D':   //右
			right();
			break;
		}
		//箱子全部到目的上
		for (int i = 0; i < DESTINATION; i++) {
			if (MAP[DStion[i].x][DStion[i].y] == 3) {
				flag++;
			}
		}
		
	}
	printf("恭喜通关!\n");
	customs++;  //下一关卡
	DESTINATION = 0; //下一关的目的地个数
	flag = 0;    //重置过关标志位
	system("pause");
	goto next;
	return 0;
}
//画地图
void map() {
	system("CLS");
	if (customs == 1) {  //第一关
		for (int i = 0; i < 7; i++) {
			for (int j = 0; j < 10; 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;
				}
			}
			printf("\n");
		}
	}
	if (customs == 2) { //第二关
		for (int i = 7; i < 15; i++) {
			for (int j = 0; j < 10; 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;
				}
			}
			printf("\n");
		}
	}
	if (customs == 3) { //第三关
		for (int i = 15; i < 23; i++) {
			for (int j = 0; j < 10; 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;
				}
			}
			printf("\n");
		}
	}
}
//交换
void Swap(int *a, int *b) {
	int c;
	
	c = *a;
	*a = *b;
	*b = c;
}
//获得人的位置
void GetLocation() {
	if (customs == 1) {
		for (int i = 0; i < 7; i++) {
			for (int j = 0; j < 10; j++) {
				if (MAP[i][j] == 4) {
					location.x = i;
					location.y = j;
				}
			}
		}
	}
	if (customs == 2) {
		for (int i = 7; i < 15; i++) {
			for (int j = 0; j < 10; j++) {
				if (MAP[i][j] == 4) {
					location.x = i;
					location.y = j;
				}

			}
		}
	}
	if (customs == 3) {
		for (int i = 15; i < 23; i++) {
			for (int j = 0; j < 10; j++) {
				if (MAP[i][j] == 4) {
					location.x = i;
					location.y = j;
				}

			}
		}
	}
}
//获得目的地坐标
void Getdastination() {
	if (customs == 1) {
		for (int i = 0; i < 7; i++) {
			for (int j = 0; j < 10; j++) {
				if (MAP[i][j] == 2) {
					DStion[DESTINATION].x = i;
					DStion[DESTINATION].y = j;
					DESTINATION++;
				}
			}
		}
	}
	if (customs == 2) {
		for (int i = 7; i < 15; i++) {
			for (int j = 0; j < 10; j++) {
				if (MAP[i][j] == 2) {
					DStion[DESTINATION].x = i;
					DStion[DESTINATION].y = j;
					DESTINATION++;
				}
			}
		}
	}
	if (customs == 3) {
		for (int i = 15; i < 23; i++) {
			for (int j = 0; j < 10; j++) {
				if (MAP[i][j] == 2) {
					DStion[DESTINATION].x = i;
					DStion[DESTINATION].y = j;
					DESTINATION++;
				}
			}
		}
	}

}
//什么情况可以移动
/*
   1.人的上面或 下面 或 左面 或 右面 是空地
   2.人的上面或 下面 或 左面 或 右面 是目的地
   3.人的上面或 下面 或 左面 或 右面 是箱子,箱子的上面或 下面 或 左面 或 右面是空地
   4.人的上面或 下面 或 左面 或 右面 是箱子,箱子的上面或 下面 或 左面 或 右面是目的地
*/

//上
void UP() {
	int flag = true;
	//遍历4个目的地
	for (int i = 0; i < DESTINATION; i++) {
		//判断当前自己的位置是不是目的
		if (location.x == DStion[i].x && location.y == DStion[i].y) {
			flag = false;
			break;
		}
	}
	//人站在的位置不是目的地
	if (flag) {
		//人的上面是空地或者是目的地可以向上走
		if (MAP[location.x - 1][location.y] == 0 || MAP[location.x - 1][location.y] == 2) {
			//人上面的位置是空地
			if (MAP[location.x - 1][location.y] == 0)
				Swap(&MAP[location.x - 1][location.y], &MAP[location.x][location.y]); //当前的位置与上一个位置进行交换
			//人上面的位置是目的地
			else {
				//离开,当前位置还原
				MAP[location.x][location.y] = 0; 
				//新的位置
				MAP[location.x - 1][location.y] = 4;
			}
			return;
		}
		//人的上面是箱子,箱子上面是空地或者是目的地
		if (MAP[location.x - 1][location.y] == 3 && (MAP[location.x - 2][location.y] == 0 || MAP[location.x - 2][location.y] == 2)) {
			//如果箱子上面是空地
			if (MAP[location.x - 2][location.y] == 0) {
				MAP[location.x][location.y] = 0; //还原当前的空地
				MAP[location.x - 1][location.y] = 4;  //人向上移动一格
				MAP[location.x - 2][location.y] = 3;  //箱子也向上移动一格
			}
			else {
				MAP[location.x][location.y] = 0; //还原当前的空地
				MAP[location.x - 1][location.y] = 4;  //人向上移动一格
				MAP[location.x - 2][location.y] = 3;  //箱子也向上移动一格
			}
		}
		
	}
	//人当前的位置是目的地
	else {
		//人的上面是空地或者是目的地可以向上走
		if (MAP[location.x - 1][location.y] == 0 || MAP[location.x - 1][location.y] == 2) {
			//人上面的位置是空地
			if (MAP[location.x - 1][location.y] == 0) {
				//人离开,当前目的还原
				MAP[location.x][location.y] = 2;
				
				// 新的位置
				MAP[location.x - 1][location.y] = 4;
			}
				
			//人上面的位置是目的地
			else {
				Swap(&MAP[location.x - 1][location.y], &MAP[location.x][location.y]); //目的地与目的地交换
			}
			return;
		}
		//人的上面是箱子,箱子上面是空地或者是目的地
		if (MAP[location.x - 1][location.y] == 3 && (MAP[location.x - 2][location.y] == 0 || MAP[location.x - 2][location.y] == 2)) {
			//如果箱子上面是空地
			if (MAP[location.x - 2][location.y] == 0) {
				MAP[location.x][location.y] = 2; //还原当前的目的地
				MAP[location.x - 1][location.y] = 4;  //人向上移动一格
				MAP[location.x - 2][location.y] = 3;  //箱子也向上移动一格
			}
			else {
				MAP[location.x][location.y] = 2; //还原当前的目的地
				MAP[location.x - 1][location.y] = 4;  //人向上移动一格
				MAP[location.x - 2][location.y] = 3;  //箱子也向上移动一格
			}
		}
	}
}
void below() {  //下
	int flag = true;
	//遍历4个目的地
	for (int i = 0; i < DESTINATION; i++) {
		//判断当前自己的位置是不是目的
		if (location.x == DStion[i].x && location.y == DStion[i].y) {
			flag = false;
			break;
		}
	}
	//人站在的位置不是目的地
	if (flag) {
		//人的下面是空地或者是目的地可以向上走
		if (MAP[location.x + 1][location.y] == 0 || MAP[location.x + 1][location.y] == 2) {
			//人下面的位置是空地
			if (MAP[location.x + 1][location.y] == 0)
				Swap(&MAP[location.x + 1][location.y], &MAP[location.x][location.y]); //当前的位置与上一个位置进行交换
			//人下面的位置是目的地
			else {
				//离开,当前位置还原
				MAP[location.x][location.y] = 0;
				//新的位置
				MAP[location.x + 1][location.y] = 4;
			}
			return;
		}
		//人的下面是箱子,箱子下面是空地或者是目的地
		if (MAP[location.x + 1][location.y] == 3 && (MAP[location.x + 2][location.y] == 0 || MAP[location.x + 2][location.y] == 2)) {
			//如果箱子下面是空地
			if (MAP[location.x + 2][location.y] == 0) {
				MAP[location.x][location.y] = 0; //还原当前的空地
				MAP[location.x + 1][location.y] = 4;  //人向下移动一格
				MAP[location.x + 2][location.y] = 3;  //箱子也向下移动一格
			}
			else {
				MAP[location.x][location.y] = 0; //还原当前的空地
				MAP[location.x + 1][location.y] = 4;  //人向下移动一格
				MAP[location.x + 2][location.y] = 3;  //箱子也向下移动一格
			}
		}

	}
	//人当前的位置是目的地
	else {
		//人的下面是空地或者是目的地可以向下走
		if (MAP[location.x + 1][location.y] == 0 || MAP[location.x + 1][location.y] == 2) {
			//人下面的位置是空地
			if (MAP[location.x + 1][location.y] == 0) {
				//人离开,当前目的还原
				MAP[location.x][location.y] = 2;

				// 新的位置
				MAP[location.x + 1][location.y] = 4;
			}

			//人下面的位置是目的地
			else {
				Swap(&MAP[location.x + 1][location.y], &MAP[location.x][location.y]); //目的地与目的地交换
			}
			return;
		}
		//人的下面是箱子,箱子下面是空地或者是目的地
		if (MAP[location.x + 1][location.y] == 3 && (MAP[location.x + 2][location.y] == 0 || MAP[location.x + 2][location.y] == 2)) {
			//如果箱子下面是空地
			if (MAP[location.x + 2][location.y] == 0) {
				MAP[location.x][location.y] = 2; //还原当前的目的地
				MAP[location.x + 1][location.y] = 4;  //人向上移动一格
				MAP[location.x + 2][location.y] = 3;  //箱子也向上移动一格
			}
			else {
				MAP[location.x][location.y] = 2; //还原当前的目的地
				MAP[location.x + 1][location.y] = 4;  //人向上移动一格
				MAP[location.x + 2][location.y] = 3;  //箱子也向上移动一格
			}
		}
	}
}
void left() {   //左
	int flag = true;
	//遍历4个目的地
	for (int i = 0; i < DESTINATION; i++) {
		//判断当前自己的位置是不是目的
		if (location.x == DStion[i].x && location.y == DStion[i].y) {
			flag = false;
			break;
		}
	}
	//人站在的位置不是目的地
	if (flag) {
		//人的左面是空地或者是目的地可以向左走
		if (MAP[location.x][location.y - 1] == 0 || MAP[location.x][location.y - 1] == 2) {
			//人左面的位置是空地
			if (MAP[location.x][location.y - 1] == 0)
				Swap(&MAP[location.x][location.y - 1], &MAP[location.x][location.y]); //当前的位置与上一个位置进行交换
			//人左面的位置是目的地
			else {
				//离开,当前位置还原
				MAP[location.x][location.y] = 0;
				//新的位置
				MAP[location.x][location.y-1] = 4;
			}
			return;
		}
		//人的左面是箱子,箱子左面是空地或者是目的地
		if (MAP[location.x][location.y - 1] == 3 && (MAP[location.x][location.y - 2] == 0 || MAP[location.x][location.y - 2] == 2)) {
			//如果箱子左面是空地
			if (MAP[location.x][location.y - 2] == 0) {
				MAP[location.x][location.y] = 0; //还原当前的空地
				MAP[location.x][location.y - 1] = 4;  //人向下移动一格
				MAP[location.x][location.y - 2] = 3;  //箱子也向下移动一格
			}
			else {
				MAP[location.x][location.y] = 0; //还原当前的空地
				MAP[location.x][location.y - 1] = 4;  //人向下移动一格
				MAP[location.x][location.y - 2] = 3;  //箱子也向下移动一格
			}
		}

	}
	//人当前的位置是目的地
	else {
		//人的左面是空地或者是目的地可以向左走
		if (MAP[location.x][location.y - 1] == 0 || MAP[location.x][location.y - 1] == 2) {
			//人左面的位置是空地
			if (MAP[location.x][location.y - 1] == 0) {
				//人离开,当前目的还原
				MAP[location.x][location.y] = 2;

				// 新的位置
				MAP[location.x][location.y - 1] = 4;
			}

			//人左面的位置是目的地
			else {
				Swap(&MAP[location.x][location.y - 1], &MAP[location.x][location.y]); //目的地与目的地交换
			}
			return;
		}
		//人的左面是箱子,箱子左面是空地或者是目的地
		if (MAP[location.x][location.y - 1] == 3 && (MAP[location.x][location.y - 2] == 0 || MAP[location.x][location.y - 2] == 2)) {
			//如果箱子左面是空地
			if (MAP[location.x][location.y - 2] == 0) {
				MAP[location.x][location.y] = 2; //还原当前的目的地
				MAP[location.x][location.y - 1] = 4;  //人向上移动一格
				MAP[location.x][location.y - 2] = 3;  //箱子也向上移动一格
			}
			else {
				MAP[location.x][location.y] = 2; //还原当前的目的地
				MAP[location.x][location.y - 1] = 4;  //人向上移动一格
				MAP[location.x][location.y - 2] = 3;  //箱子也向上移动一格
			}
		}
	}
}        
void right() {  //右
	int flag = true;
	//遍历4个目的地
	for (int i = 0; i < DESTINATION; i++) {
		//判断当前自己的位置是不是目的
		if (location.x == DStion[i].x && location.y == DStion[i].y) {
			flag = false;
			break;
		}
	}
	//人站在的位置不是目的地
	if (flag) {
		//人的右面是空地或者是目的地可以向右走
		if (MAP[location.x][location.y + 1] == 0 || MAP[location.x][location.y + 1] == 2) {
			//人右面的位置是空地
			if (MAP[location.x][location.y + 1] == 0)
				Swap(&MAP[location.x][location.y + 1], &MAP[location.x][location.y]); //当前的位置与上一个位置进行交换
			//人右面的位置是目的地
			else {
				//离开,当前位置还原
				MAP[location.x][location.y] = 0;
				//新的位置
				MAP[location.x][location.y + 1] = 4;
			}
			return;
		}
		//人的右面是箱子,箱子右面是空地或者是目的地
		if (MAP[location.x][location.y + 1] == 3 && (MAP[location.x][location.y + 2] == 0 || MAP[location.x][location.y + 2] == 2)) {
			//如果箱子右面是空地
			if (MAP[location.x][location.y + 2] == 0) {
				MAP[location.x][location.y] = 0; //还原当前的空地
				MAP[location.x][location.y + 1] = 4;  //人向右移动一格
				MAP[location.x][location.y + 2] = 3;  //箱子也向右移动一格
			}
			else {
				MAP[location.x][location.y] = 0; //还原当前的空地
				MAP[location.x][location.y + 1] = 4;  //人向右移动一格
				MAP[location.x][location.y + 2] = 3;  //箱子也向右移动一格
			}
		}

	}
	//人当前的位置是目的地
	else {
		//人的左面是空地或者是目的地可以向右走
		if (MAP[location.x][location.y + 1] == 0 || MAP[location.x][location.y + 1] == 2) {
			//人右面的位置是空地
			if (MAP[location.x][location.y + 1] == 0) {
				//人离开,当前目的还原
				MAP[location.x][location.y] = 2;

				// 新的位置
				MAP[location.x][location.y + 1] = 4;
			}

			//人右面的位置是目的地
			else {
				Swap(&MAP[location.x][location.y + 1], &MAP[location.x][location.y]); //目的地与目的地交换
			}
			return;
		}
		//人的右面是箱子,箱子右面是空地或者是目的地
		if (MAP[location.x][location.y + 1] == 3 && (MAP[location.x][location.y + 2] == 0 || MAP[location.x][location.y + 2] == 2)) {
			//如果箱子右面是空地
			if (MAP[location.x][location.y + 2] == 0) {
				MAP[location.x][location.y] = 2; //还原当前的目的地
				MAP[location.x][location.y + 1] = 4;  //人向右移动一格
				MAP[location.x][location.y + 2] = 3;  //箱子也向右移动一格
			}
			else {
				MAP[location.x][location.y] = 2; //还原当前的目的地
				MAP[location.x][location.y + 1] = 4;  //人向右移动一格
				MAP[location.x][location.y + 2] = 3;  //箱子也向右移动一格
			}
		}
	}

}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值