参考的是 自然向日葵 的文章,在这里感谢大佬无私分享!!!
https://codebus.cn/contributor/post/zrxrk-boxman
以下是代码:
/*
///
// 程序名称:推箱子
// 编译环境:Visual C++ 6.0,EasyX_2018春分版
// 程序编写:TReemonkey
// 日期:2020-4-1
//
游戏一共5关;
方向键和wsad上下左右移动;
r键重新开始当前关;
0为地板,1为玩家,2为箱子,3为箱子放置的区域,
4为玩家在箱子放置的区域,5为箱子成功放置,6为墙壁
*/
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#define Width 720
#define High 540
//变量定义
IMAGE img[8]; //图像变量存储图片
char FileName[10] = "";
int man_x, man_y; //人物的位置
int count; //判断游戏是否结束
int Rcanvas[9][12];
int a; //记录当前进行的关卡
int canvas[5][9][12] = //地图元素的定义
{
//第一关
{
0,0,0,0,6,6,6,0,0,0,0,0,
0,0,0,0,6,3,6,0,0,0,0,0,
0,0,0,0,6,2,6,6,6,6,0,0,
0,0,6,6,6,1,0,2,3,6,0,0,
0,0,6,3,2,0,0,6,6,6,0,0,
0,0,6,6,6,6,2,6,0,0,0,0,
0,0,0,0,0,6,3,6,0,0,0,0,
0,0,0,0,0,6,6,6,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0
},
//第二关
{
0,0,6,6,6,6,6,0,0,0,0,0,
0,0,6,1,0,0,6,0,0,0,0,0,
0,0,6,0,2,2,6,0,6,6,6,0,
0,0,6,0,2,0,6,0,6,3,6,0,
0,0,6,6,6,0,6,6,6,3,6,0,
0,0,0,6,6,0,0,0,0,3,6,0,
0,0,0,6,0,0,0,6,0,0,6,0,
0,0,0,6,0,0,0,6,6,6,6,0,
0,0,0,6,6,6,6,6,0,0,0,0
},
//第三关
{
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,6,6,6,6,6,6,6,0,0,0,
0,0,6,0,0,0,0,0,6,6,6,0,
0,6,6,2,6,6,6,0,0,0,6,0,
0,6,0,1,0,2,0,0,2,0,6,0,
0,6,0,3,3,6,0,2,0,0,6,0,
0,6,6,3,3,6,0,0,0,6,6,0,
0,0,6,6,6,6,6,6,6,6,6,0,
0,0,0,0,0,0,0,0,0,0,0,0
},
//第四关
{
0,0,0,0,6,6,6,6,0,0,0,0,
0,0,0,6,6,0,0,6,0,0,0,0,
0,0,0,6,1,2,0,6,0,0,0,0,
0,0,0,6,6,2,0,6,6,0,0,0,
0,0,0,6,6,0,2,0,6,0,0,0,
0,0,0,6,3,2,0,0,6,0,0,0,
0,0,0,6,3,3,5,3,6,0,0,0,
0,0,0,6,6,6,6,6,6,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0
},
//第五关
{
0,0,0,6,6,6,6,6,0,0,0,0,
0,0,0,6,1,0,6,6,6,0,0,0,
0,0,0,6,0,2,0,0,6,0,0,0,
0,0,6,6,6,0,6,0,6,6,0,0,
0,0,6,3,6,0,6,0,0,6,0,0,
0,0,6,3,2,0,0,6,0,6,0,0,
0,0,6,3,0,0,0,2,0,6,0,0,
0,0,6,6,6,6,6,6,6,6,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
}
};
void StartUp()
{
initgraph(Width,High);
count = 1;
a = 0;
for (int i=0; i<7; i++)
{
sprintf(FileName, "%d.jpg", i);
loadimage(&img[i], FileName);
}
for (i=0; i<9; i++)
{
for (int j=0; j<12; j++)
{
Rcanvas[i][j] = canvas[a][i][j];
}
}
}
void Show()
{
int x, y;
//判断是否本关卡结束
if (count == 0)
{
a++;
for (int i=0; i<9; i++)
{
for (int j=0; j<12; j++)
{
Rcanvas[i][j] = canvas[a][i][j];
}
}
}
for (int i=0; i<9; i++)
{
for (int j=0; j<12; j++)
{
x = 60 * j;
y = 60 * i;
switch(canvas[a][i][j])
{
case 0:
putimage(x, y, &img[0]);
break;
case 1:
putimage(x, y, &img[1]);
break;
case 2:
putimage(x, y, &img[2]);
break;
case 3:
putimage(x, y, &img[3]);
break;
case 4:
putimage(x, y, &img[4]);
break;
case 5:
putimage(x, y, &img[5]);
break;
case 6:
putimage(x, y, &img[6]);
break;
}
}
}
}
int IsOver()
{
count=0;
for (int i=0; i<9; i++)
{
for (int j=0; j<12; j++)
{
if (canvas[a][i][j] == 2)
{
count=1;
}
}
}
return count;
}
void UpdateWithInput()
{
for (int i=0; i<9; i++)
{
for (int j=0; j<12; j++)
{
if (canvas[a][i][j] == 1 || canvas[a][i][j] == 4)
{
man_x = j;
man_y = i;
break;
}
}
if (canvas[a][i][j] == 1 || canvas[a][i][j] == 4)
{
man_x = j;
man_y = i;
break;
}
}
char input;
if (kbhit())
{
input = getch();
switch(input)
{
case 'W':
case 'w':
case 72:
if (canvas[a][man_y-1][man_x] == 0 || canvas[a][man_y-1][man_x] == 3) //一般情况
{
canvas[a][man_y][man_x] -= 1;
canvas[a][man_y-1][man_x] += 1;
}
else if (canvas[a][man_y-1][man_x] == 2 || canvas[a][man_y-1][man_x] == 5) //推箱子
{
if ( canvas[a][man_y-2][man_x] == 0 || canvas[a][man_y-2][man_x] == 3)
{
canvas[a][man_y][man_x] -= 1;
canvas[a][man_y-1][man_x] -= 1;
canvas[a][man_y-2][man_x] += 2;
}
}
break;
case 'S':
case 's':
case 80:
if (canvas[a][man_y+1][man_x] == 0 || canvas[a][man_y+1][man_x] == 3) //一般情况
{
canvas[a][man_y][man_x] -= 1;
canvas[a][man_y+1][man_x] += 1;
}
else if (canvas[a][man_y+1][man_x] == 2 || canvas[a][man_y+1][man_x] == 5) //推箱子
{
if ( canvas[a][man_y+2][man_x] == 0 || canvas[a][man_y+2][man_x] == 3)
{
canvas[a][man_y][man_x] -= 1;
canvas[a][man_y+1][man_x] -= 1;
canvas[a][man_y+2][man_x] += 2;
}
}
break;
case 'A':
case 'a':
case 75:
if (canvas[a][man_y][man_x-1] == 0 || canvas[a][man_y][man_x-1] == 3) //一般情况
{
canvas[a][man_y][man_x] -= 1;
canvas[a][man_y][man_x-1] += 1;
}
else if (canvas[a][man_y][man_x-1] == 2 || canvas[a][man_y][man_x-1] == 5) //推箱子
{
if ( canvas[a][man_y][man_x-2] == 0 || canvas[a][man_y][man_x-2] == 3)
{
canvas[a][man_y][man_x] -= 1;
canvas[a][man_y][man_x-1] -= 1;
canvas[a][man_y][man_x-2] += 2;
}
}
break;
case 'D':
case 'd':
case 77:
if (canvas[a][man_y][man_x+1] == 0 || canvas[a][man_y][man_x+1] == 3) //一般情况
{
canvas[a][man_y][man_x] -= 1;
canvas[a][man_y][man_x+1] += 1;
}
else if (canvas[a][man_y][man_x+1] == 2 || canvas[a][man_y][man_x+1] == 5) //推箱子
{
if ( canvas[a][man_y][man_x+2] == 0 || canvas[a][man_y][man_x+2] == 3)
{
canvas[a][man_y][man_x] -= 1;
canvas[a][man_y][man_x+1] -= 1;
canvas[a][man_y][man_x+2] += 2;
}
}
break;
case 'R':
case 'r':
for (int i=0; i<9; i++)
{
for (int j=0; j<12; j++)
{
canvas[a][i][j] = Rcanvas[i][j];
}
}
break;
}
}
}
void gameover()
{
getch();
closegraph();
}
int main()
{
StartUp();
do
{
Show();
UpdateWithInput();
IsOver();
}while(count || (a<6));
gameover();
return 0;
}