当前位置: 首页 > news >正文

C++推箱子游戏开发

游戏

  • 自动地图生成
  • 背景音乐
  • 推箱子到目标位置

美工资源

美工资源:

链接:https://pan.baidu.com/s/1MZv8pDBXdNDbXxuAAPSM-A **提取码:**2syq

图形库: www.easyx.cn

cpp文件

#include "box_man.h"
#include <conio.h>
#include <graphics.h>
#include <iostream>
#include <stdlib.h>
#include <string>#include <Windows.h>
#include <mmsystem.h>
#include <dsound.h>
#pragma comment(lib, "WINMM.LIB")using namespace std;IMAGE images[ALL];struct _POS man; /* 小人在二维数组的位置 */int map[LINE][COLUMN] =
{{1,	1,	1,  1,  1,  1,  1,  1,  1,  1,  1,  1},{1,	1,	1,  1,  1,  1,  1,  1,  1,  1,  1,  1},{1,	1,	1,  1,  1,  1,  1,  1,  1,  1,  1,  1},{1,	1,	1,  1,  1,  1,  1,  1,  1,  1,  1,  1},{1,	1,	1,  1,  1,  1,  1,  1,  1,  1,  1,  1},{1,	1,	1,  1,  1,  1,  1,  1,  1,  1,  1,  1},{1,	1,	1,  1,  1,  1,  1,  1,  1,  1,  1,  1},{1,	1,	1,  1,  1,  1,  1,  1,  1,  1,  1,  1},{1,	1,	1,  1,  1,  1,  1,  1,  1,  1,  1,  1},
};/*****************************************************
* 判断游戏是否结束, 如果不存在任何一个箱子目的地, 就代表游戏结束
* 输入: 无
* 返回值:
*		true - 游戏结束 false - 游戏继续
*****************************************************/
bool isGameOver()
{for (int i = 0; i < LINE; i++){for (int j = 0; j < COLUMN; j++){if (map[i][j] == BOX_DES){return false;}}}return true;
}/***************************************************
* 功能: 游戏结束场景, 在玩家通过后显示
* 输入:
*	  bg - 背景图片变量的指针
* 返回值: 无
***************************************************/
void gameOverScene(IMAGE* bg)
{putimage(0, 0, bg);settextcolor(WHITE);RECT rec = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };settextstyle(20, 0, _T("宋体"));drawtext(_T("恭喜你, 通关了!!!"), &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}/*************************************************
* 功能: 改变游戏地图视图中一格对应的道具并重新显示
* 输入:
*	   pos - 道具在地图数组的行列下标
*	   prop - 道具的类型
* 返回值: 无
*************************************************/
void changeMap(POS* pos, PROPS prop)
{map[pos->x][pos->y] = prop;putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);
}/**********************************************
* 功能: 实现游戏四个方向 (上, 下, 左, 右) 的控制
* 输入:
*     direct - 人前进的方向
* 输出: 无
**********************************************/
void gameControl(DIRECTION direct)
{POS next_pos = man; /* man 类型(结构体) 与 next_pos 相同 */POS next_next_pos = man;switch (direct){case UP:next_pos.x--;next_next_pos.x -= 2;break;case DOWN:next_pos.x++;next_next_pos.x += 2;break;case LEFT:next_pos.y--;next_next_pos.y -= 2;break;case RIGHT:next_pos.y++;next_next_pos.y += 2;break;}/* 宏展开 next_pos.x >= 0 && next_pos.x < LINE && next_pos.y >= 0 && next_pos.y < COLUMN */if (isValid(next_pos) && map[next_pos.x][next_pos.y] == FLOOR) /* 人的前方是地板 */{changeMap(&next_pos, MAN);changeMap(&man, FLOOR);man = next_pos;}else if (isValid(next_next_pos) && map[next_pos.x][next_pos.y] == BOX){if (map[next_next_pos.x][next_next_pos.y] == FLOOR){changeMap(&next_next_pos, BOX);changeMap(&next_pos, MAN); /* 小人前进一格 */changeMap(&man, FLOOR);man = next_pos;}else if (map[next_next_pos.x][next_next_pos.y] == BOX_DES){changeMap(&next_next_pos, HIT);changeMap(&next_pos, MAN);changeMap(&man, FLOOR);man = next_pos;}}
}int main(void)
{IMAGE bg_img;/* 搭台 */initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);loadimage(&bg_img, _T("blackground.bmp"), SCREEN_WIDTH, SCREEN_HEIGHT);putimage(0, 0, &bg_img);//播放音乐mciSendString(TEXT("open mp3.wma alias mysong"), NULL, 0, NULL); //load音乐mciSendString(TEXT("play mysong repeat"), NULL, 0, NULL);//打开报警音//mciSendString(TEXT("close mysong"), NULL, 0, NULL);//关闭报警音/* 加载道具 */loadimage(&images[WALL], _T("wall_right.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);// 随机地图int arrFree[LINE - 2][COLUMN - 2];int* p = &arrFree[0][0];for (int i = 0;i < (LINE - 2) * (COLUMN - 2);i++) {p[i] = 1;}int z[19];srand((unsigned)time(NULL));for (int i = 0;i < 19; i++) {SJS:z[i] = rand() % ((LINE - 2) * (COLUMN - 2));for (int j=0;j<i;j++){if (z[i] == z[j]) {goto SJS;}}}p[z[0]] = 3;p[z[1]] = 2;p[z[2]] = 2;p[z[3]] = 2;p[z[4]] = 2;p[z[5]] = 4;p[z[6]] = 4;p[z[7]] = 4;p[z[8]] = 4;for (int i = 9;i < 19;i++ ) {*(p + z[i]) = 0;}for (int i = 1; i < LINE-1; i++){for (int j = 1; j < COLUMN -1; j++){map[i][j] = arrFree[i - 1][j - 1];}}// 绘制地图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;}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;}if (isGameOver()){gameOverScene(&bg_img);quit = true;}}Sleep(100);} while (quit == false);::system("pause");closegraph();return 0;
}

h文件

#pragma once#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 650#define RATIO 50/* 控制键 上 下 左 右 控制方向 */
#define KEY_UP    72
#define KEY_LEFT  75
#define KEY_RIGHT 77
#define KEY_DOWN  80
#define KEY_QUIT  'q'#define LINE 9
#define COLUMN 12#define START_X 100
#define START_Y 100enum _PROPS  /* 道具 */
{WALL,    /* 墙 */FLOOR,   /* 地板 */BOX_DES, /* 箱子的目地 */MAN,     /* 小人 */BOX,     /* 箱子 */HIT,     /* 箱子命中目标 */ALL
};/* 游戏控制方向 */
enum _DIRECTION
{UP,DOWN,LEFT,RIGHT
};struct _POS /* 位置 */
{int x;  /* 小人所在二维数组的行 */int y;  /* 小人所在二维数据在列 */
};typedef enum _PROPS PROPS;         /* 道具 */
typedef enum _DIRECTION DIRECTION; /* 控制方向 */
typedef struct _POS POS;           /* 道具的位置 */#define isValid(pos) pos.x>=0 && pos.x<LINE && pos.y>=0 && pos.y < COLUMN

相关文章:

C++推箱子游戏开发

游戏 自动地图生成背景音乐推箱子到目标位置 美工资源 美工资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MZv8pDBXdNDbXxuAAPSM-A **提取码&#xff1a;**2syq 图形库: www.easyx.cn cpp文件 #include "box_man.h" #include <conio.h> #…...

Kotlin函数式接口

函数式接口 接口只有一个抽象方法的接口&#xff0c;称为 函数式接口 functional interface&#xff0c;也叫做 Single Abstract Method(SAM) interface。 注&#xff1a;函数式接口&#xff0c;只有一个抽象方法&#xff0c;但可以有多个非抽象方法。 一、Kotlin Kotlin支持…...

2024年1月9日学习总结

目录 学习目标学习内容联邦学习基础&#xff1a;why, what, howwhy&#xff1f;what&#xff1f;how&#xff1f; 联邦学习的例子——CIFAR-10数据集&#xff08;分类问题&#xff09;1、import libararies2、hyper-parameters3、加载并且划分数据4、创建神经网络模型5、helper…...

Nacos使用MySQL8时区问题导致启动失败

文章目录 配置下mysql的时区方式一 (永久)方式二&#xff08;临时&#xff09; 由于mysql8需要配置时区&#xff0c;如果不配置时区&#xff0c;nacos就连不上mysql&#xff0c;从而也就无法登录nacos自带的图形化界面 配置下mysql的时区 方式一 (永久) 直接修改配置文件&…...

在k8s集群中部署多nginx-ingress

关于ingress的介绍&#xff0c;前面已经详细讲过了&#xff0c;参考ingress-nginx详解和部署方案。本案例ingress的部署使用deploymentLB的方式。 参考链接&#xff1a; 多个ingress部署 文章目录 1. 下载ingress的文件2. 文件资源分析3. 部署ingress3.1 部署第一套ingress3.1…...

SLF4J Spring Boot日志框架

JAVA日志框架 JAVA有好多优秀的日志框架&#xff0c;比如log4j、log4j2、logback、JUL&#xff08;java.util.logging&#xff09;、JCL&#xff08;JAVA Common Logging&#xff09;等等&#xff0c;logback是后起之秀&#xff0c;是Spring Boot默认日志框架。 今天文章的目…...

mysql之导入导出远程备份

文章目录 一、navicat导入导出二、mysqldump命令导入导出2.1导出2.1.1 导出表数据和表结构2.1.2 只导出表结构() 2.2 导入(使用mysqldump导入 包含t _log表的整个数据库 共耗时 20s;)方法一&#xff1a;方法二&#xff1a; 三、LOAD DATA INFILE命令导入导出(只针对单表)设置导…...

Java虚拟机ART 读书笔记 第2章 深入理解Class文件格式

GitHub - Omooo/Android-Notes: ✨✨✨这有一包小鱼干&#xff0c;确定不要吃嘛&#xff1f;( 逃 深入理解Android&#xff1a;Java虚拟机ART 读书笔记 以下内容均来自书中内容 建议看原书哦 第2章 深入理解Class文件格式 2.1 class文件总览 Class文件格式全貌 u4&#xff…...

编程基础 - 初识Linux

编程基础 - 初识Linux 返回序言及专栏目录 文章目录 编程基础 - 初识Linux前言一、Linux发展简介二、现代Linux三、Linux系统各发行版小结 前言 为什么要学习Linux呢&#xff1f;我这Windows用得好好的&#xff0c;简单易用傻瓜式、用的人还超多&#xff01;但是我要告诉你的…...

c yuv422转yuv420p

思路&#xff1a; yuv422 存储格式为 y u y v y u y v y u y v y u y v yuv420p 存储最简单&#xff0c;先存所以的y&#xff0c;再存u&#xff0c;最后v 所以先把422所有的y存在一起&#xff0c;再提奇数行的u &#xff0c;偶数行舍弃。提…...

计算机网络 - 路由器查表过程模拟 C++(2024)

1.题目描述 参考计算机网络教材 140 页 4.3 节内容&#xff0c;编程模拟路由器查找路由表的过程&#xff0c;用&#xff08;目的地址 掩码 下一跳&#xff09; 的 IP 路由表以及目的地址作为输入&#xff0c;为目的地址查找路由表&#xff0c;找出正确的下一跳并输出结果。 1.…...

实现pytorch版的mobileNetV1

mobileNet具体细节&#xff0c;在前面已做了分析记录&#xff1a;轻量化网络-MobileNet系列-CSDN博客 这里是根据网络结构&#xff0c;搭建模型&#xff0c;用于图像分类任务。 1. 网络结构和基本组件 2. 搭建组件 &#xff08;1&#xff09;普通的卷积组件&#xff1a;CBL …...

vue多tab页面全部关闭后自动退出登录

业务场景&#xff1a;主项目是用vue写的单页面应用&#xff0c;但是有多开页面的需求&#xff0c;现在需要在用户关闭了所有的浏览器标签页面后&#xff0c;自动退出登录。 思路&#xff1a;因为是不同的tab页面&#xff0c;我只能用localStorage来通信&#xff0c;新打开一个…...

记一个集群环境部署不完整导致的BUG

一 背景 产品有三个环境&#xff1a;开发测试环境、验收环境、生产环境。 开发测试环境&#xff0c;保持最新的更新&#xff1b; 验收环境&#xff0c;阶段待发布内容&#xff1b; 生产环境&#xff0c;部署稳定内容。 产品为BS架构&#xff0c;后端采用微服务&#xf…...

Go zero copy,复制文件

这里使用零拷贝技术复制文件&#xff0c;从内核态操作源文件和目标文件。避免了在用户态开辟缓冲区&#xff0c;然后从内核态复制文件到用户态的问题。 由内核态完成文件复制操作。 调用的是syscall.Sendfile系统调用函数。 //go:build linuxpackage zero_copyimport ("f…...

http协议九种请求方法介绍及常见状态码

http1.0定义了三种&#xff1a; GET: 向服务器获取资源&#xff0c;比如常见的查询请求POST: 向服务器提交数据而发送的请求Head: 和get类似&#xff0c;返回的响应中没有具体的内容&#xff0c;用于获取报头 http1.1定义了六种 PUT&#xff1a;一般是用于更新请求&#xff0c;…...

详解flink exactly-once和两阶段提交

以下是我们常见的三种 flink 处理语义&#xff1a; 最多一次&#xff08;At-most-Once&#xff09;&#xff1a;用户的数据只会被处理一次&#xff0c;不管成功还是失败&#xff0c;不会重试也不会重发。 至少一次&#xff08;At-least-Once&#xff09;&#xff1a;系统会保…...

Qt/QML编程学习之心得:QDbus实现service接口调用(28)

D-Bus协议用于进程间通讯的。 QString value = retrieveValue();QDBusPendingCall pcall = interface->asyncCall(QLatin1String("Process"), value);QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this);QObject::connect(watcher, SI…...

前端nginx配置指南

前端项目发布后&#xff0c;有些接口需要在服务器配置反向代理&#xff0c;资源配置gzip压缩&#xff0c;配置跨域允许访问等 配置文件模块概览 配置示例 反向代理 反向代理是Nginx的核心功能之一&#xff0c;是指客户端发送请求到代理服务器&#xff0c;代理服务器再将请求…...

接口测试到底怎么做,5分钟时间看完这篇文章彻底搞清楚

01、通用的项目架构 02、什么是接口 接口&#xff1a;服务端程序对外提供的一种统一的访问方式&#xff0c;通常采用HTTP协议&#xff0c;通过不同的url&#xff0c;不同的请求类型&#xff08;GET、POST&#xff09;&#xff0c;不同的参数&#xff0c;来执行不同的业务逻辑。…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...