#include<iostream>
#include<conio.h>
#include"windows.h"
using namespace std;
int main()
{
int GameMap[3][10][10] =
{
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 5, 5, 5, 1, 1, 1, 1 },
{ 1, 1, 1, 5, 4, 5, 1, 1, 1, 1 },
{ 1, 1, 1, 5, 0, 5, 5, 5, 5, 1 },
{ 1, 5, 5, 5, 3, 0, 3, 4, 5, 1 },
{ 1, 5, 4, 0, 3, 2, 5, 5, 5, 1 },
{ 1, 5, 5, 5, 5, 3, 5, 1, 1, 1 },
{ 1, 1, 1, 1, 5, 4, 5, 1, 1, 1 },
{ 1, 1, 1, 1, 5, 5, 5, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 5, 5, 5, 5, 5, 5, 5, 1, 1 },
{ 1, 5, 0, 0, 0, 0, 0, 5, 5, 5 },
{ 5, 5, 3, 5, 5, 5, 0, 0, 0, 5 },
{ 5, 0, 2, 0, 3, 0, 0, 3, 0, 5 },
{ 5, 0, 4, 4, 5, 0, 3, 0, 5, 5 },
{ 5, 5, 4, 4, 5, 0, 0, 0, 5, 1 },
{ 1, 5, 5, 5, 5, 5, 5, 5, 5, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 5, 5, 5, 5, 5, 5, 5, 5, 1 },
{ 1, 5, 4, 0, 0, 0, 0, 4, 5, 1 },
{ 1, 5, 0, 3, 0, 0, 3, 0, 5, 1 },
{ 1, 5, 0, 2, 0, 0, 0, 0, 5, 1 },
{ 1, 5, 0, 0, 0, 0, 0, 0, 5, 1 },
{ 1, 5, 0, 3, 0, 0, 3, 0, 5, 1 },
{ 1, 5, 4, 0, 0, 0, 0, 4, 5, 1 },
{ 1, 5, 5, 5, 5, 5, 5, 5, 5, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
}
};
int GameMapCopy[3][10][10];//定义一个三维数组用来暂时储存地图
bool bFlag = false,bFlag1=false;//定义两个bool型来判断游戏的开始
memcpy(GameMapCopy, GameMap, sizeof(GameMap));//储存初始地图
//定义开始界面
cout << "开始游戏(x)" << endl;
cout << "帮助(i)" << endl;
int Input = _getch();//获取键盘信息
system("CLS");//清屏
switch (Input)
{
case 'i':
case 'I':
cout << "帮助:" << endl;
cout << "请使用“W”“S”“A”“D”来控制角色移动" << endl;
cout << "重玩请按“R”" << endl;
cout << "进入下一关请按“Q”" << endl;
cout << "开始游戏请按“x”" << endl;
case 'x':
case 'X':
bFlag = true;
break;
default:
return 0;
}
//定义玩家的坐标,初始化游戏场景:
int PosX = 5, PosY = 5, k=0;//行列下标表示坐标
while (bFlag = 1)//游戏循环
{
while (k <= 2)//关卡
{
for (int i = 0; i < 10; i++)//控制行下标
{
for (int j = 0; j < 10; j++)//控制列下标
{
switch (GameMap[k][i][j])
{
case 0:
cout << " ";
break;
case 1:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//背景为蓝色
cout << "○";
break;
case 2:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//人物为粉色
cout << "♀";
break;
case 3:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);//箱子为黑色空心
cout << "□";
break;
case 4:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//成功点为绿色
cout << "⊙";
break;
case 5:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//墙体为红色
cout << "■";
break;
case 6:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//人物为粉色
cout << "♀";
break;
case 7:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);//箱子进入成功点后成功点变为灰色
cout << "●";
break;
}
}
cout << endl;
}
//玩家行走
int Input = _getch();//获取键盘中输入的字符
int OffPosX=0, OffPosY=0;
system("CLS");//清屏
switch (Input)
{
case 's':
case 'S':
OffPosX = 1;
break;
case 'w':
case 'W':
OffPosX = -1;
break;
case 'a':
case 'A':
OffPosY = -1;
break;
case 'd':
case 'D':
OffPosY = 1;
break;
case 'r':
case 'R':
memcpy(GameMap, GameMapCopy, sizeof(GameMap));//重置关卡
switch (k)//判断该关卡为第几关
{
case 0://第一关
PosX = 5, PosY = 5;//初始化角色位置
break;
case 1://第二关
PosX = 5, PosY = 2;//初始化角色位置
break;
case 2://第二关
PosX = 4, PosY = 3;//初始化角色位置
break;
}
break;
case'q':
case 'Q':
switch (k)//判断该关卡为第几关
{
case 0://第二关
PosX = 5, PosY = 2;//初始化角色位置
break;
case 1://第三关
PosX = 4, PosY = 3;//初始化角色位置
break;
}
k++;
break;
}
//判断人坐标
if (0 == GameMap[k][PosX + OffPosX][PosY + OffPosY] //下一个位置为空地
|| 4 == GameMap[k][PosX + OffPosX][PosY + OffPosY])//下一个位置为胜利点
{
//地图的数据改变
GameMap[k][PosX + OffPosX][PosY + OffPosY] += 2;//人进来
GameMap[k][PosX][PosY] -= 2;//人离开
PosX += OffPosX,PosY+=OffPosY;//玩家的坐标改变
}
//判断人与箱子相邻后坐标
else if (3 == GameMap[k][PosX + OffPosX][PosY + OffPosY]//下一个位置为箱子
&& (4 == GameMap[k][PosX + OffPosX * 2][PosY + OffPosY * 2] //箱子后面为成功点
|| 0 == GameMap[k][PosX + OffPosX * 2][PosY + OffPosY * 2]))//箱子后面为空地
{
//地图数据改变
GameMap[k][PosX + OffPosX][PosY + OffPosY] -= 1;//人进来箱子位置
GameMap[k][PosX][PosY] -= 2;//原来位置人离开
GameMap[k][PosX + OffPosX * 2][PosY + OffPosY*2] += 3;//箱子进入成功点或空地
PosX += OffPosX, PosY += OffPosY;//玩家坐标改变
}
//判断把箱子推进成功点后坐标
else if(7 == GameMap[k][PosX + OffPosX][PosY + OffPosY]//下一个位置为箱子进入成功点
&& (4 == GameMap[k][PosX + OffPosX * 2][PosY + OffPosY * 2]//箱子进入成功点后面为成功点
|| 0 == GameMap[k][PosX + OffPosX * 2][PosY + OffPosY * 2]))//箱子进入成功点后面为空地
{
//地图数据改变
GameMap[k][PosX + OffPosX][PosY + OffPosY] -= 1;//人进来箱子位置
GameMap[k][PosX][PosY] -= 2;//原来位置人离开
GameMap[k][PosX + OffPosX * 2][PosY + OffPosY * 2] += 3;//箱子进入成功点或空地
PosX += OffPosX, PosY += OffPosY;//玩家坐标改变
}
}
}
}