5.8推箱子游戏测试

发布时间 2023-05-08 21:13:40作者: 混沌武士丞

一 推箱子游戏

二 代码与思路

#include<iostream>
using namespace std;
#include<stdlib.h>
#include<conio.h>
#define WIDTH 8 //地图宽度
#define HEIGHT 8 //地图长度
//定义地图 后期会做多地图
/*地图表示
0 空地
1 墙
2 人
3 箱子
4 箱子的目的地
5 到达目的地的箱子
*/
int map[WIDTH][HEIGHT] =
{
{0,0,0,0,0,0,3,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,2,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};
//人的位置
int x, y;
//箱子个数 成功的标志是箱子=0;
int boxs=0;
//数据初始化
void initDate();
//打印地图
void drawMap();
//向上移动
void moveUp();
//向左移动
void moveLeft();
//向下移动
void moveDown();
//向右移动
void moveRight();
int main()
{
char direction; //存储输入
initDate(); //数据初始化
//开始循环 每按一次按键都会刷新直至胜利
while (1)
{
system("cls");//清屏函数
drawMap();//画图
//箱子数量为0时胜利
if(!boxs)
{
break;
}
//接受输入
direction = _getch();
//用switch选择语句判断输入
switch (direction)
{
case'w':
moveUp();//向上移动
break;
case 'a':
moveLeft();
break;
case's':
moveDown();
break;
case'd':
moveRight();
break;
}

}
//跳出循环时恭喜胜利
cout << "恭喜你赢了";
}
void initDate()//数据初始化
{
int i, j;
cout << "游戏加载中...";
//遍历地图数据
for (i = 0; i < HEIGHT; i++)
{
for (j = 0; j < WIDTH; j++)
{
//遍历到2时记录人的坐标
if (map[i][j] == 2)
{
x = j;
y = i;
}
//遍历到3时 箱子数目增加
if (map[i][j] == 3)
{
boxs++;
}
}
}
}
void drawMap()
{
int i, j;
for (i = 0; i < WIDTH; i++)
{
for (j = 0; j < HEIGHT; j++)
{
switch(map[i][j])
{
case 0:
cout << " ";
break;
case 1:
cout << "墙";
break;
case 2:
cout << "你";
break;
case 3:
cout << "箱";
break;
case 4:
cout << "标";
break;
case 5:
cout << "达";
break;
}
}
cout << endl;
}
}
void moveUp()
{
//定义人物上方的目标
int ux, uy;
//人在最上方不能上移
if (y == 0)
{
return;
}
ux = x;
uy = y - 1;
//上方为完成的箱子 或本身
if (map[uy][ux] == 5|| map[uy][ux] == 2)
{
return;
}
//上方为墙
if (map[uy][ux] == 1)
{
return;
}
//上方为空地
if (map[uy][ux] == 0)
{
map[y][x] = 0;
map[uy][ux] = 2;
y = uy;//更新人的坐标
}
//上方为箱子
if (map[uy][ux] == 3)
{
//箱子上方为墙 箱子 或完成的箱子
if (map[uy - 1][ux] == 1 || map[uy - 1][ux] == 4 || map[uy - 1][ux] == 5)
{
return;
}
//箱子上方为目的地
if (map[uy - 1][ux] == 4)
{
map[uy - 1][ux] = 5;
map[uy][ux] = 2;
map[y][x] = 0;
x = ux;
y = uy - 1;
}
//箱子上方是空地
if (map[uy - 1][ux] == 0)
{
map[uy - 1][ux] = 3;
map[uy][ux] = 2;
map[y][x] = 0;
x = ux;
y = uy - 1;
}
}
}
void moveLeft()
{
//定义人物左方的目标
int lx, ly;
//人在最左方不能左移
if (x == 0)
{
return;
}
lx = x - 1;
ly = y;
//左方为完成的箱子
if (map[ly][lx] == 5)
{
return;
}
//左方为墙
if (map[ly][lx] == 1)
{
return;
}
//左方为空地
if (map[ly][lx] == 0)
{
map[y][x] = 0;
map[ly][lx] = 2;
y = ly;//更新人的坐标
}
//左方为箱子
if (map[ly][lx] == 3)
{
//箱子左方为墙 箱子 或完成的箱子
if (map[ly][lx - 1] == 1 || map[ly][lx - 1] == 4 || map[ly][lx - 1] == 5)
{
return;
}
//箱子左方为目的地
if (map[ly][lx] == 4)
{
map[ly][lx - 1] = 5;
map[ly][lx] = 2;
map[y][x] = 0;
x = lx - 1;
y = ly;
}
//箱子左方是空地
if (map[ly][lx - 1] == 0)
{
map[ly][lx - 1] = 3;
map[ly][lx] = 2;
map[y][x] = 0;
x = lx - 1;
y = ly;
}
}
}
void moveDown()
{
//定义人物下方的目标
int dx, dy;
//人在最下方不能下移
if (y == 7)
{
return;
}
dx = x;
dy = y + 1;
//下方为完成的箱子
if (map[dy][dx] == 5)
{
return;
}
//下方为墙
if (map[dy][dx] == 1)
{
return;
}
//下方为空地
if (map[dy][dx] == 0)
{
map[y][x] = 0;
map[dy][dx] = 2;
y = dy;//更新人的坐标
}
//下方为箱子
if (map[dy][dx] == 3)
{
//箱子下方为墙 箱子 或完成的箱子
if (map[dy + 1][dx] == 1 || map[dy + 1][dx] == 4 || map[dy + 1][dx] == 5)
{
return;
}
//箱子下方为目的地
if (map[dy + 1][dx] == 4)
{
map[dy + 1][dx] = 5;
map[dy][dx] = 2;
map[y][x] = 0;
x = dx;
y = dy + 1;
}
//箱子下方是空地
if (map[dy + 1][dx] == 0)
{
map[dy + 1][dx] = 3;
map[dy][dx] = 2;
map[y][x] = 0;
x = dx;
y = dy + 1;
}
}
}
void moveRight()
{
//定义人物右方的目标
int rx, ry;
//人在最右方不能右移
if (x == 7)
{
return;
}
rx = x + 1;
ry = y;
//右方为完成的箱子
if (map[ry][rx] == 5)
{
return;
}
//右方为墙
if (map[ry][rx] == 1)
{
return;
}
//右方为空地
if (map[ry][rx] == 0)
{
map[y][x] = 0;
map[ry][rx] = 2;
y = ry;//更新人的坐标
}
//右方为箱子
if (map[ry][rx] == 3)
{
//箱子右方为墙 箱子 或完成的箱子
if (map[ry][rx + 1] == 1 || map[ry][rx + 1] == 4 || map[ry][rx + 1] == 5)
{
return;
}
//箱子右方为目的地
if (map[ry][rx] == 4)
{
map[ry][rx + 1] = 5;
map[ry][rx] = 2;
map[y][x] = 0;
x = rx + 1;
y = ry;
}
//箱子右方是空地
if (map[ry][rx + 1] == 0)
{
map[ry][rx + 1] = 3;
map[ry][rx] = 2;
map[y][x] = 0;
x = rx + 1;
y = ry;
}
}
}