一、.开发环境:vs2019 + easyx图形库
二、.开发流程步骤:I、绘制推箱子地图并初始化 ----- 几*几大小的地图
II、根据宏定义和推箱子地图上的数字来选择不同的图形
III、获取玩家坐标 -----------重点
(有两种情况:1.最开始玩家的坐标,并获取其横纵坐标
2. 玩家在目的地上时的坐标, 并获取其横纵坐标 )
IV、移动箱子 ----------------重点、难点
根据你所要移动的方向 分别判断箱子是否可以移动
以向上为例:分为以下几种情况
1.玩家上面是否为空地或目的地,若是,那就箱子移动
2.玩家前面为箱子或箱子加目的地,箱子的前面是否为目的地或空地,若是,则移动箱子(箱子移动到原来箱子的前面,人移动到原来箱子的位置)
V、判断是否通关,并设置多关卡
判断通关的条件:是否还有箱子
三、具体代码
1、初始化地图、定义全局变量
#define _CRT_SECURE_NO_WARNINGS
#if UNICODE
#undef UNICODE
#endif
#include<stdio.h>
#include<Windows.h>
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#define SPACE 0 //空白 " "
#define WALL 1 //墙 "墙 "
#define DEST 2 //目的地 "@@"
#define BOX 3 //箱子 "¥"
#define PLAYER 4 //玩家 "&&"
//tip:注意获取人在目的地时的坐标,
//
//定义两个全局变量 m,n 分别为玩家的横纵坐标
int m, n;
int level = 0;
IMAGE image[7];
//初始化地图
int arr[5][10][10] = {
{
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,0,0,0,0},
{0,0,0,1,2,1,0,0,0,0},
{0,0,0,1,3,1,1,1,1,0},
{0,1,1,1,0,0,3,2,1,0},
{0,1,2,3,4,0,1,1,1,0},
{0,1,1,1,1,3,1,0,0,0},
{0,0,0,0,1,2,1,0,0,0},
{0,0,0,0,1,1,1,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
},
{
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,0,0,1,1,1,0},
{1,0,0,0,1,1,0,0,0,1},
{1,2,0,0,3,0,0,0,0,1},
{0,1,2,3,4,3,0,0,1,0},
{0,0,1,0,3,0,2,1,0,0},
{0,0,0,1,0,2,1,0,0,0},
{0,0,0,0,1,1,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,0,0,0,0,0,0},
{0,1,1,1,1,1,1,1,1,0},
{0,1,2,0,1,2,0,0,1,0},
{0,1,0,0,1,1,0,0,1,0},
{0,1,0,3,4,0,3,0,1,0},
{0,1,0,0,3,0,0,1,1,0},
{0,1,1,0,1,0,0,1,0,0},
{0,0,1,0,1,2,0,1,0,0},
{0,0,1,1,1,1,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0},
},
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,1,0,0,2,0,0,0,1},
{1,2,1,1,0,0,0,1,0,1},
{1,0,0,0,3,0,1,1,2,1},
{1,0,1,1,4,3,0,1,0,1},
{1,0,1,0,3,0,3,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,2,0,0,0,1,1,1,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1},
},
{
{0,0,0,0,1,1,0,0,0,0},
{0,0,0,1,2,0,1,0,0,0},
{0,0,1,0,3,0,2,1,0,0},
{0,1,0,0,3,1,0,0,1,0},
{1,0,0,3,0,3,0,0,0,1},
{1,0,0,1,0,3,1,2,0,1},
{0,1,2,0,0,0,2,0,1,0},
{0,0,1,0,1,0,0,1,0,0},
{0,0,0,1,0,0,1,0,0,0},
{0,0,0,0,1,1,0,0,0,0},
},
};
2、加载图片并绘制推箱子界面
void initgame(){
initgraph(700,700);
//加载图片
char buff[66];
for (int i = 0; i < 7; i++) {
sprintf(buff, "image\\%d.bmp", i );
loadimage(&image[i], buff, 70, 70, true);
}
}
//绘制页面
void drawMap() {
//输出地图
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
printf("%d ", arr[level][i][j]);
putimage(j * 70, i * 70, &image[arr[level][i][j]]);
}
printf("\n");
}
}
3、通过方向键移动,推箱子----------重难点
//按键控制移动方向
void move() {
char userkey = _getch();
switch (userkey)
{
case 72:
case 'W':
case 'w':
//玩家前面是否为空地
if (arr[level][m - 1][n] == SPACE || arr[level][m - 1][n] == DEST) {
arr[level][m - 1][n] = PLAYER + arr[level][m - 1][n];
arr[level][m][n] = arr[level][m][n] - PLAYER;
}
//玩家前面是否为箱子
else if (arr[level][m - 1][n] == BOX || arr[level][m - 1][n] == BOX + DEST) {
//箱子前面是否为空地或目的地
if (arr[level][m - 2][n] == SPACE || arr[level][m - 2][n] == DEST) {
arr[level][m - 2][n] = arr[level][m - 2][n] + BOX;
arr[level][m - 1][n] = arr[level][m - 1][n] - BOX;
arr[level][m - 1][n] = arr[level][m - 1][n] + PLAYER;
arr[level][m][n] = arr[level][m][n] - PLAYER;
}
}
/*printf("up\n");
Sleep(1000);*/
break;
case 80:
case 'S':
case 's':
//玩家后面是否为空地
if (arr[level][m + 1][n] == SPACE || arr[level][m + 1][n] == DEST) {
arr[level][m + 1][n] = arr[level][m + 1][n] + PLAYER;
arr[level][m][n] = arr[level][m][n] - PLAYER;
}
//玩家后面是否为箱子
else if (arr[level][m + 1][n] == BOX || arr[level][m + 1][n] == BOX + DEST) {
//箱子后面是否为空地或目的地
if (arr[level][m + 2][n] == SPACE || arr[level][m + 2][n] == DEST) {
arr[level][m + 2][n] = arr[level][m + 2][n] + BOX;
arr[level][m + 1][n] = arr[level][m + 1][n] - BOX;
arr[level][m + 1][n] = arr[level][m + 1][n] + PLAYER;
arr[level][m][n] = arr[level][m][n] - PLAYER;
}
}
break;
case 75:
case 'A':
case 'a':
//玩家左边是否为空地
if (arr[level][m][n - 1] == SPACE || arr[level][m][n - 1] == DEST) {
arr[level][m][n - 1] = arr[level][m][n - 1] + PLAYER;
arr[level][m][n] = arr[level][m][n] - PLAYER;
}
//玩家左边是否为箱子
else if (arr[level][m][n - 1] == BOX || arr[level][m][n - 1] == BOX + DEST) {
//箱子左边是否为空地或目的地
if (arr[level][m][n - 2] == SPACE || arr[level][m][n - 2] == DEST) {
arr[level][m][n - 2] = arr[level][m][n - 2] + BOX;
arr[level][m][n - 1] = arr[level][m][n - 1] - BOX;
arr[level][m][n - 1] = arr[level][m][n - 1] + PLAYER;
arr[level][m][n] = arr[level][m][n] - PLAYER;
}
}
break;
case 77:
case 'D':
case 'd':
//玩家右边是否为空地
if (arr[level][m][n + 1] == SPACE || arr[level][m][n + 1] == DEST) {
arr[level][m][n + 1] = arr[level][m][n + 1] + PLAYER;
arr[level][m][n] = arr[level][m][n] - PLAYER;
}
//玩家右边是否为箱子
else if (arr[level][m][n + 1] == BOX || arr[level][m][n + 1] == BOX + DEST) {
//箱子右边是否为空地或目的地
if (arr[level][m][n + 2] == SPACE || arr[level][m][n + 2] == DEST) {
arr[level][m][n + 2] = arr[level][m][n + 2] + BOX;
arr[level][m][n + 1] = arr[level][m][n + 1] - BOX;
arr[level][m][n + 1] = arr[level][m][n + 1] + PLAYER;
arr[level][m][n] = arr[level][m][n] - PLAYER;
}
}
break;
}
}
4、判断是否通过--------有无箱子的存在
//判断是否通关--------------是否还有箱子
bool judge() {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (arr[level][i][j] == BOX) {
return false;
}
}
}
return true;
}
5.main函数里面
int main() {
SetWindowText(GetHWnd(), "推箱子");
initgame();
drawMap();
while (1)
{
//获取玩家坐标,并将其下标分别赋给 m,n
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if ((arr[level][i][j] == PLAYER)| (arr[level][i][j]== PLAYER+DEST)) {
m = i;
n = j;
}
}
}
move();
system("cls");
drawMap();
if (judge()) {
if (level > 1) {
/*exit(666);*/
MessageBox(GetHWnd(), "恭喜你通关了", "提示", MB_OKCANCEL);
Sleep(3000);
}
level += 1;
printf("恭喜你过关了,大佬666\n");
}
}
return 0;
}
四、总结
推箱子相信你们每一个都玩过吧,自己开发一个推箱子游戏,自己设置难易度,这该是一件多妙的事呀
所用素材: