转发自老廖&&Games的博客
功能:
实现人物的移动控制,关卡的选择,撤销,
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int victory=0;
int Map[3][10][10] = {
{ //2是人,4是胜利点,3是箱子,1是墙,0是空地
{ 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, 0, 0, 4, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 4, 3, 4, 0, 0, 1 },
{ 1, 0, 3, 0, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 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, 0, 0, 4, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 3, 0, 4, 0, 1 },
{ 1, 0, 1, 0, 4, 0, 0, 0, 0, 1 },
{ 1, 0, 3, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 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, 0, 0, 4, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 3, 1, 4, 0, 1 },
{ 1, 0, 0, 1, 4, 0, 0, 0, 0, 1 },
{ 1, 0, 3, 0, 0, 1, 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 changeMap[10][10];
char getchar;
int offsetx = 0, offsety = 0;
int manX= 1, manY= 2;
int index=0, indey=0;
bool flag=true;
for (int k = 0; k <= 2; k++)
{
memcpy(changeMap, Map[k], sizeof(Map[k]));
while (true)
{
for (int j = 0; j <= 9; j++)
{
for (int h = 0; h <= 9; h++)
{
switch (Map[k][j][h])
{
case 0:
cout << " ";//注意空格是一个字符,其它的图形是占两个字符
break;
case 1:
cout << "■";
break;
case 2:
cout << "♀";
break;
case 3:
cout << "☆";
break;
case 4:
cout << "◎";
break;
break;
case 6:
cout << "♂";
break;
case 7:
cout << "★";
break;
}
}
cout << endl;
}
getchar = _getch();//写入一个字符,进行移动操作
switch (getchar)
{
case 's':
case 'S':
offsetx += 1, offsety = 0;
break;
case 'w':
case 'W':
offsetx -= 1, offsety = 0;
break;
case 'a':
case 'A':
offsetx=0, offsety-=1;
break;
case 'd':
case 'D':
offsetx = 0, offsety+=1;
break;
case 'r':
case 'R':
memcpy(Map[k], changeMap, sizeof(changeMap));
manX = 1, manY = 2;
break;
case 'b':
case 'B':
if (flag)
{
//撤销人物的位置
Map[k][manX - index][manY - indey] += 2;
Map[k][manX][manY] -= 2;
}
else{
//箱子和人一起撤销
Map[k][manX + index][manY + indey] -= 3;//manX现在是以前箱子在的地方
Map[k][manX - index][manY - indey] += 2;
Map[k][manX][manY] -= -3 + 2;//现在的位置要变成箱子 a=a-2+3;
}
manX -= index, manY -= indey;
index = 0, indey = 0;
flag = 0;
//flag的true以及false,默认撤销人,防止人在箱子旁边,箱子没动却将箱子给撤销了
break;
}
//当人物进行移动时,空地,以及胜利点
if (Map[k][manX + offsetx][manY + offsety] == 0 || Map[k][manX + offsetx][manY + offsety]==4)
{
flag = true;
Map[k][manX][manY] -=2;
Map[k][manX + offsetx][manY + offsety] += 2;
manX += offsetx, manY += offsety;
}
//当前面有箱子时,或者箱子在胜利点上面
else if ((Map[k][manX + offsetx][manY + offsety] == 3) || (Map[k][manX + offsetx][manY + offsety] == 7))
{
//判断箱子能推动的情况
if (Map[k][manX + offsetx * 2][manY + offsety * 2] == 0 || Map[k][manX + offsetx * 2][manY + offsety * 2] == 4)
{
flag = false;
Map[k][manX + offsetx * 2][manY + offsety * 2] += 3;//箱子移动时在的地方
Map[k][manX + offsetx][manY + offsety] += -3 + 2;//人前往箱子以前所在的地方,a=a-3+2
Map[k][manX][manY] -= 2;
manX += offsetx, manY += offsety;
}//防止撤销步数时,箱子靠墙,按键移动时,位置未发生改变,撤销却能将箱子拉回来
else{
offsetx = 0, offsety = 0;
}
}
index = offsetx, indey = offsety;//为撤销方向进行赋值
offsetx = 0,offsety = 0;//移动步数清0
system("CLS");//实现清屏操作,需导入Windows.h包
//判断是否将所有箱子推到胜利点上去
for (int j = 0; j <= 9; j++)
{
for (int h = 0; h <= 9; h++)
{
if (Map[k][j][h] == 7)
{
victory++;
}
}
}
if (victory == 3)
{
manX = 1, manY = 2;//更新下一关的人物坐标
index = 0, indey = 0;//通关了,则将本关中的撤销步数变为0
victory = 0;
break;
}
victory = 0;//将本次统计已经到胜利点的箱子个数进行清空
}
}
return 0;
}