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

news2024/11/15 23:57:37

前言

我是三天打鱼两天晒网的闲人,今天跟着课程视频学习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.coloradmin.cn/o/1788953.html

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

相关文章

【人工智能】第六部分:ChatGPT的进一步发展和研究方向

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

C++ | Leetcode C++题解之第120题三角形最小路径和

题目&#xff1a; 题解&#xff1a; class Solution { public:int minimumTotal(vector<vector<int>>& triangle) {int n triangle.size();vector<int> f(n);f[0] triangle[0][0];for (int i 1; i < n; i) {f[i] f[i - 1] triangle[i][i];for (…

Jmeter的几种参数化方式

1.为什么要做参数化&#xff1f; 在用jmeter脚本进行压测的时候&#xff0c;为了更真实的模拟起到更好的效果&#xff0c;我们需要让参数动态变化起来&#xff0c;也就是参数化。通过参数化我们也可以更好、更灵活的维护我们的测试脚本。 2.参数化的方式 能够实现参数化的方式有…

6月4(信息差)

&#x1f30d;AI预测极端天气提速5000倍&#xff01;微软发布Aurora&#xff0c;借AI之眼预测全球风暴 &#x1f384;理解老司机&#xff0c;超越老司机&#xff01;LeapAD&#xff1a;具身智能加持下的双过程自驾系统&#xff08;上海AI Lab等&#xff09; 论文题目&#xf…

对boot项目拆分成cloud项目的笔记

引言&#xff1a;这里我用的是新版本的技术栈 spring-boot-starter-parent >3.2.5 mybatis-spring-boot-starter >3.0.3 mybatis-plus-boot-starter >3.5.5 spring-cloud-dependencies …

JMeter Plugins Manager---插件安装

参考文章&#xff1a;https://blog.51cto.com/u_14126/6291032 需求&#xff1a; 安装【jpgc - Standard Set】插件 常用插件&#xff1a; 点击下载–报错如下&#xff1a; Failed to apply changes:Cannotapplychanges:Haveno write accessforJMeterdirectories,notpossib…

iTerm2 携手 OpenAI,带来命令行的自然语言革新

在技术不断进步的今天&#xff0c;命令行工具的智能化已成为提升效率的关键。iTerm2&#xff0c;macOS 系统上广受欢迎的开源终端工具&#xff0c;通过最新版本 v3.5 的发布&#xff0c;实现了与 OpenAI 的集成&#xff0c;引领了这一变革。 iTerm2 简介 iTerm2 是一款功能强…

宝塔部署vue+springboot过程(图文)

宝塔是傻瓜式操作部署&#xff0c;xshell是用linux命令部署 &#xffe5;过程&#xffe5; 整个流程具体服务器开端口在阿里云服务器打开3306端口&#xff08;有用到的端口都要打开&#xff09;宝塔&#xff1a;添加数据库获取数据库名、用户名、密码&#xff1b;点击“工具”…

容器化部署Pig微服务快速开发框架

系统说明 基于 Spring Cloud 、Spring Boot、 OAuth2 的 RBAC 企业快速开发平台&#xff0c; 同时支持微服务架构和单体架构 提供对 Spring Authorization Server 生产级实践&#xff0c;支持多种安全授权模式 提供对常见容器化方案支持 Kubernetes、Rancher2 、Kubesphere、E…

iotdb时序库在火电设备锅炉场景下的实践【原创文字,IoTDB社区可进行使用与传播】

一.概述 1.1 说明 本文章主要介绍iotdb数据库在电站锅炉工业场景下&#xff0c;对辅助智能分析与预警的使用介绍。 【原创文字&#xff0c;IoTDB社区可进行使用与传播】 1.2 项目背景 随着人工智能算法在电力领域的发展&#xff0c;以及燃煤锅炉设备精细化调整需求的增加&…

君方船舶智能设计平台技术架构

1.整体架构 2.基础能力 2.1 测试工具 2.1.1 测试框架 2.1.2 调试工具 2.2 UI交互 2.2.1 通用属性面板 2.2.2 对象通用拷贝框架 2.2.3 命令交互操作框架 2.2.4 夹点编辑框架 2.2.5 对象捕捉 2.3 模型管理 2.3.1 对象数据管理 2.3.2 对象空间关系管理 2.3.3 对象依赖关系管理…

发现情绪背后的真实心理需求,选择适合你的情绪调节方式

一、教程描述 心态对人的生活质量以及身体健康等多方面&#xff0c;都会产生非常重要的影响&#xff0c;受到不良情绪的影响&#xff0c;人的心态也会发生一定的变化。对于处于不良情绪状态的人来讲&#xff0c;应该重视学会调整自己的情绪。在心理学上&#xff0c;人的每种情…

AR和AP重分类(Regroup)[FAGLF101/OBBU/OBBV]

一、为什么AR和AP科目需要重分类 1.1 执行操作的前提(重要) 存在AR的当月总余额在贷方&#xff08;客户贷项凭证、预收账款等&#xff09;或AP的当月总余额在借方&#xff08;供应商贷项凭证、预收账款等&#xff09;&#xff0c;这种情况下无法真实的反映出资产和负债情况&…

Window10磁盘的分盘和合并

注意&#xff1a; 当我们c盘不够大需要扩大磁盘空间时&#xff0c;当c盘后面没有未划分的磁盘时候&#xff0c;我们是无法进行扩充c盘的&#xff0c;此时&#xff0c;我们可以先删除后面一个磁盘&#xff0c;再进行扩大。 如下&#xff1a;c盘后没有未分配的空间&#xff0c;…

MySQL—多表查询—多表关系介绍

一、引言 提到查询&#xff0c;我们想到之前学习的单表查询&#xff08;DQL语句&#xff09;。而这一章节部分的博客我们将要去学习和了解多表查询。 对于多表查询&#xff0c;主要从以下7个方面进行学习。 &#xff08;1&#xff09;第一部分&#xff1a;介绍 1、多表关系 2、…

SpringBoot之静态资源

默认静态资源路径 classpath:/META-INF/resources/classpath:/resources/classpath:/static/classpath:/public/ 静态资源路径下的文件&#xff0c;可以通过根目录访问 resources 文件夹的文件如下图所示&#xff1a; 启动项目&#xff0c;分别访问以下路径&#xff1a; ht…

关于URL获取的参数,无法执行二选一查询

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

0X JavaSE-- 集合框架【Collection(List、Set、Queue)、Map】

每一个集合类底层采用的数据结构不同&#xff0c;例如ArrayList集合底层采用了数组&#xff0c;LinkedList集合底层采用了双向链表&#xff0c;HashMap集合底层采用了哈希表&#xff0c;TreeMap集合底层采用了红黑树。**集合中存储的是引用。**即。集合中存放的是对象的地址&am…

【学习】DCMM认证提升企业竞争优势的表现

DCMM认证是企业提升数据管理能力的重要途径。它不仅可以帮助企业评估自身的数据管理水平&#xff0c;还可以为企业提供改进的方向和目标。在数字化时代&#xff0c;拥有强大的数据管理能力是企业成功的关键。因此&#xff0c;通过DCMM认证&#xff0c;企业可以更好地适应数字化…

【iOS】UI——关于UIAlertController类

目录 前言关于UIAlertController具体操作及代码实现总结 前言 在UI学习中&#xff0c;我们发现UIAlertView在iOS 9中已经被废弃&#xff0c;我们找到UIAlertController来代替UIAlertView实现弹出框的功能&#xff0c;从而有了这篇关于UIAlertController的学习笔记。 关于UIAle…