推箱子如何实现悔步_「C/C++项目练手」有手就很学会之推箱子教程

经典的推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

下面就让小编带你一步一步完成属于自己的推箱子游戏~

推箱子游戏的实现

开发环境的搭建

  • 因为我的这里使用的是vs2019所以就用2019来演示
  • 首先百度首页搜索easyx
  • 找到官网(嫌麻烦的小伙伴,也可以进我主页群,群文件里有相关素材)
5e1e22d25361a0add4269417af0e59d9.png
f232447887597bf56a51acee8c170328.png
a52431bb7f6e8989503dd04a9cb90bd3.png
7ae9ba80b726edd4daa3954ce54680e7.png
下载好之后直接打开安装就可以了对照自己的版本直接安装就可以了
ea983ee4d8219eda3de6529b5e6e4a84.png
这样开发环境就搭建好了

游戏实现

4622e2844b2958656f689e4034dc21f3.png

温馨提示
需要添加头文件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;   //奇牛学院}

需要技术支持的小伙伴可以加我主页群~

关注我!带你遨游代码的世界!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值