【STM32单片机】贪吃蛇游戏设计

news2024/11/29 2:52:30

文章目录

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


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用8*8LED点阵模块、矩阵按键、蜂鸣器模块等。

主要功能:
系统运行后,贪吃蛇游戏开始运行,默认蛇身为2节,
可通过如下按键控制贪吃蛇方向,每当吃掉3个食物,则游戏
速度加快,直达以最快速度运行;贪吃蛇游戏默认未设置墙壁,
可穿墙,当贪吃蛇头碰撞身体时,游戏结束,D1指示灯亮。
当按下开始/暂停键时,游戏可重新开始,D1灯灭。
当游戏过程中需要暂停时,可按下开始/暂停键,进入暂停状态,
当再次按下开始/暂停键时,游戏恢复。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


//贪吃蛇方向控制
void snake_dir_control(void)
{
	u8 i=0;
	
	//生成食物
	if(sys_ctrl.food.flag==0)
	{
		while(1)
		{
			sys_ctrl.food.x=rand()%8;//产生0-7随机数
			sys_ctrl.food.y=rand()%8;//产生0-7随机数
			for(i=0;i<sys_ctrl.body.len;i++)
			{
				//食物坐标与蛇身冲突
				if(sys_ctrl.food.x==sys_ctrl.body.x[i] && sys_ctrl.food.y==sys_ctrl.body.y[i])	
					break;	
			}
			//食物坐标有效
			if(i==sys_ctrl.body.len)
			{
				sys_ctrl.food.flag=1;
				break;	
			}
		}
//		leddz_draw_dot(sys_ctrl.food.x,sys_ctrl.food.y,1);
	}
	if(sys_ctrl.food.flag)
		leddz_draw_dot(sys_ctrl.food.x,sys_ctrl.food.y,1);
	//清除上次的蛇身末尾节
	leddz_draw_dot(sys_ctrl.body.x[sys_ctrl.body.len-1],sys_ctrl.body.y[sys_ctrl.body.len-1],0);
	
	//重新获取蛇身移动一步位置
	for(i=sys_ctrl.body.len-1;i>0;i--)
	{
		sys_ctrl.body.x[i]=sys_ctrl.body.x[i-1];
		sys_ctrl.body.y[i]=sys_ctrl.body.y[i-1];	
	}
	//方向选择
	switch(sys_ctrl.dir)
	{
		case DIR_RIGHT: sys_ctrl.body.x[0]+=1;break;
		case DIR_LEFT: sys_ctrl.body.x[0]-=1;break;
		case DIR_UP: sys_ctrl.body.y[0]-=1;break;
		case DIR_DOWN: sys_ctrl.body.y[0]+=1;break;
	}
	//重绘蛇身
	for(i=0;i<sys_ctrl.body.len;i++)
	{
		//判断蛇头是否超限
		if(sys_ctrl.body.x[0]==LEDDZ_WIDTH)sys_ctrl.body.x[0]=0;
		else if(sys_ctrl.body.x[0]<0)sys_ctrl.body.x[0]=LEDDZ_WIDTH-1;
		if(sys_ctrl.body.y[0]==LEDDZ_HEIGHT)sys_ctrl.body.y[0]=0;
		else if(sys_ctrl.body.y[0]<0)sys_ctrl.body.y[0]=LEDDZ_HEIGHT-1;
		leddz_draw_dot(sys_ctrl.body.x[i],sys_ctrl.body.y[i],1);	
	}
	//判断贪吃蛇是否吃到食物
	if(sys_ctrl.body.x[0]==sys_ctrl.food.x && sys_ctrl.body.y[0]==sys_ctrl.food.y)
	{
//		leddz_draw_dot(sys_ctrl.food.x,sys_ctrl.food.y,0);
		if(sys_ctrl.body.len<=SNAKE_LEN_MAX)//最大蛇身长度
			sys_ctrl.body.len++;
		sys_ctrl.score+=GET_SCORE_RATIO;
		sys_ctrl.food.flag=0;//重新生成食物
		if(sys_ctrl.score%SCORE_RATIO==0)
		{
			sys_ctrl.speed-=SPEED_RATIO;
			if(sys_ctrl.speed<=SPEED_RATIO)sys_ctrl.speed=SPEED_MAX;	
		}
								
	}
	//判断是否碰撞到身体,前提是蛇身要超过3节
	for(i=3;i<sys_ctrl.body.len;i++)
	{
		if(sys_ctrl.body.x[0]==sys_ctrl.body.x[i] && sys_ctrl.body.y[0]==sys_ctrl.body.y[i])
		{
			sys_ctrl.status=3;//游戏停止状态
			game_over();//游戏结束
		}
	}
	//暂停时等待开始
	while(sys_ctrl.status==1);				
}


//应用控制系统
void app_sys_ctrl_demo(void)
{
	LED_Init();
	USART1_Init(115200);
	KEY_Matrix_Init();
	LEDDZ_Init();
	snake_init();//贪吃蛇参数初始化
	TIM3_Init(20,36000-1);//定时10ms
	TIM4_Init(20,36000-1);//定时10ms
	TIM_Cmd(TIM3,ENABLE);//打开定时器
	TIM_Cmd(TIM4,ENABLE);//打开定时器
	
	while(1)
	{
		if(sys_ctrl.flag)//运行
		{
			sys_ctrl.flag=0;//清除
			snake_dir_control();//贪吃蛇方向控制		
		}	
	}
}





三、实验现象

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


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

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

相关文章

057-第三代软件开发-文件监视器

第三代软件开发-文件监视器 文章目录 第三代软件开发-文件监视器项目介绍文件监视器实现原理关于 QFileSystemWatcher实现代码 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&…

【数据结构初阶】树,二叉树

树&#xff0c;二叉树 1.树概念及结构1.1树的概念1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构2.1概念2.2现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质2.5 二叉树的存储结构 1.树概念及结构 1.…

计算机视觉算法——基于Transformer的目标检测(DN DETR / DINO / Sparser DETR / Lite DETR)

计算机视觉算法——基于Transformer的目标检测&#xff08;DN DETR / DINO&#xff09; 计算机视觉算法——基于Transformer的目标检测&#xff08;DN DETR / DINO&#xff09;1. DN DETR1.1 Stablize Hungarian Matching1.2 Denoising1.3 Attention Mask 2. DINO2.1 Contrasti…

Map和Set小总结【温习】

目录 一、概念与模型 二、Map的使用 三、Set的说明 一些小练习 四、哈希表 1.概念 2.冲突 2.1、概念 2.2、冲突-->避免 2.3、冲突-->解决 &#xff08;1&#xff09;闭散列 &#xff08;2&#xff09;开散列 2.4、其他问题 一、概念与模型 1.概念&#xff1a…

全程云OA SQL注入漏洞复现

0x01 产品简介 全程云OA为企业提供日常办公管理、公文管理、工作请示、汇报、档案、知识体系、预算控制等26个功能&#xff0c;超过100多个子模块。为企业内部提供高效、畅通的信息渠道&#xff0c;同时也能大力推动公司信息系统发展&#xff0c;提高企业的办公自动化程度和综合…

wangeditor实时预览

<template><div><!--挂载富文本编辑器--><div style"width: 45%;float: left;margin-left: 2%"><p>编辑内容</p><div id"editor" style"height: 100%"></div></div><div style"w…

基于halo框架采用docker-compose快速部署个人博客

halo快速部署个人博客 技术方案 dockerdocker-composenginxmysql halo简介 Halo是一款现代化的开源博客/CMS系统&#xff0c;所有代码开源在GitHub上且处于积极维护状态。它是基于 Java Spring Boot 构建的&#xff0c;易于部署&#xff0c;支持REST API、模板系统、附件系…

二叉树算法—后继节点

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 后继节点1.1 解题思路1.2 代码实现 &#x1f48e;总结 1 后继节点 1.1 解题思路 二叉树节点结构定义如下&#xff1a; public static class Node { public int cal; public Node left; public Node right; public…

记一次处理大数据而导致的内存溢出问题

问题 订单服务通过MQ进行订单同步时&#xff0c;刚启动可以正常消费&#xff0c;但是跑一会就会卡住&#xff0c;每次都是第8个kafka分区不行再进行消费&#xff0c;其他分区消费的很慢。 现象 首先&#xff0c;CPU超高&#xff0c;达到百分之300多&#xff1b;其次&#xf…

纯新手发布鸿蒙的第一个java应用

第一个java开发鸿蒙应用 1.下载和安装华为自己的app开发软件DevEco Studio HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 2.打开IDE新建工程&#xff08;当前用的IDEA 3.1.1 Release&#xff09; 选择第一个&#xff0c;其他的默认只能用(API9)版本&#xff0c;…

【教学类-06-09】20231126 X-Y数字分合-分-下空右

结果展示&#xff1a; 背景需求&#xff1a; 1、加减法理论上在幼儿园不适用&#xff08;虽然实际上幼儿在家早就练习了&#xff09; 2、分合题是大班教学数上涉及的内容&#xff0c;可以尝试&#xff08;类似于减法、加法&#xff09;可以用雪花片等实物进行增加、减少。——…

【教学类-06-13】20231126 (55格版)趣味题(一)1-9加法题(10倍)(整十相加)

作品展示 背景需求&#xff1a; 1、会做加法题的孩子5分钟内完成题目&#xff0c;太快了&#xff0c;所以为了拉平差异&#xff0c;需要给这些会做另外的题目&#xff0c;比如提供一些他们没有做过的“趣味题形”。 2、好多次&#xff0c;听见大班孩子在互相“考试”——“老…

数据结构与算法Java版本单元测验题

1.【实验题 2-2】实现以下对单链表的操作&#xff0c;题意和算法描述见《习题解答》图 2-7。 //将单链表 list 逆转&#xff0c;将各结点的 next 指向其前驱。泛型方法&#xff0c;返回值类型前声明类型参数 T public static void reverse(SinglyList list) 【思考题 2-6】实现…

Horizon地平线财富一直坚持“创新、开放、协作、共享”的运营理念

在“寒风凛冽”的熊市&#xff0c;投资人需要一颗不断探索、勇于尝试的心。 勇气意味着即使你知道这条路很难&#xff0c;你仍然选择坚持。而信念则是相信&#xff0c;即使现在很多人不理解、甚至嘲笑&#xff0c;未来总会有一天他们会明白。 Horizon一直坚持着“创新、开放、…

4 时间序列预测入门: LSTM+ATTENTION

0 前沿 注意力机制其本质是一种通过网络自主学习出的一组权重系数&#xff0c;并以“动态加权”的方式来强调我们所感兴趣的区域同时抑制不相关背景区域的机制。核心目标也是从众多信息中选择出对当前任务目标更关键的信息。 Multi-Head Attention&#xff08;MHA&#xff09;&…

一网打尽异步神器CompletableFuture

Future接口以及它的局限性 我们都知道&#xff0c;Java中创建线程的方式主要有两种方式&#xff0c;继承Thread或者实现Runnable接口。但是这两种都是有一个共同的缺点&#xff0c;那就是都无法获取到线程执行的结果&#xff0c;也就是没有返回值。于是在JDK1.5 以后为了解决这…

C# WPF上位机开发(掌握一点c#基础)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 wpf虽然比较简单&#xff0c;但是最好还是要有一点c#的基础比较好。本身wpf有点类似于web开发&#xff0c;前端和html差不多&#xff0c;后端则和j…

2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷任务书

2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷任务书 2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&am…

【推荐系统】MMOE笔记 20231126

paper阅读 任务差异带来的固有冲突实际上会损害至少某些任务的预测&#xff0c;特别是当模型参数在所有任务之间广泛共享时。&#xff08;在说ESMM&#xff09; 共享底层参数可以减少过拟合风险&#xff0c;但是会遇到任务差异引起的优化冲突&#xff0c;因为所有任务都需要在…

CRC 循环冗余检测

目录 一、基础知识1.异或运算xor2.模2算术&#xff08;1&#xff09;模2加法和减法&#xff08;2&#xff09;模2乘法&#xff08;3&#xff09;模2除法 二、CRC循环冗余检测1.背景2.原理3.求R 一、基础知识 1.异或运算xor 异或&#xff0c;顾名思义&#xff0c;只有当两个数…