#include <Windows.h>
#include <iostream>
using namespace std;
#define KEY_DOWN(vk_code) (GetAsyncKeyState(vk_code)&0X8000?1:0)
//场景内节点相关结构体
struct SData
{
int nPlayX;
int nPlayY;
int nPlayXB;
int nPlayYB;
};
//游戏界面状态常量
enum GameState
{
E_GS_MENU,
E_GS_START,
E_GS_SET,
E_GS_EXIT,
};
//游戏菜单状态常量
enum MenuState
{
E_MS_START,
E_MS_SET,
E_MS_EXIT,
};
int main()
{
//游戏地图数组
int nGameMap[15][20] =
{
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,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,
};
//游戏菜单状态
int nMenuState = 0;
//游戏界面状态
int nGameState = 0;
//创建玩家结构体
SData play;
//玩家坐标
play.nPlayX = 2;
play.nPlayY = 2;
//玩家之前坐标
play.nPlayXB = 2;
play.nPlayYB = 2;
//创建箱子结构体
SData arrBox[3];
//箱子坐标
arrBox[0].nPlayX = 5;
arrBox[0].nPlayY = 10;
arrBox[1].nPlayX = 7;
arrBox[1].nPlayY = 7;
arrBox[2].nPlayX = 17;
arrBox[2].nPlayY = 12;
//记录被推动箱子编号
int nBoxTemp = 0;
while (true)
{
CONSOLE_CURSOR_INFO cursor; //定义结构体 控制台光标信息
cursor.bVisible = 0; //设置不显示
cursor.dwSize = 1;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor); //设置光标信息
COORD coord = { 0,0 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
Sleep(100);
//向下移动游戏菜单选项光标
if (KEY_DOWN(VK_DOWN))
{
nMenuState++;
if (nMenuState > 2)
{
nMenuState = 0;
}
}
//向上移动游戏菜单选项光标
if (KEY_DOWN(VK_UP))
{
nMenuState--;
if (nMenuState < 0)
{
nMenuState = 2;
}
}
//游戏菜单界面
if (E_GS_MENU == nGameState)
{
//切换到游戏开始选项
if (E_MS_START == nMenuState)
{
cout << "->游戏开始" << endl;
cout << " 游戏设置" << endl;
cout << " 游戏结束" << endl;
//点击回车 进入游戏开始界面
if (KEY_DOWN(VK_RETURN))
{
nGameState = 1;
system("cls");
}
}
//切换到游戏设置选项
if (E_MS_SET == nMenuState)
{
cout << " 游戏开始" << endl;
cout << "->游戏设置" << endl;
cout << " 游戏结束" << endl;
//点击回车 进入游戏设置界面
if (KEY_DOWN(VK_RETURN))
{
nGameState = 2;
system("cls");
}
}
//切换到游戏结束选项
if (E_MS_EXIT == nMenuState)
{
cout << " 游戏开始" << endl;
cout << " 游戏设置" << endl;
cout << "->游戏结束" << endl;
//点击回车 进入游戏结束界面
if (KEY_DOWN(VK_RETURN))
{
nGameState = 3;
system("cls");
}
}
}
//游戏开始界面
if (E_GS_START == nGameState)
{
//记录玩家之前坐标
play.nPlayXB = play.nPlayX;
play.nPlayYB = play.nPlayY;
//记录箱子之前坐标
for (int i = 0; i < sizeof(arrBox) / sizeof(SData); i++)
{
arrBox[i].nPlayXB = arrBox[i].nPlayX;
arrBox[i].nPlayYB = arrBox[i].nPlayY;
}
//方向键控制玩家坐标
if (KEY_DOWN(VK_UP))
{
play.nPlayY--;
};
if (KEY_DOWN(VK_DOWN))
{
play.nPlayY++;
};
if (KEY_DOWN(VK_LEFT))
{
play.nPlayX--;
};
if (KEY_DOWN(VK_RIGHT))
{
play.nPlayX++;
};
//实现推箱子
for (int i = 0; i < sizeof(arrBox) / sizeof(SData); i++)
{
if (arrBox[i].nPlayX == play.nPlayX && arrBox[i].nPlayY == play.nPlayY)
{
nBoxTemp = i;
arrBox[i].nPlayX += play.nPlayX - play.nPlayXB;
arrBox[i].nPlayY += play.nPlayY - play.nPlayYB;
break;
}
}
//如果箱子进入墙,则返回箱子和玩家之前坐标
if (1 == nGameMap[arrBox[nBoxTemp].nPlayY][arrBox[nBoxTemp].nPlayX])
{
arrBox[nBoxTemp].nPlayX = arrBox[nBoxTemp].nPlayXB;
arrBox[nBoxTemp].nPlayY = arrBox[nBoxTemp].nPlayYB;
play.nPlayX = play.nPlayXB;
play.nPlayY = play.nPlayYB;
}
//如果箱子和箱子重合,则返回箱子和玩家之前坐标
for (int i = 0; i < sizeof(arrBox) / sizeof(SData); i++)
{
if (i == nBoxTemp)
{
continue;
}
if (arrBox[i].nPlayX == arrBox[nBoxTemp].nPlayX && arrBox[i].nPlayY == arrBox[nBoxTemp].nPlayY)
{
arrBox[nBoxTemp].nPlayX = arrBox[nBoxTemp].nPlayXB;
arrBox[nBoxTemp].nPlayY = arrBox[nBoxTemp].nPlayYB;
play.nPlayX = play.nPlayXB;;
play.nPlayY = play.nPlayYB;
}
}
//如果玩家进入墙,则返回玩家之前坐标
if (1 == nGameMap[play.nPlayY][play.nPlayX])
{
play.nPlayX = play.nPlayXB;
play.nPlayY = play.nPlayYB;
}
//渲染地图
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 20; j++)
{
//判断箱子位置
bool bBoxSet = false;
for (int k = 0; k < sizeof(arrBox) / sizeof(SData); k++)
{
if (i == arrBox[k].nPlayY && j == arrBox[k].nPlayX)
{
bBoxSet = true;
}
}
//初始化地图边界
if (1 == nGameMap[i][j])
{
cout << "■";
}
//初始化玩家
else if (i == play.nPlayY && j == play.nPlayX)
{
cout << "你";
}
//初始化箱子
else if (bBoxSet)
{
cout << "盒";
}
else
{
cout << " ";
}
}
cout << endl;
}
//点击ESC 返回游戏菜单
if (KEY_DOWN(VK_ESCAPE))
{
nGameState = 0;
system("cls");
}
}
//游戏设置界面
if (E_GS_SET == nGameState)
{
cout << "这是设置" << endl;
//点击ESC 返回游戏菜单
if (KEY_DOWN(VK_ESCAPE))
{
nGameState = 0;
system("cls");
}
}
//游戏退出界面
if (E_GS_EXIT == nGameState)
{
break;
}
}
}
06-20