简单的推箱子游戏实战

目录

项目分析

 地图初始化

背景图片

游戏场景图片:

热键控制

 按键设置

确定人物位置

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

推箱子控制

游戏结束

最终代码

合法性判断:


项目分析

墙: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,箱子命中目标:5
	loadimage(&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,箱子命中目标:5
	loadimage(&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)

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

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

相关文章

煤炭行业电力能源消耗监测管理系统的作用有哪些?

如果说&#xff0c;通风是煤炭的呼吸系统&#xff0c;那么供电就是煤矿的神经系统。安全供电对安全生产有着重要的意义。一旦供电系统出现故障或停电&#xff0c;煤矿的生产活动将无法正常进行&#xff0c;这将产生严重的经济损失甚至危及工人的生命安全。 为了提高煤矿供电系统…

机器视觉检测设备在连接器外观缺陷检测中的应用

作为传输电流或信号连接两个有源器件的器件&#xff0c;连接器被广泛应用于各个行业&#xff0c;从手机、平板、电脑&#xff0c;到冰箱、空调、洗衣机&#xff0c;再到汽车、国防、航空&#xff0c;处处是它的所在。每个电子产品少了连接器将无法运作&#xff0c;因此&#xf…

在Docker上配置TensorFlow

在Docker上配置TensorFlow 配置WSL 参考教程&#xff1a;https://blog.csdn.net/m0_63969219/article/details/124632640 在上述教程配置的过程中&#xff0c;可能很难在微软商店下到ubuntu&#xff0c;下面给出另外一种解决方案&#xff1a; 接着上面教程 wsl --set-defaul…

【控制篇 / 策略】(7.4) ❀ 04. 修改IP地理位置数据库 ❀ FortiGate 防火墙

【简介】虽然通过FortiGuard服务可以更新IP地理位置数据库&#xff0c;但是实际使用环境中&#xff0c;总会有部分IP地址不符合我们的愿景&#xff0c;这种情况下&#xff0c;可以通过修改IP地理位置数据库来达到我们的目标。 更新IP地理位置数据库 更新IP地理位置数据库是Fort…

蓝桥杯练习题(四)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;四&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

算法34:贴纸拼词(力扣691题)

题目&#xff1a; 我们有 n 种不同的贴纸。每个贴纸上都有一个小写的英文单词。 您想要拼写出给定的字符串 target &#xff0c;方法是从收集的贴纸中切割单个字母并重新排列它们。如果你愿意&#xff0c;你可以多次使用每个贴纸&#xff0c;每个贴纸的数量是无限的。 返回你…

ansible从入门到精通(完整篇)

文章目录 01 Ansible介绍与安装1. 介绍 Ansible1.1 什么是 Ansible?1.2 Ansible 无需代理1.3 Ansible 方式 2. 安装 Ansible2.1 控制节点2.2 受管主机2.3 基于Windows的受管主机2.4 受管网络设备2.5 安装Ansible 02 部署Ansible1. 构建Ansible清单1.1 定义清单1.2 使用静态清单…

人脸识别(Java实现的)

虹软人脸识别&#xff1a; 虹软人脸识别的地址&#xff1a;虹软视觉开放平台—以免费人脸识别技术为核心的人脸识别算法开放平台 依赖包&#xff1a; 依赖包是从虹软开发平台下载的 在项目中引入这个依赖包 pom.xml <!-- 人脸识别 --><dependency><gr…

Find My游戏手柄|苹果Find My技术与手柄结合,智能防丢,全球定位

游戏手柄是一种常见电子游戏机的部件&#xff0c;通过操纵其按钮等&#xff0c;实现对游戏虚拟角色的控制。随着游戏设备硬件的升级换代&#xff0c;现代游戏手柄又增加了&#xff1a;类比摇杆&#xff08;方向及视角&#xff09;&#xff0c;扳机键以及HOME菜单键等。现在的游…

Find My资讯|AirTag 2或推迟上市,Find My功能十分强大

苹果于 2021 年4月推出了初代 AirTag。苹果已将第二代 AirTag 的推出推迟到 2025 年&#xff0c;目前苹果官方并不急于推出AirTag 2的原因还有AirTag所搭载的搜寻定位功能非常的强大&#xff0c;在市场上几乎没有任何竞争对手可言。 AirTag使用蓝牙和苹果设备的“查找我的”网…

Python Web开发库之vcrpy 使用详解

概要 在现代Web开发中&#xff0c;HTTP请求是不可避免的一部分。然而&#xff0c;通过网络发送HTTP请求可能会导致一些问题&#xff0c;如慢速响应、网络不稳定和API限制。为了解决这些问题&#xff0c;Python社区开发了一些工具和库&#xff0c;其中之一就是vcrpy。vcrpy是一…

软件分发点(DP)的合理规划

软件分发点&#xff08;Distribution Point, DP&#xff09;是用于托管文件以分发到计算机和移动设的服务器&#xff0c;Jamf Pro可以通过分发点分发以下类型的文件&#xff1a; 软件包 脚本 内部应用程序 内部书籍 Jamf Pro支持两种类型的分发点&#xff0c;您可以使用这些类型…

铭文 LaunchPad 平台 Solmash 推出早鸟激励计划

为感谢用户对Solmash的支持&#xff0c;Solmash特别推出“Solmash早鸟激励计划”&#xff0c;以回馈社区的早期参与者&#xff0c;这是专为已经参与Staking Pool或Honest Pool的用户推出的激励。 Solmash NFT激励 为确保该NFT的精准发放&#xff0c;请在Jan 11th, 2024 12:00 U…

react hooks 高德地图的应用

一、准备 1.登录控制台 登录 高德开放平台控制台&#xff0c;如果没有开发者账号&#xff0c;请 注册开发者。 2.创建 key 进入应用管理&#xff0c;创建新应用&#xff0c;新应用中添加 key&#xff0c;服务平台选择 Web端(JS API)。 3.获取 key 和密钥 创建成功后&#x…

无监督学习Principal Component Analysis(PCA)精简高维数据

目录 介绍 一、PCA之前 二、PCA之后 介绍 Principal Component Analysis (PCA) 是一种常用的数据降维和特征提取技术。PCA通过线性变换将高维数据映射到低维空间&#xff0c;从而得到数据的主要特征。PCA的目标是找到一个正交基的集合&#xff0c;使得将数据投影到这些基…

git提交记录全部删除

目录 问题描述 解决方案 结果 问题描述 新复制的项目具有特比多的提交记录我想给他清除&#xff0c;因为不清楚过多历史也就导致包特别大下载和提交等方面都不是很快 解决方案 查看代码clone网址&#xff1b; 打开远程仓库&#xff0c;选择要去除历史记代码分支&#xff08…

CSS3 边框border、outline、box-shadow

1 border 语法&#xff1a;border: width style color 2 outline 语法&#xff1a;outline: width style color 2.1 outline-offet MDN解释&#xff1a;用于设置outline与一个元素边缘或边框之间的间隙 即&#xff1a;设置outline相对border外边缘的偏移&#xff0c;可以为…

1.5计算机网络的分类

1.5计算机网络的分类 1.5.1按照网络的作用范围进行分类 1、广域网WAN 广域网WAN&#xff08;WideAreaNetwork&#xff09;&#xff1a;广域网的作用范围通常为几十到几千公里&#xff0c;因而有时也称为远程网(longhaulnetwork)。广域网是互联网的核心部分&#xff0c;其任务…

架构02 - 架构的基础: 特点,本质...

软件架构简介&#xff1a; 架构是对系统中各个实体以及它们之间关系的抽象描述&#xff0c;是对功能和形式元素之间对应关系的分配&#xff0c;也是对元素之间关系及与周边环境关系的定义。软件架构的核心价值在于控制系统的复杂性&#xff0c;实现核心业务逻辑和技术细节的解耦…

CES 2024丨引领变革,美格智能为智能终端带来生成式AI能力

作为电子行业的“风向标”&#xff0c;CES 2024&#xff08;国际消费电子展&#xff09;于1月9日至12日在美国拉斯维加斯举办。本届展会可谓是AI的盛宴&#xff0c;芯片、AI PC、智能家居、汽车科技、消费电子等领域与AI相关的前沿成果接连发布&#xff0c;引领人工智能领域的科…