简单的推箱子游戏实战

目录

项目分析

 地图初始化

背景图片

游戏场景图片:

热键控制

 按键设置

确定人物位置

实现人物移动(非箱子,目的地)

推箱子控制

游戏结束

最终代码

合法性判断:


项目分析

墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5

 地图初始化

背景图片

#include <iostream>
#include <graphics.h>
#include <MMsystem.h>
#include <Windows.h>using namespace std;
IMAGE BG_IMAGE;
#define WIDE  650
#define HEITH 650
//设置窗口初始化,背景
void initGraph() {initgraph(WIDE, HEITH);loadimage(&BG_IMAGE, "推箱子图片素材/blackground.bmp", WIDE, HEITH,true);//设置图片为窗口大小putimage(0, 0, &BG_IMAGE);
}int main(void) {initGraph();system("pause");//设置初始化的屏幕不一闪而逝return 0;
}

游戏场景图片:

#define MAP_WIDE   50  //方块宽
#define MAP_HEIGTH 50  //方块高
#define MAP_ROWS   9   //数组行数
#define MAP_COLS   12  //数组列数
#define RADIO      50  //每行乘这个比例就加载一个图片
#define MAP_X      100 //图片开始地方偏移量x
#define MAP_Y      100 //图片开始地方偏移量y
enum MyEnum{wall,  //墙Floor, //地板des,   //目的地man,   //小人box,   //箱子hit,   //命中all    //用来表示图片数组的大小
};
IMAGE MAP_IMAGE[all];//场景图片
void map() {int a[9][12] = {{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,0,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,0,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},};//墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5loadimage(&MAP_IMAGE[wall], "推箱子图片素材/wall_right.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[Floor], "推箱子图片素材/floor.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[des], "推箱子图片素材/des.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[man], "推箱子图片素材/man.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[box], "推箱子图片素材/box.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[hit], "推箱子图片素材/box.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);for (int i = 0; i < MAP_ROWS; i++){for (int j = 0; j < MAP_COLS; j++) {putimage( MAP_X + j*RADIO, MAP_Y + i*RADIO, &MAP_IMAGE[a[i][j]]);}}
}

热键控制

 按键设置

但是一直执行循环块很占用CPU,消耗很大很严重资源(使用sleep(),在用户没有按键的时候,CPU休息)

#define KEY_UP		'w'
#define KEY_DOWN	's'
#define KEY_LEFT	'a'
#define KEY_RIGHT	'r'
#define KEY_QUIT	'q'
#include <conio.h>
void control() {bool quit = false;do{if (_kbhit()) {//判断用户是否按键char ch = _getch();//直接从键盘获取字符,不经过输入缓冲区if (ch == KEY_UP) {//get_control(KEY_UP);}else if (ch == KEY_DOWN) {//get_control(KEY_DOWN);}else if (ch == KEY_LEFT) {//get_control(KEY_LEFT);}else if (ch == KEY_RIGHT) {//get_control(KEY_RIGHT);}else if (ch == KEY_QUIT) {quit = true;}}Sleep(50);//在用户没有按键的时候,CPU休息)} while (quit ==false);
}

确定人物位置

//实现人物行动
enum MyEnum1 {UP,DOWN,RIGHT,LEFT
};
struct position {int x;int y;
};
typedef enum MyEnum1 keybord;
typedef struct position pos;
pos MAN;
void get_control(keybord control) {pos next_pos, next_next_pos;switch (control) {case UP:next_pos.x = MAN.x - 1;next_next_pos.x = MAN.x - 2;break;case DOWN:next_pos.x = MAN.x + 1;next_next_pos.x = MAN.x + 2;break;case LEFT:next_pos.y = MAN.y - 1;next_next_pos.y = MAN.y - 2;break;case RIGHT:next_pos.y = MAN.y + 1;next_next_pos.y = MAN.y + 2;break;}}
//void map()函数内需要添加/*if (a[i][j] == man) {//记录小人的初始位置MAN.x = i;MAN.y = j;
}*/

实现人物移动(非箱子,目的地)

//实现小人移动
void mapChange(pos* pos, enum MyEnum prop) {a[pos->x][pos->y] = prop;putimage(MAP_X + pos->y * RADIO, MAP_Y + pos->x * RADIO, &MAP_IMAGE[prop]);
}//在void get_control(keybord control)/*//小人前面如果是地板,人就前进一步,站到next_pos的位置
if (a[next_pos.x][next_pos.y] == Floor) {mapChange(&next_pos, man);mapChange(&MAN, Floor);MAN = next_pos;
}*/

推箱子控制

//人前进一步是箱子则判断箱子前的道具,即next_next_pos,如果是地板和箱子目的地,推着箱子走
if (a[next_pos.x][next_pos.y] == box) {//下下个是地板if (a[next_next_pos.x][next_next_pos.y] == Floor) {mapChange(&next_next_pos, box);mapChange(&next_pos, man);mapChange(&MAN, Floor);MAN = next_pos;//下下个是目的地}else if (a[next_next_pos.x][next_next_pos.y] == des) {mapChange(&next_next_pos, hit);mapChange(&next_pos, man);mapChange(&MAN, Floor);MAN = next_pos;}
}

游戏结束

bool gameOver() {for (int i = 0; i < MAP_ROWS; i++) {for (int j = 0; j < MAP_COLS; j++) {if (a[i][j]==des) {return false;}}}return true;
}
void gameOverScien() {putimage(0, 0, &BG_IMAGE);settextcolor(RGB(255, 255, 0));settextstyle(90, 0, "微软雅黑");//这里可能会有字符集的问题,上上篇发过解决方法rectangle(300, 297, 570, 300);//设置矩形框outtextxy(300, 300, "游戏结束");;//添加文字}

最终代码

#include <iostream>
#include <graphics.h>
#include <MMsystem.h>
#include <Windows.h>
#include <conio.h>using namespace std;
IMAGE BG_IMAGE;
#define WIDE  800
#define HEITH 650//按键
#define KEY_UP		'w'
#define KEY_DOWN	's'
#define KEY_LEFT	'a'
#define KEY_RIGHT	'd'
#define KEY_QUIT	'q'//end按键
//实现人物行动
enum MyEnum1 {UP,DOWN,RIGHT,LEFT
};
struct position {int x;int y;
};
typedef enum MyEnum1 keybord;
typedef struct position pos;
pos MAN;//end 人物移动
int a[9][12] = {{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,0,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,0,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},
};
//道具
#define MAP_WIDE   50  //方块宽
#define MAP_HEIGTH 50  //方块高
#define MAP_ROWS   9   //数组行数
#define MAP_COLS   12  //数组列数
#define RADIO      50  //每行乘这个比例就加载一个图片
#define MAP_X      100 //图片开始地方偏移量x
#define MAP_Y      100 //图片开始地方偏移量y
enum MyEnum {wall,  //墙Floor, //地板des,   //目的地man,   //小人box,   //箱子hit,   //命中all    //用来表示图片数组的大小
};
IMAGE MAP_IMAGE[all];//场景图片
//end 道具//设置窗口初始化,背景
void initGraph() {initgraph(WIDE, HEITH);loadimage(&BG_IMAGE, "推箱子图片素材/blackground.bmp", WIDE, HEITH, true);//设置图片为窗口大小putimage(0, 0, &BG_IMAGE);
}void map() {//墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5loadimage(&MAP_IMAGE[wall], "推箱子图片素材/wall_right.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[Floor], "推箱子图片素材/floor.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[des], "推箱子图片素材/des.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[man], "推箱子图片素材/man.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[box], "推箱子图片素材/box.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);loadimage(&MAP_IMAGE[hit], "推箱子图片素材/box.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);for (int i = 0; i < MAP_ROWS; i++) {for (int j = 0; j < MAP_COLS; j++) {if (a[i][j] == man) {//记录小人的初始位置MAN.x = i;MAN.y = j;}putimage(MAP_X + j * RADIO, MAP_Y + i * RADIO, &MAP_IMAGE[a[i][j]]);}}
}
//实现小人移动
void mapChange(pos* pos, enum MyEnum prop) {a[pos->x][pos->y] = prop;putimage(MAP_X + pos->y * RADIO, MAP_Y + pos->x * RADIO, &MAP_IMAGE[prop]);
}
void get_control(keybord control) {pos next_pos = MAN, next_next_pos=MAN;switch (control) {case UP:next_pos.x = MAN.x - 1;next_next_pos.x = MAN.x - 2;break;case DOWN:next_pos.x = MAN.x + 1;next_next_pos.x = MAN.x + 2;break;case LEFT:next_pos.y = MAN.y - 1;next_next_pos.y = MAN.y - 2;break;case RIGHT:next_pos.y = MAN.y + 1;next_next_pos.y = MAN.y + 2;break;}//小人前面如果是地板,人就前进一步,站到next_pos的位置if (a[next_pos.x][next_pos.y] == Floor) {//做合法性判断mapChange(&next_pos, man);mapChange(&MAN, Floor);MAN = next_pos;}//人前进一步是箱子则判断箱子前的道具,即next_next_pos,如果是地板和箱子目的地,推着箱子走if (a[next_pos.x][next_pos.y] == box) {//下下个是地板if (a[next_next_pos.x][next_next_pos.y] == Floor) {mapChange(&next_next_pos, box);mapChange(&next_pos, man);mapChange(&MAN, Floor);MAN = next_pos;//下下个是目的地}else if (a[next_next_pos.x][next_next_pos.y] == des) {mapChange(&next_next_pos, hit);mapChange(&next_pos, man);mapChange(&MAN, Floor);MAN = next_pos;}}}
bool gameOver() {for (int i = 0; i < MAP_ROWS; i++) {for (int j = 0; j < MAP_COLS; j++) {if (a[i][j]==des) {return false;}}}return true;
}
void gameOverScien() {putimage(0, 0, &BG_IMAGE);settextcolor(RGB(255, 255, 0));settextstyle(90, 0, "微软雅黑");//这里可能会有字符集的问题,上上篇发过解决方法rectangle(300, 297, 570, 300);//设置矩形框outtextxy(300, 300, "游戏结束");;//添加文字}
void control() {bool quit = false;do{if (_kbhit()) {//判断用户是否按键char ch = _getch();//直接从键盘获取字符,不经过输入缓冲区if (ch == KEY_UP) {get_control(UP);}else if (ch == KEY_DOWN) {get_control(DOWN);}else if (ch == KEY_LEFT) {get_control(LEFT);}else if (ch == KEY_RIGHT) {get_control(RIGHT);}else if (ch == KEY_QUIT) {quit = true;}if (gameOver()) {gameOverScien();}}Sleep(50);} while (quit ==false);
}
int main(void) {//初始化initGraph();//加载场景图片map();//实现热键控制人物control();system("pause");//设置初始化的屏幕不一闪而逝return 0;
}

合法性判断:

#define isValues(pos) (pos.x>=0 &&pos.x<MAP_COLS &&pos.y>=0&&pos.y<MAP_ROWS)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SkyEye仿真飞腾处理器:运行U-Boot并加载Phytium-FreeRTOS

仿真平台在帮助提升研发效率、加快产品面市时间上的作用已得到诸多验证&#xff0c;通过对处理器进行仿真来支持嵌入式系统及软件的虚拟化开发、测试和验证成为目前应用较为广泛的方法。天目全数字实时仿真软件SkyEye是一款基于可视化建模的硬件行为级仿真平台&#xff0c;在众…

leetcode:1736. 替换隐藏数字得到的最晚时间(python3解法)

难度&#xff1a;简单 给你一个字符串 time &#xff0c;格式为 hh:mm&#xff08;小时&#xff1a;分钟&#xff09;&#xff0c;其中某几位数字被隐藏&#xff08;用 ? 表示&#xff09;。 有效的时间为 00:00 到 23:59 之间的所有时间&#xff0c;包括 00:00 和 23:59 。 …

selenium处理下拉框

当想要爬取的数据由下拉框来选择时&#xff0c;应该如何处理&#xff1f; 页面如下&#xff1a; 目的获得电影的详细信息&#xff0c;包括票房&#xff0c;上映日期等。 代码如下&#xff1a; from selenium import webdriver from selenium.webdriver.support.select impor…

C语言——大头记单词

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 每一发奋努力的背后&#xff0c;必有加…

Ubuntu18.04在线镜像仓库配置

在线镜像仓库 1、查操作系统版本 rootubuntu:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 2、原文件备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 3、查…

【开源】基于JAVA语言的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

零售EDI:Babylist EDI 项目案例

Babylist 与各种不同的品牌和零售商合作&#xff0c;包括婴儿用品、玩具、衣物和其他相关产品的制造商。用户可以在 Babylist 上浏览各种不同的产品&#xff0c;并根据自己的需求和喜好选择适合的项目。本文将为大家介绍对接Babylist 的EDI项目案例。 Babylist EDI 需求 传输协…

linux文件比较工具diff-关于参数-pN的设置方法

非纯文本文件比较可用cmp命令 第一&#xff1a;利用diff创建分析文件&#xff0c;处理补丁&#xff08;patch&#xff09;功能的文件 案例&#xff1a;多数用于同一软件的不同版本之间&#xff0c;比如比较配置文件和源文件的区别&#xff0c;生成补丁文件&#xff0c;执行更…

Midjourney网页版

引言 基于国外的api开发开发了一款网页版的midjourney&#xff0c;文末有链接 相关资源 Midjourney官方教学资料Midjourney官网discord官网B站学习资源推荐 账号注册 获取网络访问权限 使用Midjourney的前提是计算机有外网访问权限 此处推荐两款软件,lantern的优势是免费&…

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章&#xff1a;jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master&#xff1a;https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp&#xff0c;…

LLM之LangChain(二)| LangChain中的Agent

在本文中&#xff0c;我们将讨论LangChain中的Agent及其各种类型。但在深入研究Agent之前&#xff0c;让我们先了解一下什么是LangChain和Agent。 一、什么是LangChain&#xff1f; LangChain是一种功能强大的自动化工具&#xff0c;可用于各种任务&#xff0c;它提供了可用于…

Cobalt: 我愿称之为IDEA最美配色☕️

先来个预览&#xff1a; Cobalt是为IntelliJ IDEA和Java语言优化的一个配色主题&#xff0c;以现代和科技感的蓝色为主。题主相信哪怕是一个简单的主题配色&#xff0c;都是可以给开发者们带来更有生产力、更舒适的创作心境。希望你会喜欢&#xff01; 另外Cobalt这个名字取自…

【开源】基于JAVA的教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

04章【面向对象(上)】

文章目录 面向对象基本概念类与对象类和对象的定义格式对象与内存分析封装性构造方法this关键字值传递与引用传递对象的一对一关系static关键字main方法分析代码块单例设计模式对象数组与管理 面向对象基本概念 什么是面向对象&#xff1a; 面向对象是一种编程思想。面向对象…

经典ABR算法介绍:Pensieve (SIGCOMM ‘17) 原理及训练指南

文章目录 前言Pensieve原理*Pensieve重训练参考Oboe [SIGCOMM 18]Comyco [MM 19]Fugu [NSDI 20] A3C熵权重衰减思路实现 前言 Pensieve是DASH点播视频中最经典的ABR算法之一&#xff0c;也是机器学习类&#xff08;Learning-based&#xff09;ABR算法的代表性工作。Pensieve基…

母婴品牌找小红书达人卖货怎么做?

小红书母婴种草推广&#xff0c;就是品牌方找小红书上的达人进行产品体验和内容分享&#xff0c;从而达到卖货的目的&#xff0c;软广形式更容易被大众所接受&#xff0c;而且小红书平台上的宝妈用户群体都是有一定消费水平的一二线城市用户&#xff0c;所以这样就会形成一套完…

十一、常用API——正则表达式

目录 练习1&#xff1a; 正则表达式的作用 正则表达式 字符类&#xff08;只匹配一个字符&#xff09; 预定义字符&#xff08;只匹配一个字符&#xff09; 数量词 类 Pattern 正则表达式的构造摘要 反斜线、转义和引用 字符类 行结束符 组和捕获 Unicode 支持 与…

第3章 无监督学习与预处理

目录 1. 无监督学习的类型2. 无监督学习的挑战3. 预处理与缩放3.1 不同类型的预处理3.2 应用数据变换3.3 对训练数据和测试数据进行相同的缩放快捷方式与高效的替代方法 3.4 预处理对监督学习的作用 4. 降维、特征提取与流形学习4.1 主成分分析&#xff08;PCA&#xff09;4.1.…

大数据StarRocks(八):集群扩缩容

一、FE扩缩容 StarRocks FE 节点分为 Follower 节点和 Observer 节点。Follower 节点参与选举投票和写入&#xff0c;Observer 节点只用来同步日志&#xff0c;扩展读性能。 注意&#xff1a; 所有 FE 节点的 http_port 必须相同。Follower FE 节点&#xff08;包括 Leader …

Vue Axios——前端技术栈

文章目录 基本介绍Vue是什么&#xff1f; MVVMVue的使用快速入门注意事项和使用细节 Vue 数据绑定机制分析数据单向渲染注意事项和细节 双向数据绑定事件绑定示例&#xff1a;注意事项和使用细节课后作业1课后作业2 修饰符示例 条件渲染/控制: v-if v-showv-if VS v-show课后作…