推箱子游戏
本项目开发环境为VS2017+C
对推箱子游戏的观察可以发现,该游戏就是在一个页面对图片进行移动的操作。因此可以定义一个二维数组map,进行初始化。0:空地;1:墙壁;3:箱子的目的地;4:箱子;6:人;7;箱子与目的地重合;9:人在箱子目的地。
代码如下:
#include<iostream>
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
using namespace std;
//0:空地;1:墙壁;3:箱子的目的地;4:箱子
//6:人;7;箱子与目的地重合;9:人在箱子目的地
int g_map[10][12] =
{
{ 1,1,1,1,1,0,0,0,0,0,0,0 },
{ 1,0,0,0,1,0,1,1,1,0,0,0 },
{ 1,0,4,0,1,0,1,1,1,1,1,1 },
{ 1,0,4,6,1,0,1,0,0,0,3,1 },
{ 1,1,1,4,1,1,1,0,0,0,3,1 },
{ 1,1,1,0,0,0,0,0,0,0,3,1 },
{ 0,1,0,0,0,1,0,0,0,0,0,1 },
{ 0,1,0,0,0,1,0,0,0,0,0,1 },
{ 0,1,0,0,0,1,1,1,1,1,1,1 },
{ 0,1,1,1,1,1,0,0,0,0,0,0 }
};
void DrawMap();
void Up();
void Right();
void Left();
void Down();
//获取玩家坐标
POINT GetGamerPostion();
int main()
{
//设置窗口标题
SetConsoleTitleA("推箱子");
//修改窗口的大小
system("mode con cols=30 lines=16");
//循环
while (1)
{
//清屏
system("cls");
//打印地图
DrawMap();
char ch=getch();
switch (ch)
{
case 'w':case 72:Up(); break;
case 's':case 80:Down();break;
case 'a':case 75:Left();break;
case 'd':case 77:Right(); break;
}
}
//getchar();
return 0;
}
void DrawMap()
{
//遍历二维数组
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 12; j++)
{
//printf("%d",g_map[i][j]);
switch (g_map[i][j])
{
case 0://空地
printf(" "); break;
case 1://墙壁
printf("■"); break;
case 3://箱子目的地
printf("☆"); break;
case 4://箱子
printf("□"); break;
case 6://人
printf("♀"); break;
case 7://箱子与目的地重合
printf("★"); break;
case 9://人站在目的地
printf("♀"); break;
}
}
printf("\n");
}
}
void Up()
{
//获取玩家坐标
POINT pos = GetGamerPostion();
//1.人的前面是空地
if (g_map[pos.x - 1][pos.y] == 0)
{
g_map[pos.x - 1][pos.y] = 6;
if(g_map[pos.x][pos.y]==9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//2.人的前面是目的地
if (g_map[pos.x - 1][pos.y] == 3)
{
g_map[pos.x - 1][pos.y] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//3.人的前面是箱子
if (g_map[pos.x - 1][pos.y] == 4)
{
//a.箱子的前面是空地
if (g_map[pos.x - 2][pos.y] == 0)
{
g_map[pos.x - 2][pos.y] = 4;//空地变成箱子
g_map[pos.x - 1][pos.y] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//b.箱子的前面是目的地
if (g_map[pos.x - 2][pos.y] == 3)
{
g_map[pos.x - 2][pos.y] = 7;
g_map[pos.x - 2][pos.y] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
}
//4.人前面是箱子和目的地的重合
if (g_map[pos.x - 1][pos.y] == 7)
{
//a.箱子和目的地重合的前面是空地
if (g_map[pos.x - 2][pos.y] == 0)
{
g_map[pos.x - 2][pos.y] = 4;//空地变成箱子
g_map[pos.x - 1][pos.y] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//b.箱子和目的地重合的前面是另一个目的地
if (g_map[pos.x - 2][pos.y] == 3)
{
g_map[pos.x - 2][pos.y] = 7;//空地变成箱子
g_map[pos.x - 1][pos.y] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
}
}
void Down()
{
//获取玩家坐标
POINT pos = GetGamerPostion();
//1.人的前面是空地
if (g_map[pos.x +1][pos.y] == 0)
{
g_map[pos.x + 1][pos.y] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//2.人的前面是目的地
if (g_map[pos.x + 1][pos.y] == 3)
{
g_map[pos.x + 1][pos.y] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//3.人的前面是箱子
if (g_map[pos.x + 1][pos.y] == 4)
{
//a.箱子的前面是空地
if (g_map[pos.x + 2][pos.y] == 0)
{
g_map[pos.x + 2][pos.y] = 4;//空地变成箱子
g_map[pos.x + 1][pos.y] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//b.箱子的前面是目的地
if (g_map[pos.x + 2][pos.y] == 3)
{
g_map[pos.x + 2][pos.y] = 7;
g_map[pos.x + 2][pos.y] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
}
//4.人前面是箱子和目的地的重合
if (g_map[pos.x + 1][pos.y] == 7)
{
//a.箱子和目的地重合的前面是空地
if (g_map[pos.x + 2][pos.y] == 0)
{
g_map[pos.x + 2][pos.y] = 4;//空地变成箱子
g_map[pos.x + 1][pos.y] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//b.箱子和目的地重合的前面是另一个目的地
if (g_map[pos.x + 2][pos.y] == 3)
{
g_map[pos.x + 2][pos.y] = 7;//空地变成箱子
g_map[pos.x + 1][pos.y] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
}
}
void Left()
{
//获取玩家坐标
POINT pos = GetGamerPostion();
//1.人的前面是空地
if (g_map[pos.x ][pos.y-1] == 0)
{
g_map[pos.x ][pos.y-1] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//2.人的前面是目的地
if (g_map[pos.x ][pos.y-1] == 3)
{
g_map[pos.x ][pos.y-1] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//3.人的前面是箱子
if (g_map[pos.x ][pos.y-1] == 4)
{
//a.箱子的前面是空地
if (g_map[pos.x ][pos.y-2] == 0)
{
g_map[pos.x ][pos.y-2] = 4;//空地变成箱子
g_map[pos.x ][pos.y-1] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//b.箱子的前面是目的地
if (g_map[pos.x ][pos.y-2] == 3)
{
g_map[pos.x ][pos.y-2] = 7;
g_map[pos.x ][pos.y-2] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
}
//4.人前面是箱子和目的地的重合
if (g_map[pos.x ][pos.y-1] == 7)
{
//a.箱子和目的地重合的前面是空地
if (g_map[pos.x ][pos.y-2] == 0)
{
g_map[pos.x ][pos.y-2] = 4;//空地变成箱子
g_map[pos.x ][pos.y-1] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//b.箱子和目的地重合的前面是另一个目的地
if (g_map[pos.x ][pos.y-2] == 3)
{
g_map[pos.x ][pos.y-2] = 7;//空地变成箱子
g_map[pos.x ][pos.y-1] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
}
}
void Right()
{
//获取玩家坐标
POINT pos = GetGamerPostion();
//1.人的前面是空地
if (g_map[pos.x][pos.y +1] == 0)
{
g_map[pos.x][pos.y + 1] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//2.人的前面是目的地
if (g_map[pos.x][pos.y + 1] == 3)
{
g_map[pos.x][pos.y + 1] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//3.人的前面是箱子
if (g_map[pos.x][pos.y + 1] == 4)
{
//a.箱子的前面是空地
if (g_map[pos.x][pos.y + 2] == 0)
{
g_map[pos.x][pos.y + 2] = 4;//空地变成箱子
g_map[pos.x][pos.y + 1] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//b.箱子的前面是目的地
if (g_map[pos.x][pos.y + 2] == 3)
{
g_map[pos.x][pos.y + 2] = 7;
g_map[pos.x][pos.y + 2] = 6;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
}
//4.人前面是箱子和目的地的重合
if (g_map[pos.x][pos.y + 1] == 7)
{
//a.箱子和目的地重合的前面是空地
if (g_map[pos.x][pos.y + 2] == 0)
{
g_map[pos.x][pos.y + 2] = 4;//空地变成箱子
g_map[pos.x][pos.y + 1] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
//b.箱子和目的地重合的前面是另一个目的地
if (g_map[pos.x][pos.y + 2] == 3)
{
g_map[pos.x][pos.y + 2] = 7;//空地变成箱子
g_map[pos.x][pos.y + 1] = 9;
if (g_map[pos.x][pos.y] == 9)
g_map[pos.x][pos.y] = 3;//目的地
else
g_map[pos.x][pos.y] = 0;//原来人的位置变成空地
}
}
}
POINT GetGamerPostion()
{
POINT pos = { -1,-1 };
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 12; j++)
{
if (g_map[i][j] == 6 || g_map[i][j] == 9)
{
pos.x = i;
pos.y = j;
return pos;
}
}
}
return pos;
}