c++推箱子(栈和数组的多步撤回)

推箱子实现功能:
1.实现不少于三张地图。三维数组
2.判断是否闯关成功?判断地图中是否存在值为3的元素。
3.重玩当前关 memcpy(目的数组名,源数组名,数组的大小);
4.回撤一步

#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//栈的定义
#define Maxsize 100
typedef int Elemtype;
typedef struct
{
	Elemtype data[Maxsize];
	int top;
}SqStack;
//栈的初始化
void InitStack(SqStack *&s)
{
	s = (SqStack*)malloc(sizeof(SqStack));
	s->top = -1;
}
//进栈
bool Push(SqStack *&s, Elemtype e)
{
	if (s->top == Maxsize - 1)
	{
		return false;
	}
	else 
	{
		s->top++;
		s->data[s->top] = e;
		return true;
	}
}
//出栈
bool Pop(SqStack *&s, Elemtype &e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	s->top--;
	return true;
}
//取栈顶元素
bool GetTop(SqStack *&s, Elemtype &e)
{
	if (-1 == s->top)
	{
		return false;
	}
	e = s->data[s->top];
	return true;
}
//销毁栈
void DestroyStack(SqStack *&s)
{
	free(s);
}
bool Login()//游戏进入界面
{
	cout << "游戏界面,按k开始游戏" << endl;
	if ('k' == getch())
	{
		return 1;
	}
	else
		return 0;
}
int main()
{
	
	SqStack *Game;
	InitStack(Game);
	//地图元素:0表示空地、1表示墙、2表示玩家、3表示箱子、4表示成功点、6表示玩家和成功点重合、7表示箱子和成功点重合
	int GameMap[3][10][10] = {
		{
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 0, 2, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 3, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 4, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 4, 3, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 4, 3, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	{
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 0, 2, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 3, 0, 0, 0, 0, 1 },
		{ 1, 0, 4, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 4, 3, 0, 0, 0, 0, 0, 1 },
		{ 1, 4, 0, 3, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	},
	{
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 0, 2, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 4, 0, 3, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 4, 3, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 4, 3, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	}
	};
	int AgainMap[3][10][10];
	memcpy(AgainMap, GameMap, sizeof(GameMap));
	//定义玩家的坐标(行下标和列下标)
	int PosX = 1, PosY = 2;
	int login = Login();
	
	for (int a = 0; a < 3;)
		{
			while (login)//游戏循环
			{
				for (int r3 = 0; r3 < 1000;)
				{
					for (int i = 0; i < 10; i++)
					{
						for (int j = 0; j < 10; j++)
						{
							switch (GameMap[a][i][j])
							{
							case 0:
								cout << "  ";
								break;
							case 1:
								cout << "▌";
								break;
							case 2:
							case 6:
								cout << "♀";
								break;
							case 4:
								cout << "☆";
								break;
							case 7:
							case 3:
								cout << "■";
							}
						}
						cout << endl;
					}
					cout << "w表示上移,s表示下移,a表示左移,d表示右移,r表示重新开始此关,q表示返回上一关,t表示返回上一步" << endl;
					cout << "▌是墙,♀是人,☆是目标点,■是箱子" << endl;
					//接收从键盘的中输入的字符(不需要回车键)
					int Input = getch();
					system("CLS");//清屏
					int t[1000];//定义一个数组用来存储操作指数
					int r1=0, r2=0;//定义2个变量,并赋初始值为0;
					switch (Input)
					{
					case 's':
					case 'S':
						if (0 == GameMap[a][PosX + 1][PosY] || 4 == GameMap[a][PosX + 1][PosY])//当玩家前面为空地
						{
							//修改地图的数据
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX + 1][PosY] += 2;//玩家进来
							//修改玩家的坐标
							++PosX;
							r1 = 1;
						}
						else if ((3 == GameMap[a][PosX + 1][PosY] || 7 == GameMap[a][PosX + 1][PosY]) && (0 == GameMap[a][PosX + 2][PosY] || 4 == GameMap[a][PosX + 2][PosY]))//当玩家前面为箱子或者箱子与目标点的结合,箱子前面为空地或者目标点
						{
							//修改地图的数据
							GameMap[a][PosX + 1][PosY] -= 3;//箱子离开
							GameMap[a][PosX + 2][PosY] += 3;//箱子进来
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX + 1][PosY] += 2;//玩家进来
							//修改玩家的坐标
							++PosX;
							r1 = 2;
						}
						Push(Game, r1);//进栈
						break;
					case 'w':
					case 'W':
						if (0 == GameMap[a][PosX - 1][PosY] || 4 == GameMap[a][PosX - 1][PosY])//当玩家前面为空地
						{
							//修改地图的数据
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX - 1][PosY] += 2;//玩家进来
							//修改玩家的坐标
							--PosX;
							r1 = -1;
						}
						else if ((3 == GameMap[a][PosX - 1][PosY] || 7 == GameMap[a][PosX - 1][PosY]) && (0 == GameMap[a][PosX - 2][PosY] || 4 == GameMap[a][PosX - 2][PosY]))//当玩家前面为箱子或者箱子与目标点的结合,箱子前面为空地或者目标点
						{
							//修改地图的数据
							GameMap[a][PosX - 1][PosY] -= 3;//箱子离开
							GameMap[a][PosX - 2][PosY] += 3;//箱子进来
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX - 1][PosY] += 2;//玩家进来
							//修改玩家的坐标
							--PosX;
							r1 = -2;
						}
						Push(Game, r1);//进栈
						break;
					case 'a':
					case 'A':
						if (0 == GameMap[a][PosX][PosY - 1] || 4 == GameMap[a][PosX][PosY - 1])//当玩家前面为空地
						{
							//修改地图的数据
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX][PosY - 1] += 2;//玩家进来
							//修改玩家的坐标
							--PosY;
							r1 = -10;
						}
						else if ((3 == GameMap[a][PosX][PosY - 1] || 7 == GameMap[a][PosX][PosY - 1]) && (0 == GameMap[a][PosX][PosY - 2] || 4 == GameMap[a][PosX][PosY - 2]))
						{
							//修改地图的数据
							GameMap[a][PosX][PosY - 1] -= 3;//箱子离开
							GameMap[a][PosX][PosY - 2] += 3;//箱子进来
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX][PosY - 1] += 2;//玩家进来
							//修改玩家的坐标
							--PosY;
							r1 = -20;
						}
						Push(Game, r1);//进栈
						break;
					case 'd':
					case 'D':
						if (0 == GameMap[a][PosX][PosY + 1] || 4 == GameMap[a][PosX][PosY + 1])//当玩家前面为空地或者目标点时
						{
							//修改地图的数据
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX][PosY + 1] += 2;//玩家进来
							//修改玩家的坐标
							++PosY;
							r1 = 10;
						}
						else if ((3 == GameMap[a][PosX][PosY + 1] || 7 == GameMap[a][PosX][PosY + 1]) && (0 == GameMap[a][PosX][PosY + 2] || 4 == GameMap[a][PosX][PosY + 2]))//当玩家前面为箱子或者箱子与目标点的结合,箱子前面为空地或者目标点
						{
							//修改地图的数据
							GameMap[a][PosX][PosY + 1] -= 3;//箱子离开
							GameMap[a][PosX][PosY + 2] += 3;//箱子进来
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX][PosY + 1] += 2;//玩家进来
							//修改玩家的坐标
							++PosY;
							r1 = 20;
						}
						Push(Game, r1);//进栈
						break;
					case 'r':
					case 'R':
						memcpy(GameMap, AgainMap, sizeof(AgainMap));//赋值数组
						PosX = 1;
						PosY = 2;//人物坐标更新为原来的起点
						InitStack(Game);//重新开始后将栈重新初始化
						//r3 = 0;//重新开始此关时,将数组重新从0开始赋值
						break;
						
						case 'q'://返回上一关
						case 'Q':
						if (a > 0)
						{
						memcpy(GameMap, AgainMap, sizeof(AgainMap));//赋值数组
						--a;
						PosX = 1;
						PosY = 2;//人物坐标更新为原来的起点
						InitStack(Game);//返回上一关后将栈重新初始化
						//r3 = 0;//返回上一关时,将数组重新从0开始赋值
						continue;
						}
						break;
					case 't':
					case 'T':
						//r2 = t[r3 - 1];//数组保存的最后一个元素
						Pop(Game, r2);//出栈
						if (1 == r2)//s
						{
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX - 1][PosY] += 2;//玩家进来
							//修改玩家的坐标
							--PosX;
						}
						if (2 == r2)
						{
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX - 1][PosY] += 2;//玩家进来
							GameMap[a][PosX + 1][PosY] -= 3;//箱子离开
							GameMap[a][PosX][PosY] += 3;//箱子进来
							--PosX;//修改玩家的坐标
						}
						if (-1 == r2)//w
						{
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX + 1][PosY] += 2;//玩家进来
							//修改玩家的坐标
							++PosX;
						}
						if (-2 == r2)
						{
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX + 1][PosY] += 2;//玩家进来
							GameMap[a][PosX - 1][PosY] -= 3;//箱子离开
							GameMap[a][PosX][PosY] += 3;//箱子进来
							++PosX;//修改玩家的坐标
						}
						if (10 == r2)//d
						{
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX][PosY - 1] += 2;//玩家进来
							//修改玩家的坐标
							--PosY;

						}
						if (20 == r2)
						{
							//修改地图的数据
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX][PosY - 1] += 2;//玩家进来
							GameMap[a][PosX][PosY + 1] -= 3;//箱子离开
							GameMap[a][PosX][PosY] += 3;//箱子进来
							//修改玩家的坐标
							--PosY;
						}
						if (-10 == r2)//a
						{
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX][PosY + 1] += 2;//玩家进来
							//修改玩家的坐标
							++PosY;
						}
						if (-20 == r2)
						{
							//修改地图的数据
							GameMap[a][PosX][PosY] -= 2;//玩家离开
							GameMap[a][PosX][PosY + 1] += 2;//玩家进来
							GameMap[a][PosX][PosY - 1] -= 3;//箱子离开
							GameMap[a][PosX][PosY] += 3;//箱子进来
							//修改玩家的坐标
							++PosY;
						}
						//r3--;//返回上一个节点
						break;

					}
					//判断是否过关
					/*if (0 != r1)//判断是否保存本次操作
					{
						t[r3] = r1;
						r3++;
					}*/
					//统计在地图上还有几个箱子没有到目的地
					for (int i = 0, n = 0; i < 10; i++)
					{
						for (int j = 0; j < 10; j++)
						{
							if (3 == GameMap[a][i][j])
							{
								n++;
							}
						}
						//判断是否通过本关
						if (0 == n && 9 == i)
						{
							a++;//关数++
							InitStack(Game);//通过后将栈重新初始化
							//r3 = 0;//通过此关后,将数组重新从0开始赋值
							PosX = 1;
							PosY = 2;//人物坐标更新为原来的起点
							cout << "yes" << endl;
							//判断是否通关
							if (2 == a)
							{
								break;
							}
							continue;
						}
					}
				}
			}
		}
	DestroyStack(Game);
	return 0;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值