推箱子游戏(图形版)
一、.开发环境:vs2019 + easyx图形库
二、.开发流程步骤:I、绘制推箱子地图并初始化 ----- 几*几大小的地图
II、根据宏定义和推箱子地图上的数字来选择不同的图形
III、获取玩家坐标 -----------重点
(有两种情况:1.最开始玩家的坐标,并获取其横纵坐标
2. 玩家在目的地上时的坐标, 并获取其横纵坐标 )
IV、移动箱子 ----------------重点、难点
根据你所要移动的方向 分别判断箱子是否可以移动
以向上为例:分为以下几种情况
1.玩家上面是否为空地或目的地,若是,那就箱子移动
2.玩家前面为箱子或箱子加目的地,箱子的前面是否为目的地或空地,若是,则移动箱子(箱子移动到原来箱子的前面,人移动到原来箱子的位置)
V、判断是否通关,并设置多关卡
判断通关的条件:是否还有箱子
三、具体代码
1、初始化地图、定义全局变量
#define _CRT_SECURE_NO_WARNINGS#if UNICODE#undef UNICODE#endif#include#include#include#include#include#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,nfor (int i = 0; i < 10; i++) {for (int j = 0; j 1) {/*exit(666);*/MessageBox(GetHWnd(), "恭喜你通关了", "提示", MB_OKCANCEL);Sleep(3000);}level += 1;printf("恭喜你过关了,大佬666\n");}}return 0;}
四、总结
推箱子相信你们每一个都玩过吧,自己开发一个推箱子游戏,自己设置难易度,这该是一件多妙的事呀
所用素材: