> 文档中心 > 推箱子游戏(图形版)

推箱子游戏(图形版)

一、.开发环境: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;}

四、总结

 推箱子相信你们每一个都玩过吧,自己开发一个推箱子游戏,自己设置难易度,这该是一件多妙的事呀
 

所用素材: