经典的推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
下面就让小编带你一步一步完成属于自己的推箱子游戏~
推箱子游戏的实现
开发环境的搭建
- 因为我的这里使用的是vs2019所以就用2019来演示
- 首先百度首页搜索easyx
- 找到官网(嫌麻烦的小伙伴,也可以进我主页群,群文件里有相关素材)
![5e1e22d25361a0add4269417af0e59d9.png](https://i-blog.csdnimg.cn/blog_migrate/bb3516b93ba7cdea904199af17580aa2.jpeg)
![f232447887597bf56a51acee8c170328.png](https://i-blog.csdnimg.cn/blog_migrate/a517455ea94ac68a905781e1387ac583.jpeg)
![a52431bb7f6e8989503dd04a9cb90bd3.png](https://i-blog.csdnimg.cn/blog_migrate/54bfa00a4d253be5a7895783c0c6e520.jpeg)
![7ae9ba80b726edd4daa3954ce54680e7.png](https://i-blog.csdnimg.cn/blog_migrate/87f867da10bbb94643a3cb102f74aefa.jpeg)
![ea983ee4d8219eda3de6529b5e6e4a84.png](https://i-blog.csdnimg.cn/blog_migrate/a89c624ee24e6f256b08906a77d55b58.jpeg)
游戏实现
![4622e2844b2958656f689e4034dc21f3.png](https://i-blog.csdnimg.cn/blog_migrate/66eb661e317a262d4e7101831688bc57.jpeg)
温馨提示
需要添加头文件graphics.h
//作者:奇牛学院-残芯//技术交流群:782648055#include #include #include #include #include using namespace std;#define RATIO 61#define SCREEN_WIDTH 960#define SCREEN_HEIGHT 768//按键 上、下、左、右 控制方向 ,‘q’退出#define KEY_UP 'w' //char'a'#define KEY_LEFT'a'#define KEY_RIGHT'd'#define KEY_DOWN's'#define KEY_QUIT'q' #define LINE 9#define COLUMN 12#define START_X 100 //图片显示偏移量#define START_Y 150enum _PROPS {WALL,//墙FLOOR,//地板BOX_DES,//箱子目的地MAN,//小人BOX,//箱子HIT,//箱子命中目标ALL};//游戏控制方向enum _DIRECTION{UP,DOWN,LEFT,RIGHT};struct _POS {int x;//小人所在二维数组的行int y;//小人所在二维数组的列};IMAGE images[ALL];struct _POS man;//小人所在二维数组中的位置/*游戏地图*/int map[LINE][COLUMN] ={{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },{ 0, 1, 4, 1, 0, 2, 1, 0, 2, 1, 1, 0 },{ 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0 },{ 0, 1, 0, 2, 0, 1, 1, 4, 1, 1, 1, 0 },{ 0, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 0 },{ 0, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 0 },{ 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },};/****************************************************改变游戏视图中一格对应道具并重新显示*输入:*line - 道具在地图数组的行下标*column- - 道具在地图数组的列下标*prop - 道具的类型*返回值:无***************************************************/void changeMap(int line, int column, enum _PROPS prop) {map[line][column] = prop;putimage(START_X + column * RATIO, START_Y + line * RATIO, &images[prop]);}/***************************************************实现游戏四个方向(上、下、左、右)的控制*输入:* direct - 人前进方向* 输出:无***************************************************/void gameControl(enum _DIRECTION direct) {int x = man.x;int y = man.y;if (direct = UP) {//先处理前进方向是地板的情况if ((x - 1) >= 0 && map[x - 1][y] == FLOOR) {changeMap(x - 1, y, MAN);//小人的前进一格man.x = x - 1;changeMap(x, y, FLOOR);}}else if (direct == DOWN) {if ((x + 1) < LINE && map[x + 1][y] == FLOOR) {changeMap(x + 1, y, MAN);//小人的前进一格man.x = x + 1;changeMap(x, y, FLOOR);}}else if (direct == LEFT) {if ((y - 1) >= 0 && map[x][y - 1] == FLOOR) {changeMap(x, y - 1, MAN);//小人的前进一格man.y = y - 1;changeMap(x, y, FLOOR);}}else if (direct == RIGHT) {if ((y + 1) < COLUMN && map[x][y + 1] == FLOOR) {changeMap(x, y + 1, MAN);//小人的前进一格man.y = y + 1;changeMap(x, y, FLOOR);}}}int main(void) {IMAGE bg_img;//游戏背景的初始化就像,搭台唱戏唱戏一样initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);loadimage(&bg_img, _T("blackground.bmp"), SCREEN_WIDTH, SCREEN_HEIGHT, true);putimage(0, 0, &bg_img);//加载道具图标loadimage(&images[WALL], _T("wall.bmp"), RATIO, RATIO, true);loadimage(&images[FLOOR], _T("floor.bmp"), RATIO, RATIO, true);loadimage(&images[BOX_DES], _T("des.bmp"), RATIO, RATIO, true);loadimage(&images[MAN], _T("man.bmp"), RATIO, RATIO, true);loadimage(&images[BOX], _T("box.bmp"), RATIO, RATIO, true);loadimage(&images[HIT], _T("box.bmp"), RATIO, RATIO, true);for (int i = 0; i < LINE; i++) {for (int j = 0; j < COLUMN; j++) {if (map[i][j] == MAN) {man.x = i;man.y = j;}//显示道具puimage(图片左上角的位置坐标显示在窗口的位置,数组的地址putimage(START_X + j * RATIO, START_Y + i * RATIO, &images[map[i][j]]);}}//游戏环节bool quit = false;do {if (_kbhit()) {//玩家按键char ch = _getch();if (ch == KEY_UP) {gameControl(UP);}else if (ch == KEY_DOWN) {gameControl(DOWN);}else if (ch == KEY_LEFT) {gameControl(LEFT);}else if (ch == KEY_RIGHT) {gameControl(RIGHT);}else if (ch == KEY_QUIT) {quit = true;}}Sleep(100); //休眠100ms ,100毫秒0.1秒} while (quit = false); //!quitsystem("pause");return 0; //奇牛学院}
需要技术支持的小伙伴可以加我主页群~
关注我!带你遨游代码的世界!