简单的推箱子实现
只有一个地图,写了菜单,算是赘余吧。
// An highlighted block
#include <iostream>
#include<Windows.h>
#include <conio.h>//获取键盘输入
using namespace std;
void Map(int nMapArray[10][10]);
bool bOver(int nMapArray[10][10]);
void Move(int &x, int &y, int nMapArray[10][10], int cx, int cy);
void main(){
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);
int nState = 1;
char StartControl;
while (true)
{
system("cls");
if (nState == 1) cout << " >开始游戏< " << endl;
else
{
cout << " 开始游戏 " << endl;
}
if (nState == 2) cout << " >退出游戏< " << endl;
else
{
cout << " 退出游戏 " << endl;
}
cout << "使用wasd四键控制。" << endl;
StartControl = _getch();
if (StartControl == 'w')
{
nState--;
if (nState<1)
{
nState = 2;
}
}
else if (StartControl == 's'){
nState++;
if (nState>2)
{
nState = 1;
}
}
else if (nState == 1 && StartControl == 13)
{
system("cls");
int nMapArray[10][10] = {//用数值来表示不同的状态,0:障碍1:空地2:人 3:箱子 4:占据位置的人 5;人
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 1, 0, 1, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 0, 1, 1, 5, 1, 0 },
{ 0, 1, 1, 0, 0, 1, 1, 0, 1, 0 },
{ 0, 1, 1, 0, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 1, 0, 1, 1, 2, 1, 1, 0 },
{ 0, 1, 1, 5, 1, 1, 2, 1, 1, 0 },
{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};
char Control;
int x = 3;//当前位置x值
int y = 3;//当前位置y值
nMapArray[x][y] = 3;
Map(nMapArray);
while (bOver(nMapArray)){//判定不存在位置或占位人,存在返回true,不存在返回false
system("cls");
Map(nMapArray);
Control = _getch();
if (Control == 27)
{
break;
}
switch (Control){
case 'w': Move(x, y, nMapArray, -1, 0); break;
case 'a': Move(x, y, nMapArray, 0, -1); break;
case 's': Move(x, y, nMapArray, 1, 0);break;
case 'd': Move(x, y, nMapArray, 0, 1);break;
default:break;
}
}
}
else if (nState == 2 && StartControl == 13){
exit(0);
}
else if (StartControl == 27){
exit(0);
}
}
//cout << "游戏结束!" << endl;
//system("pause");
}
// case 0:cout << "□■●★×☒○¤"; break;
void Map(int nMapArray[10][10]){
for (int i = 0; i<10; i++){
for (int j = 0; j<10; j++){
switch (nMapArray[i][j])
{
case 0:cout << "■"; break;//0:障碍
case 1:cout << " "; break;//1:空地
case 2:cout << "×"; break;//2:位置
case 3:cout << "○"; break;//3:人
case 4:cout << "¤"; break;//4:占据位置的人
case 5:cout << "□"; break;//5:箱子
case 6:cout << "★"; break;//6:占位置的箱子
default:
break;
}
}
cout << endl;
}
}
bool bOver(int nMapArray[10][10]){
for (int i = 0; i<10; i++){
for (int j = 0; j<10; j++){
if (nMapArray[i][j] == 2 || nMapArray[i][j] == 4)
{
return true;
}
}
}
return false;
}
void Move(int &x, int &y, int nMapArray[10][10], int cx, int cy){
//if (){}无障碍直接走
//if (){}有障碍不能走
//是位置
//有箱子可以推
//有箱子不能推
if (nMapArray[x + cx][y + cy] == 1 || nMapArray[x + cx][y + cy] == 2){
//空地移进
nMapArray[x][y] -= 2;//原地图变化
x += cx;
y += cy;//人物坐标变化
nMapArray[x][y] += 2;//新地图变化
}
else if (nMapArray[x + cx][y + cy] == 5 || nMapArray[x + cx][y + cy] == 6){
//普通箱子或者占位箱子
if (nMapArray[x + cx * 2][y + cy * 2] == 1 || nMapArray[x + cx * 2][y + cy * 2] == 2){//箱子可以推
nMapArray[x][y] -= 2;//原地图变化
x += cx;
y += cy;//人物坐标变化
nMapArray[x][y] -= 2;
nMapArray[x + cx][y + cy] += 4;
}
}
else
{//无法移动
}
}
PS:欢迎交流想法。