C++数组实现推箱子游戏

前言

我是三天打鱼两天晒网的闲人,今天跟着课程视频学习c++的数组的运用.

准备好游戏用到的图片资源

代码逻辑实现

#include<iostream>
#include<graphics.h>
#include<string>
#include<conio.h>using namespace std;//设置画布大小
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768//设置图片大小
#define RATIO 61//设置地图大小
#define LINE 9
#define COLUMN 12//设置起始位置
#define START_X 120
#define START_Y 110//宏定义控健 上 下 左 右,'q'退出
#define KEY_UP	'w'
#define KEY_LEFT	'a'
#define KEY_RIGHT	'd'
#define KEY_DOWN    's'
#define KEY_QUIT    'q'//小人的结构体
typedef struct _POS _POS;
//定义道具枚举值
typedef enum _PROPS _PROPS;
//定义游戏控健枚举值
typedef enum _DIRETION _DIRETION;
//小人移动目标位置是否合法
#define isVald(pos) pos.x>=0 && pos.x < LINE && pos.y >= 0 && pos.y < COLUMN
//小人的结构体
struct _POS {int x;//小人所在二维数组的行int y;//小人所在二维数组的列
};//定义道具枚举值
enum _PROPS {WALL,//0是墙FLOOR,//1是地板BOX_DES,//2是箱子目的地MAN,//3是人BOX,//4是箱子HIT,//5是箱子命中目的地ALL
};//定义游戏控健枚举值
enum _DIRETION {UP,DOWN,LEFT,RIGHT
};
//设置图片数组
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, 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 },
};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;
}void gameOverScene(IMAGE *bg) {putimage(0, 0, bg);settextcolor(YELLOW);RECT res = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT };setbkmode(TRANSPARENT);settextstyle(50, 0, _T("宋体"));drawtext(_T("ヾ( ̄ー ̄)X(^▽^)ゞ"),&res,DT_CENTER|DT_VCENTER|DT_SINGLELINE);}
//改变展示道具
void changeMan(_POS *pos, _PROPS prop) {//修改地图值map[pos->x][pos->y] = prop;//修改道具图片putimage(pos->y * RATIO + START_X, pos->x * RATIO + START_Y, &images[prop]);
}
//上一次的目的位置是不是箱子目的地
bool isBoxDesc = false;
//实现游戏控健移动
void gameControl(_DIRETION direct) {struct _POS nest_pos = man;struct _POS nest_nest_pos = man;switch (direct) {case UP:nest_pos.x--;nest_nest_pos.x -= 2;break;case DOWN:nest_pos.x++;nest_nest_pos.x += 2;break;case LEFT:nest_pos.y--;nest_nest_pos.y -= 2;break;case RIGHT:nest_pos.y++;nest_nest_pos.y += 2;break;default:break;}if (isVald(nest_pos) &&(map[nest_pos.x][nest_pos.y] == FLOOR || map[nest_pos.x][nest_pos.y] == BOX_DES)) {//人的前方是地板或者箱子目的地//如果上一次的目标位置是箱子目的地,那么小人移走后的位置要变回箱子目的地enum _PROPS old_props = isBoxDesc ? BOX_DES : FLOOR;//记录目标位置是不是箱子目的地isBoxDesc = map[nest_pos.x][nest_pos.y] == BOX_DES ? true : false;changeMan(&nest_pos, MAN);//小人移动一格changeMan(&man, old_props);//小人原来的位置变成地板man = nest_pos;} else if (isVald(nest_nest_pos) && (map[nest_pos.x][nest_pos.y] == BOX)) {//人的前方是箱子//两种情况,箱子前面是地板或者箱子前面是目的地if (map[nest_nest_pos.x][nest_nest_pos.y] == FLOOR) {changeMan(&nest_nest_pos, BOX);//箱子移动一格changeMan(&nest_pos, MAN);//小人移动一格changeMan(&man, FLOOR);//小人原来的位置变成地板man = nest_pos;} else if (map[nest_nest_pos.x][nest_nest_pos.y] == BOX_DES) {changeMan(&nest_nest_pos, HIT);//箱子移动一格changeMan(&nest_pos, MAN);//小人移动一格changeMan(&man, FLOOR);//小人原来的位置变成地板man = nest_pos;}}
}
int main(void) {IMAGE bg_image;IMAGE over_image;//初始化画布大小initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//设置背景loadimage(&bg_image, _T("image/blackground.bmp"), 960, 768, true);putimage(0, 0, &bg_image);loadimage(&over_image, _T("image/3.jpg"), 960, 768, true);//加载道具图片loadimage(&images[WALL], _T("image/wall_right.bmp"), RATIO, RATIO, true);loadimage(&images[FLOOR], _T("image/floor.bmp"), RATIO, RATIO, true);loadimage(&images[BOX_DES], _T("image/des.bmp"), RATIO, RATIO, true);loadimage(&images[MAN], _T("image/man.bmp"), RATIO, RATIO, true);loadimage(&images[BOX], _T("image/box.bmp"), RATIO, RATIO, true);loadimage(&images[HIT], _T("image/box.bmp"), RATIO, RATIO, true);for (int i = 0; i < LINE; i++) {for (int j = 0; j < COLUMN; j++) {if (map[i][j] == MAN) {//值为3的就是小人的位置man.x = i;man.y = j;}putimage(j * RATIO + START_X, i * RATIO + START_Y, &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(&over_image);//quit = true;}}Sleep(100);} while (!quit);system("pause");//释放资源closegraph();return 0;
}

效果展示

在这里插入图片描述
在这里插入图片描述

[2024-06-04]

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

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

相关文章

kafka-守护启动

文章目录 1、kafka守护启动1.1、先启动zookeeper1.1.1、查看 zookeeper-server-start.sh 的地址1.1.2、查看 zookeeper.properties 的地址 1.2、查看 jps -l1.3、再启动kafka1.3.1、查看 kafka-server-start.sh 地址1.3.2、查看 server.properties 地址 1.4、再次查看 jps -l 1…

【python】OpenCV—Cartoonify and Portray

参考来自 使用PythonOpenCV将照片变成卡通照片 文章目录 1 卡通化codecv2.medianBlurcv2.adaptiveThresholdcv2.kmeanscv2.bilateralFilter 2 肖像画cv2.divide 1 卡通化 code import cv2 import numpy as npdef edge_mask(img, line_size, blur_value):gray cv2.cvtColor(…

代码随想录算法训练营第二十八天|93.复原IP地址 ,78.子集 ,90.子集II

93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; class Solution {ArrayList<String> results new ArrayList<>();public List<String> restoreIpAddresses(String s) {if(s.length() > 12){return new ArrayList<>();}char[] ipChars …

OBS+nginx+nginx-http-flv-module实现阿里云的推流和拉流

背景&#xff1a;需要将球机视频推送到阿里云nginx&#xff0c;使用网页和移动端进行播放&#xff0c;以前视频格式为RTMP&#xff0c;但是在网页上面播放RTMP格式需要安装flash插件&#xff0c;chrome浏览器不给安装&#xff0c;调研后发现可以使用nginx的模块nginx-http-flv-…

MySQL之查询性能优化(四)

查询性能优化 MySQL客户端/服务器通信协议 一般来说&#xff0c;不需要去理解MySQL通信协议的内部实现细节&#xff0c;只需要大致理解通信协议是如何工作的。MySQL客户端和服务器之间的通信协议是"半双工"的&#xff0c;这意味着&#xff0c;在任何一个时刻&#…

9.抽象类和接口

抽象类 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类 比如&#xff1a; 我…

Vue进阶之Vue无代码可视化项目(二)

Vue无代码可视化项目 项目初始化路由子路由错误示范正确示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts项目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由样式App.vue进一步的App.vue项目初始化 路由 router i…

高精度滚珠丝杆在自动化生产中的关键因素!

如今&#xff0c;自动化技术正以前所未有的速度改变着人们的生活和工作方式&#xff0c;特别是在高精度精密设备的制造与应用领域&#xff0c;提高生产效率和优化生产流程正变得越来越重要。在自动化生产中&#xff0c;滚珠丝杆的优化应用对于提高生产效率、保证产品质量至关重…

k8s Pods漂移时间配置

默认为300秒 apiVersion: apps/v1 kind: Deployment metadata:name: my-test spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80tolerations:- key: &…

面试二十六、c++语言级别的多线程编程

一、 多线程编程 ​​​​​ 这里的c语言级别的多线程和linux的有一定的区别&#xff0c;c语言级别提供的多线程比较严格&#xff0c;如果主线程结束了&#xff0c;但是子线程没有结束&#xff0c;进程就会异常终止&#xff0c;而linux不会&#xff0c;会继续执行。 二、模拟卖…

LLama学习记录

学习前&#xff1a; 五大问题&#xff1a; 为什么SwiGLU激活函数能够提升模型性能&#xff1f;RoPE位置编码是什么&#xff1f;怎么用的&#xff1f;还有哪些位置编码方式&#xff1f;GQA&#xff08;Grouped-Query Attention, GQA&#xff09;分组查询注意力机制是什么&…

FL Studio21.2.8中文版水果音乐制作的革新之旅!

在数字化浪潮的推动下&#xff0c;音乐制作领域经历了翻天覆地的变化。从最初的模拟技术到如今的全数字化处理&#xff0c;音乐制作的门槛被大幅降低&#xff0c;越来越多的音乐爱好者和专业人士开始尝试自行创作和编辑音乐。在这个过程中&#xff0c;各种专业音乐制作软件成为…

CVE-2022-22947

漏洞描述 Spring Cloud Gateway 远程代码执行漏洞&#xff08;CVE-2022-22947&#xff09;发生在Spring Cloud Gateway应用程序的Actuator端点&#xff0c;其在启用、公开和不安全的情况下容易受到代码注入的攻击。攻击者可通过该漏洞恶意创建允许在远程主机上执行任意远程执行…

第二十五章新增H5基础(以及视频~兼容)

1.HTML5中新增布局标签 HTML5新增了页眉&#xff0c;页脚&#xff0c;内容块等文档结构相关标签&#xff0c;可以使文档结构更加清晰明了。 1.新增的结构标签 1、<header>标签 定义文档或者文档中内容块的页眉。通常可以包含整个页面或一个内容区域的标题&#xff0c…

UI案例——登陆系统

UI的登陆界面实例 在学习了UILabel&#xff0c;UIButton&#xff0c;UIView&#xff0c;UITextField的内容之后&#xff0c;我们就可以写一个简单的登陆界面 我们可以通过UILabel来编写我们显示在登陆界面上的文字比方说下面这两行字就是通过UILabel去实现的。 下面给出一下实现…

直播美颜插件详解:美颜SDK的技术原理

美颜SDK作为实现美颜功能的核心技术&#xff0c;已被广泛应用于各种直播和短视频应用中。那么&#xff0c;美颜SDK究竟是如何工作的&#xff1f;它背后的技术原理又是什么&#xff1f;本文将对直播美颜插件及其技术原理进行详解。 一、美颜SDK的概述 美颜SDK包含了各种图像处…

二叉树遍历 和 线索二叉树

文章目录 1.1 二叉树遍历1.1 前提问题1&#xff1a; 什么叫二叉树的遍历&#xff1f;二叉树的三种遍历&#xff1a;三个概念&#xff1a;遍历 和 访问 和 经过重要概念&#xff1a;遍历过程中的经过节点&#xff0c;不代表访问节点 问题2&#xff1a;遍历和访问的联系&#xff…

【代码+详解】算法题 : 最大公约数

❗❗❗必看: 下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果代码和详解看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答. ❗❗❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!! 文章目录 题目&…

思维导图——幕布

一、前言 幕布是一款专注于简化和组织信息的大纲笔记应用&#xff0c;它旨在帮助用户高效地整理知识点、优化工作流程以及规划个人生活。 二、软件特点 幕布工具的核心优势在于其能够快速将用户的输入转换成清晰的思维导图&#xff0c;便于视觉化地理解和记忆信息。 幕布还具…

分集增益Diversity Gain与复用增益Multiplexing Gain

文章目录 概念DoF&#xff08;Degrees of Freedom&#xff09;复用增益&#xff08;Multiplexing Gain&#xff09;自由度&#xff08;Degrees of Freedom, DoF&#xff09;两者的关系实际应用关系总结具体关系例子结论 近场MIMO的分集与复用与远场MIMO有何不同 概念 在通信领…