【STM32单片机】迷宫游戏设计

文章目录

  • 一、主要功能
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、主要功能

本项目使用STM32F103/F407单片机控制器,TFTLCD触摸屏、按键等。

主要功能:
系统运行后,TFTLCD显示游戏界面,可按下KEY_UP键进入游戏;
系统内置3关游戏地图,默认从第1关开始,通过KEY_UP、KEY1、KEY2和KEY0键控制游戏上下左右方向;当玩家到达目的地,游戏通关,可按下KEY_UP键进入下一关


二、软件设计

/*
作者:嗨小易(技术QQ群:570487280)
*/

/*
作者:嗨小易(QQVIP群2:570487280)
B站:https://space.bilibili.com/444388619/video
版权:本教程版权归嗨小易所有,未经授权不得转载、摘编或用于其他商业用途!!!
	  一经发现,后果自负!!!
*/

#include "appdemo.h"
#include "SysTick.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include "tftlcd.h"
#include "picture.h"
#include "wall25X25.h"
#include "wanjia.h"


//定义结构体变量
_sys_ctrl sys_ctrl;

//关卡数
#define LEVEL		3
//迷宫长宽定义
#define ROW			10	//行
#define COL			10	//列
//游戏元素大小
#define X_SIZE		25
#define Y_SIZE		25
//游戏开始界面位置
#define START_X		(tftlcd_data.width-X_SIZE*ROW)/2
#define START_Y		(tftlcd_data.height-Y_SIZE*COL)/2


//迷宫数组 墙壁=0 路=1 角色=2,目的地3
int map[LEVEL][ROW][COL] = 
{ 
	//第1关
	{
		{0,0,0,0,0,0,0,0,0,0},
		{0,1,0,0,0,0,0,0,1,0},
		{0,1,0,0,0,0,0,0,1,0},
		{0,2,0,0,0,0,0,0,1,3},
		{0,1,0,0,0,0,0,0,1,0},
		{0,1,1,1,1,1,1,0,1,0},
		{0,1,1,0,0,0,1,0,1,0},
		{0,1,1,0,0,0,1,1,1,0},
		{0,0,0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0,0,0}
	},
	//第2关
	{
		{0,0,0,0,0,0,0,0,0,0},
		{0,1,1,1,0,1,1,1,1,0},
		{0,1,0,1,0,1,0,0,1,0},
		{2,1,0,1,0,1,0,0,1,0},
		{0,1,0,0,0,1,0,0,1,0},
		{0,1,0,1,1,1,1,0,1,0},
		{0,1,1,1,0,0,1,0,0,0},
		{0,0,0,1,0,0,1,1,1,0},
		{0,1,1,1,0,0,0,0,1,3},
		{0,0,0,0,0,0,0,0,0,0}
	},
	//第3关
	{
		{0,0,0,0,0,3,0,0,0,0},
		{0,1,1,1,0,1,1,1,1,0},
		{0,1,0,1,0,0,1,0,1,0},
		{0,1,0,1,1,1,0,1,1,0},
		{0,1,0,0,0,1,1,1,0,0},
		{0,1,1,1,0,1,0,1,1,0},
		{0,1,0,1,1,1,1,0,1,0},
		{2,1,1,0,1,0,1,1,1,0},
		{0,0,1,1,1,1,0,0,1,0},
		{0,0,0,0,0,0,0,0,0,0}
	},
};

//定义游戏元素
enum element
{
	WALL,	//墙
	SPACE,	//空地
	PLAYER,	//玩家
	DEST	//目的地
}ele;

u8 game_over=0;
u8 game_level=1;

//系统参数初始化
void sys_parm_init(void)
{
	sys_ctrl.cnt=0;
	sys_ctrl.dir=0;
}

//系统开机界面显示
void sys_open_show(void)
{
	FRONT_COLOR=BLACK;
	LCD_ShowFontHZ_Ex((tftlcd_data.width-4*32)/2,10,"迷宫游戏",22);
	LCD_ShowPicture((tftlcd_data.width-240)/2,(tftlcd_data.height-240)/2,240,240,(u8 *)gImage_picture);
	
	while(1)
	{
		if(KEY_Scan(0)==KEY_UP_PRESS)
		{
			LCD_Clear(BACK_COLOR);
			break;
		}
	}
}

//游戏界面显示
void game_show(void)
{
	u8 i=0,k=0;
	
	FRONT_COLOR=BLACK;
	LCD_ShowFontHZ_Ex((tftlcd_data.width-4*32)/2,10,"迷宫游戏",22);
	LCD_ShowString(100,40,100,100,24,"Level:");
	LCD_ShowNum(100+6*12,40,game_level,1,24);
	
	//绘制界面,墙、路、玩家
	for(i=0;i<ROW;i++)
	{
		for(k=0;k<COL;k++)
		{
			if(map[game_level-1][i][k]==WALL)//绘制墙
			{
				LCD_ShowPicture(START_X+k*X_SIZE,START_Y+i*Y_SIZE,X_SIZE,Y_SIZE,(u8 *)gImage_wall25X25);
			}
			else if(map[game_level-1][i][k]==PLAYER)//绘制玩家
			{
				LCD_ShowPicture(START_X+k*X_SIZE,START_Y+(i)*Y_SIZE,X_SIZE,Y_SIZE,(u8 *)gImage_wanjia);
			}
		}
	}
}

//应用程序
void app_demo(void)
{
	BEEP_Init();
	KEY_Init();
	LED_Init();
	TFTLCD_Init();
	sys_parm_init();//系统参数初始化
	sys_open_show();//系统开机界面显示
	game_show();//游戏界面显示
	
	while(1)
	{
		game_ctrl();//游戏控制
	}
}



三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

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

相关文章

持久双向通信网络协议-WebSocket-入门案例实现demo

1 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接&#xff0…

Javaweb之SpringBootWeb案例员工管理分页查询的详细解析

3. 员工管理 完成了部门管理的功能开发之后&#xff0c;我们进入到下一环节员工管理功能的开发。 基于以上原型&#xff0c;我们可以把员工管理功能分为&#xff1a; 分页查询&#xff08;今天完成&#xff09; 带条件的分页查询&#xff08;今天完成&#xff09; 删除员工&…

20240115寻找两数之和

代码 class Solution:def getSumIndex(self, nums: List[int], target: int) -> List[int]:records dict()for index, value in enumerate(nums): if target - value in records: # 遍历当前元素&#xff0c;并在map中寻找是否有匹配的keyreturn [records[target- valu…

postman案例

一、表单接口 基本正向 有效反向 无效反向 JSON接口 基本正向 有效反向 无效反向 文件上传接口 token 获取token值

CNN感受野

在卷积神经网络中&#xff0c;决定某一层输出结果中一个元素所对应的输入层的区域大小&#xff0c;被称为感受野。通俗的解释是&#xff0c;输出feature map上的一个单元对应输入层上的区域大小。 感受野计算公式&#xff1a; F ( i ) ( F ( i 1 ) − 1 ) S t r i d e K s…

“确定要在不复制其属性的情况下复制此文件?”解决方案(将U盘格式由FAT格式转换为NTFS格式)

文章目录 1.问题描述2.问题分析3.问题解决3.1 方法一3.2 方法二3.3 方法三 1.问题描述 从电脑上复制文件到U盘里会出现“确定要在不复制其属性的情况下复制此文件&#xff1f;”提示。 2.问题分析 如果这个文件在NTFS分区上&#xff0c;且存在特殊的安全属性。那么把它从NT…

CodeFuse开源这半年

2023 年可以称得上是大模型元年&#xff0c;在过去的这一年里&#xff0c;大模型领域飞速发展&#xff0c;新的大模型纷纷涌现&#xff0c;基于大模型的新产品也吸引着大家的眼球&#xff0c;未来&#xff0c;这个领域又会给大家带来多少惊喜&#xff1f; 蚂蚁也推出了自己的百…

STM32F103标准外设库——寄存器 (二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

9.1、加密技术原理详解

目录 一、加解密定义 二、加密技术分类 2.1、对称加密 2.2、非对称加密 三、对称加密算法 四、非对称加密算法 五、对称加密和非对称加密比较 六、对称加密和非对称加密结合 一、加解密定义 数据加密&#xff1a;对原来为明文的文件或数据按某种算法进行处理&#x…

项目解决方案:多个分厂的视频监控汇聚到总厂

目 录 1、概述 2、建设目标及需求 2.1 建设目标 2.2 需求描述 2.3 需求分析 3. 设计依据与设计原则 3.1 设计依据 3.2设计原则 1、先进性与适用性 2、经济性与实用性 3、可靠性与安全性 4、开放性 5、可扩充性 6、追求最优化的系统设备配置…

vue-ESlint代码规范及修复

1. 介绍 ESLint:是一个代码检查工具&#xff0c;用来检查你的代码是否符合指定的规则(你和你的团队可以自行约定一套规则)。 在创建项目时&#xff0c;我们使用的是 JavaScript Standard Style 代码风格的规则。 规范网址&#xff1a;https://standardjs.com/rules-zhcn.htm…

(2024,分数蒸馏抽样,Delta 降噪分数,LoRA)PALP:文本到图像模型的提示对齐个性化

PALP: Prompt Aligned Personalization of Text-to-Image Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 4. 提示对齐方法 4.1 概述 4.2 个性化 4.3 提示对齐分数抽…

小迪安全第二天

文章目录 一、Web应用&#xff0c;架构搭建二、web应用环境架构类三、web应用安全漏洞分类总结 一、Web应用&#xff0c;架构搭建 #网站搭建前置知识 域名&#xff0c;子域名&#xff0c;dns,http/https,证书等 二、web应用环境架构类 理解不同web应用组成角色功能架构 开发…

【固态钽表面贴装电容】 MIL-PRF-55365 美军标

钽电解电容器是体积效率、电气参数稳定、高可靠性和长使用寿命是主要考虑因素的应用的首选。 钽/氧化钽/二氧化锰系统的稳定性和对高温的耐受性使固体钽消泡器成为当今表面贴装组装技术的合适选择。 钽不是纯净状态的。 相反&#xff0c;它通常存在于许多氧化物矿物中&#xf…

RAG常见七大坑

论文题目&#xff1a;《Seven Failure Points When Engineering a Retrieval Augmented Generation System》 论文地址&#xff1a;https://arxiv.org/pdf/2401.05856.pdf 这篇论文主要探讨了构建检索增强生成系统&#xff08;Retrieval Augmented Generation, RAG&#xff09;…

如何正确使用数据库的读写分离

本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 背景 在应用系统发展的初期&#xff0c;我们并不知…

QT图表-折线图、曲线图

时间记录&#xff1a;2024/1/15 一、使用步骤 1.添加图表模块 .pro项目管理文件中添加charts模块 QChart类&#xff1a;图表类 QChartView类&#xff1a;图表显示类 2.ui文件中添加QChartView组件 &#xff08;1&#xff09;选择一个QGrapicsView组件将其拖拽到ui界面上合适位…

C语言从入门到实战——结构体与位段

结构体与位段 前言一、结构体类型的声明1.1 结构体1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的自引用 二、 结构体内存对齐2.1 对齐规则2.2 为什么存在内存对齐2.3 修改默认对齐数 三、结构体传参四、 结构体实现位段4.1 什么是位段4.2 位段…

vue前端开发自学,插槽练习,同时渲染父子组件的数据信息

vue前端开发自学,插槽练习,同时渲染父子组件的数据信息&#xff01; 如果想在slot插槽出口里面&#xff0c;同时渲染出来&#xff0c;来自父组件的数据&#xff0c;和子组件自身的数据呢。又有点绕口了。vue官方给的解决办法是。需要借助于&#xff0c;父组件的自定义属性。 …

边缘计算的挑战和机遇(结合RDH-EI)

边缘计算的挑战和机遇 边缘计算面临着数据安全与隐私保护、网络稳定性等挑战&#xff0c;但同时也带来了更强的实时性和本地处理能力&#xff0c;为企业降低了成本和压力&#xff0c;提高了数据处理效率。因此&#xff0c;边缘计算既带来了挑战也带来了机遇&#xff0c;需要我…