推箱子实现功能:
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;
}