简单的推箱子游戏实战

目录

项目分析

 地图初始化

背景图片

游戏场景图片:

热键控制

 按键设置

确定人物位置

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

推箱子控制

游戏结束

最终代码

合法性判断:


项目分析

墙: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.hqwc.cn/news/341970.html

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

相关文章

我用 Laf 开发了一个非常好用的密码管理工具

【KeePass 密码管理】是一款简单、安全简洁的账号密码管理工具&#xff0c;服务端使用 Laf 云开发&#xff0c;支持指纹验证、FaceID&#xff0c;N 重安全保障&#xff0c;可以随时随地记录我的账号和密码。 写这个小程序之前&#xff0c;在国内市场找了很多密码存储类的 App …

2024 年 1 月安全更新修补了 58 个漏洞(Android )

谷歌发布了针对 Android 平台 58 个漏洞的补丁&#xff0c;并修复了 Pixel 设备中的 3 个安全漏洞&#xff0c;拉开了 2024 年的序幕。 Android 2024 年 1 月更新的第一部分以 2024 年 1 月 1 日安全补丁级别发布在设备上&#xff0c;解决了框架和系统组件中的 10 个安全漏洞&…

微信小程序开发学习笔记《8》tabBar

微信小程序开发学习笔记《8》tabBar 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。tabBar官方文档 tabBar这一节还是相当重要的。 一、什么是tabBar tabBar是移动端应用常见的页面效果&#xff0c;用于实现多页面的快速切换。小…

【【深入浅出了解静态时钟分析和时钟约束】】

深入浅出了解静态时钟分析和时钟约束 时序分析是什么&#xff1f; 我们提出一些特定的时序要求&#xff08;或者说是添加特定的时序约束&#xff09;&#xff0c;使用特定的时序模型&#xff0c;针对特定的电路进行分析。分析的最终结果是要求系统时序满足我们提出的要求。 这…

干货分享|Samba用户管理详解

一、Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议&#xff0c;它为局域网内的不同计算机…

ELF解析03 - 加载段

本文主要讨论 mmap 函数以及如何使用 mmap 函数来加载一个 ELF 的可加载段。 01纠错 Android 8 及以后是会读取 section header 的&#xff0c;但不是所有的 section 都会读取。 https://cs.android.com/android/platform/superproject/main//main:bionic/linker/linker_phdr…

City Terrace Pack

“城市与露台资源包” 的主要特点:• 属于系列的一部分。• 极为逼真和现代化的城市。• 高度优化的低多边形和逼真资源。• 可用于 Oculus、GearVR、Vive、Daydream。• 可用于低端和高端移动设备。• 灵感来自于现代建筑和设计。• 36 种不同的摩天大楼和建筑物。• 其中每个…

易安联参与制定的《面向云计算的零信任体系》行业标准即将实施

中华人民共和国工业和信息化部公告2023年第38号文件正式发布行业标准&#xff1a;YD/T 4598.2-2023《面向云计算的零信任体系 第2部分&#xff1a;关键能力要求》及YD/T 4598.3-2023《面向云计算的零信任体系 第3部分&#xff1a;安全访问服务边缘能力要求》&#xff0c;并于20…

基于pytorch的循环神经网络情感分析系统

任务目标 基于给定数据集&#xff0c;进行数据预处理&#xff0c;搭建以LSTM为基本单元的模型&#xff0c;以Adam优化器对模型进行训练&#xff0c;使用训练后的模型进行预测并计算预测分类的准确率。 数据简介 IMDB数据集是一个对电影评论标注为正向评论与负向评论的数据集…

专业130+总400+哈尔滨工业大学803信号与系统和数字逻辑电路考研经验哈工大,电子信息,信息与通信工程,信通

今年专业课803信号与系统和数字逻辑130总分400如愿考上哈尔滨工业大学电子信息&#xff08;信息与通信工程-信通&#xff09;&#xff0c;总结了一些各门课程复习心得&#xff0c;希望对大家复习有帮助。 数学一 资料选择&#xff1a; ①高数&#xff1a;张宇强化班 ②线性…

TMC2226步进电机驱动---学习记录

基于TMC2226数据手册的学习 主要内容介绍&#xff1a; Package Outline TMC2226 手册中引脚解释&#xff08;按照手册表格顺序&#xff09; 了解每个引脚是接什么的&#xff0c;之后看原理图 &#xff08;借用立创广场kirito的原理图&#xff0c;后期换个&#xff09; 以前的疑…

GPT function calling v2

原文&#xff1a;GPT function calling v2 - 知乎 OpenAI在2023年11月10号举行了第一次开发者大会&#xff08;OpenAI DevDays&#xff09;&#xff0c;其中介绍了很多新奇有趣的新功能和新应用&#xff0c;而且更新了一波GPT的API&#xff0c;在1.0版本后的API调用与之前的0.…