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]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SpringCloud学习笔记】Elasticsearch

1. Elasticsearch 1.1 安装ES 启动Docker&#xff1a;service docker restart / systemctl restart docker基于Docker创建网络docker network create hm-net向云服务器上传elasticsearch以及kibana的tar包&#xff0c;并使用docker load -i xxx.tar进行加载使用如下命令启动e…

使用Qt实现文本文件的读写操作

文章目录 文本读写简介QFileDialog简介常用方法示例代码 QFile简介常用方法示例代码 QTextStream简介常用方法示例代码 结合使用示例完整示例代码(读写操作&#xff0c;可直接复制运行我使用的Qt版本为QT5.14)mainwindow.hmainwindow.cppmain.cpp代码解释 文本读写简介 在现代…

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: &…

MySQL之查询性能优化(四)

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

History 模式和 Hash 模式路由的区别、优缺点及在开发生产环境中的注意事项

在现代单页应用&#xff08;SPA&#xff09;开发中&#xff0c;前端路由是至关重要的一部分。常见的路由模式有两种&#xff1a;History 模式和 Hash 模式。本文将详细探讨这两种模式的区别、优缺点&#xff0c;并在开发和生产环境中的注意事项。 路由模式简介 Hash 模式 H…

.Net 基于.Net8开发的一个Asp.Net Core Webapi后端框架

1.项目结构 该项目是基于.net8开发的Asp.Net Core WebApi后端服务,集成了Efcore,Autofac,Jwt,AutoMapper,Serilog,Quartz,MiniExcel等组件。该框架简单易上手&#xff0c;没有额外的学习成本; 该项目采用了多层结构设计&#xff0c;有利于解耦&#xff0c;包含公共层&#xff0…

机器视觉——硬件常用基础知识

光源 机器视觉中光源的作用 1&#xff09;强化特征&#xff0c;弱化背景 2&#xff09;光源打得好&#xff0c;图好了&#xff0c;后期算法更简化 3&#xff09;图好了&#xff0c;测试速度更高 各种光源的综合性能对比及为啥使用LED灯 光的颜色的选择 白色光&#xff1a;通常用…

【分享】两种方法禁止修改Word文档

对于比较重要的Word文件&#xff0c;不想被随意编辑修改&#xff0c;可以试试以下两个方法&#xff0c;不清楚的小伙伴&#xff0c;一起来看看吧&#xff01; 方法1&#xff1a;设置“只读方式” 我们可以给Word文档设置以“只读方式”打开&#xff0c;这样就算编辑修改了文档…

企业内部聊天软件Riot部署

ubuntu docker 简介 Riot(原Vector)是使用Matrix React SDK构建的Matrix网络聊天客户端,开源免费,功能丰富,支持私人对话,团队对话,语言视频对话,上传文件,社区互动。支持在聊天界面添加各种有趣的插件,比如RSS等各种机器人、虚拟币实时监控等。并且所有通过Riot传…

63. UE5 RPG 兼容没有武器的普通攻击

前面&#xff0c;我们实现了近战攻击技能&#xff0c;敌人通过AI靠近玩家&#xff0c;并且通过AI还能够触发近战攻击的释放。现在我们思考一个问题&#xff0c;如果敌人没有武器&#xff0c;攻击的手段是用的双手&#xff0c;我们该如何去获取它的攻击范围。 现在实现的一套是获…

什么情况!伯克希尔哈撒韦股票跌近100%

KlipC报道&#xff1a;当地时间6月3日开盘后&#xff0c;纽约证劵交易所的一个技术问题导致沃伦巴菲特(Warren Buffett)旗下伯克希尔哈撒韦公司(Berkshire Hathaway)A类股票似乎下跌了近100%&#xff0c;达到185.1美元/股。目前&#xff0c;所有受影响的股票已经恢复交易。 除了…

OLED_讲解

OLED&#xff08;有机发光二极管 Organic Light-Emitting Diode&#xff09;是一种显示技术&#xff0c;它使用有机化合物材料作为发光层&#xff0c;当通过电流时&#xff0c;这些材料会发光。OLED显示器由多个单独可控制的OLED像素组成&#xff0c;每个像素都能够发出红、绿、…

【异常分析:四分位距与3σ原则】

文章目录 前言四分位距&#xff08;IQR&#xff09;3σ原则使用步骤计算四分位距应用3σ原则 代码 前言 异常分析的目标是识别数据中的异常值&#xff0c;这些异常值可能是由于错误的记录、设备故障或者其他未知原因导致的。四分位距&#xff08;interquartile range, IQR&…

目标检测数据集 - 海洋垃圾检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;海洋垃圾检测数据集&#xff0c;真实拍摄海洋海底场景高质量垃圾检测图片数据&#xff0c;涉及场景丰富&#xff0c;比如海底塑料垃圾数据、海底铁制品罐状垃圾数据、海底纸张垃圾数据、海洋生物和海底垃圾同框数据、海底探索仪器和海底垃圾同框数据、海…

前端localForage存储数据使用教程

前言 前端本地化存储算是一个老生常谈的话题了&#xff0c;我们对于 cookies、Web Storage&#xff08;sessionStorage、localStorage&#xff09;的使用已经非常熟悉&#xff0c;在面试与实际操作之中也会经常遇到相关的问题&#xff0c;但这些本地化存储的方式还存在一些缺陷…

iPhone录音的m4a格式音频文件怎么转成MP3格式?

在日常工作生活中&#xff0c;我们有时会用电脑或手机录音&#xff0c;比如iPhone录音的M4A格式音频&#xff0c;要上传至某些软件或者平台使用&#xff0c;但是有时这些平台或者软件对音频格式有要求&#xff0c;比如有的就只能上传mp3格式的文件。 这个时候我们就需要先将音频…

在Three.js中实现模型点击高亮:整合EffectComposer与OutlinePass的终极指南

效果【后期实现鼠标点击选中轮廓后给出一个弹窗显示相应的模型信息】 标签指示线参考我的上一篇文章 引言 Three.js不仅让WebGL的3D图形编程变得简单易懂&#xff0c;还通过其强大的扩展库支持丰富的后期处理效果&#xff0c;为3D场景增添无限魅力。本篇文章将引导您深入了…

客户案例|Zilliz Cloud 助力点石科技转型 AI 智能服务商

福建点石科技网络科技有限公司成立于2010年&#xff0c;是国家高新技术企业&#xff0c;阿里云、蚂蚁金服等大厂海内外生态合作伙伴ISV。在餐饮、零售、酒店、旅游、商圈的行业定制化服务化上有深厚积累&#xff0c;在境内外做了大量标杆性软件项目&#xff0c;如东南亚RWS圣淘…

详解智慧互联网医院系统源码:开发医院小程序教学

本篇文章&#xff0c;笔者将详细介绍智慧互联网医院系统的源码结构&#xff0c;并提供开发医院小程序的详细教学。 一、智慧互联网医院系统概述 智慧互联网医院系统涵盖了预约挂号、在线咨询、电子病历、药品管理等多个模块。 二、系统源码结构解析 智慧互联网医院系统的源码…

【软件测试】自动化测试如何管理测试数据

前言 在之前的自动化测试框架相关文章中&#xff0c;无论是接口自动化还是UI自动化&#xff0c;都谈及data模块和config模块&#xff0c;也就是测试数据和配置文件。 随着自动化用例的不断增加&#xff0c;需要维护的测试数据也会越来越多&#xff0c;维护成本越来越高&#…