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

文章目录

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


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用IIC OLED模块、按键等。

主要功能:
系统运行后,OLED显示游戏界面,可通过K1-K4键控制蛇的方向,当蛇吃到食物,得分加1;K1左,K2右,K3上,K4下。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)*/void GUI_Init()//界面初始化
{OLED_Clear();Snake_Init();Food();OLED_Refresh();	
}void GUI_Refresh(int map[32][12])//界面刷新
{int i,j,temp;for(i=0;i<32;i++){for(j=0;j<12;j++){temp=map[i][j];if(temp==2){Paint_Body(i,j);  }else if(temp==-2){Paint_Map(i,j);  }else if(temp==-1){Paint_Food(i,j);  }else if(temp==0){Paint_Clean(i,j);  } 		  }}OLED_Refresh();}void Creat_map(int map[32][12])//创建地图
{int i,j;for(i=0;i<12;i++){for(j=0;j<32;j++){if(i==0||i==11){map[j][i]=-2;}if(j==0||j==31){map[j][i]=-2;}}}
}
void Paint_Map(int x,int y)//绘制地图
{int i,j;for(i=4*y;i<4*y+4;i++)     {for(j=4*x;j<4*x+4;j++){OLED_DrawPoint(j,i+16); }}}void Paint_Head(int x,int y )//绘制蛇头
{int i,j;for(i=4*y;i<4*y+4;i++)     {for(j=4*x;j<4*x+4;j++){OLED_DrawPoint(j,i+16); }}
}void Paint_Food(int x,int y )//绘制食物
{int i,j;for(i=4*y;i<4*y+4;i++)     {for(j=4*x;j<4*x+4;j++){if(i==4*y+1||i==4*y+2){OLED_DrawPoint(j,i+16);  }if(j==4*x+1||j==4*x+2){OLED_DrawPoint(j,i+16);  } }}}
void Paint_Tail(int x,int y )//绘制尾巴
{int i,j;for(i=4*y;i<4*y+4;i++)     {for(j=4*x;j<4*x+4;j++){if(i==4*y+1||i==4*y+2){OLED_DrawPoint(j,i+16);  }if(j==4*x+1||j==4*x+2||j==4*x+3){OLED_DrawPoint(j,i+16);  } }}}
void Paint_Body(int x,int y )//绘制身体
{int i,j;for(i=4*y;i<4*y+4;i++)     {for(j=4*x;j<4*x+4;j++){if(i==4*y||i==4*y+3){OLED_DrawPoint(j,i+16);  }if(j==4*x||j==4*x+3){OLED_DrawPoint(j,i+16);  }}}
}
void Paint_Clean(int x,int y )//清除点
{int i,j;for(i=4*y;i<4*y+4;i++)     {for(j=4*x;j<4*x+4;j++){OLED_ClearPoint(j,i+16);  }}
}void Snake_Init()//蛇及食物初始化
{  int i;length=5;score=0;snake_Grid[0][0]=7;//x坐标,蛇头坐标snake_Grid[0][1]=5;//y坐标for(i=1;i<5;i++){snake_Grid[i][0]=snake_Grid[0][0]-i;snake_Grid[i][1]=snake_Grid[0][1];  //给刚开始的蛇身几个初始坐标}direction=RIGHT;Creat_map(map);
}void Move()//移动
{int i;map[snake_Grid[length-1][0]][snake_Grid[length-1][1]]=0;//清除尾巴if(eated)               //如果吃到了食物{length++;eated=false;        //设置为false,不然无限变长}for(i=length-1;i>0;i--)    //从尾巴开始,每一个点的位置等于它前面一个点的位置{snake_Grid[i][0]=snake_Grid[i-1][0];snake_Grid[i][1]=snake_Grid[i-1][1];}switch(direction){case UP:snake_Grid[0][1]--;break;case DOWN:snake_Grid[0][1]++;break;case LEFT:snake_Grid[0][0]--;break;case RIGHT:snake_Grid[0][0]++;break;}Grid_Bound();//坐标限定}
void drawSnake()            //画蛇
{int i,x,y;for(i=0;i<length;i++){x=snake_Grid[i][0];y=snake_Grid[i][1];map[x][y]=2;       }
}
void Get_Command()//获取键盘值
{int key=0;key=KEY_Scan(0);if(key){switch(key){case 1:if(direction!=RIGHT)         //上direction=LEFT;break;case 2:if(direction!=LEFT)           //下direction=RIGHT;break;case 3:if(direction!=DOWN)        //左direction=UP;break;case 4:if(direction!=UP)         //右direction=DOWN;break;}}
}void  Grid_Bound()//坐标限定
{if(snake_Grid[0][0]==31)snake_Grid[0][0]=1;else if(snake_Grid[0][0]==0)snake_Grid[0][0]=30;else if(snake_Grid[0][1]==11)snake_Grid[0][1]=1;else if(snake_Grid[0][1]==0)snake_Grid[0][1]=10;  }bool GameOver()//游戏结束
{bool isGameOver=false;int sx=snake_Grid[0][0],sy=snake_Grid[0][1],i;//蛇头坐标for(i=1; i<length; i++)    //判断有没有吃到自己{if(snake_Grid[i][0]==sx&&snake_Grid[i][1]==sy)isGameOver=true;}return isGameOver;
}int Chek(int i,int j)//检查地图空位
{if(map[i][j]!=0){return 0;}return 1;   //是空位就返回1
}void Food()//生成食物
{int i,j;do{i=rand()%30;                 //生成0~H-1之间的一个数j=rand()%10;}while(Chek(i,j)==0);map[i][j]=-1;//画出食物
}void Eat_Food()//吃食物
{if(map[snake_Grid[0][0]][snake_Grid[0][1]]==-1) //如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0{eated=true;            //标记已经吃到食物score+=1;Food();map[snake_Grid[0][0]][snake_Grid[0][1]]=0;  //去掉食物}
}void Show_Score()//显示分数
{OLED_ShowString(30,0,"Score:",16);OLED_ShowNum(80,0,score,2,16);}

三、实验现象

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


联系作者

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

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

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

相关文章

【腾讯云 HAI域探秘】借助高性能服务HAI快速学会Stable Diffusion生成AIGC图片——必会技能【微调】

目录 Stable Diffusion基本使用方法 学术加速测试 配置中文插件 Prompt与Negative prompt 采样器说明 人像生成 水光效果 微调的使用 图像生成种子/seed使用 附加/Extra 微调实例测试 图生图微调 ​编辑 使用蒙版微调 Stable Diffusion基本使用方法 环境配置&am…

【机器学习】亚马逊云科技基础知识:以推荐系统为例。你知道机器学习的关键所在么?| 机器学习管道的各个阶段及工作:以Amazon呼叫中心转接问题为例讲解

有的时候,暂时的失利比暂时胜利要好得多。 ————经典网剧《mao pian》,邵半仙儿 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP

大象慧云:从设立分部到迁移总部 与贵阳贵安共筑税务数字化未来

近年来&#xff0c;贵阳贵安着力提升政务服务水平&#xff0c;通过擦亮“贵人服务”品牌&#xff0c;持续优化营商环境。在这样的环境下&#xff0c;再加上“大数据基因”&#xff0c;对于希望在大数据领域大展拳脚的企业来说&#xff0c;贵阳贵安无疑成为了一个极具吸引力的选…

【ZYNQ】AXI4总线接口协议学习

建议翻看着底部的参考文档资料和本文一起辅助阅读 本文带你详细的了解AXI总线协议&#xff0c;并且基于官方手册&#xff0c;能够提高你的手册阅读能力。 什么是AXI AXI 的英文全称是 Advanced eXtensible Interface&#xff0c;即高级可扩展接口&#xff0c;它是 ARM 公司所提…

自激活T细胞为肿瘤免疫治疗提供新思路—高分文献分享

CD28是在所有小鼠和人类T细胞上表达的共刺激受体&#xff0c;用来调节T细胞受体(TCR) 的响应。异常的CD28 信号传导是癌症、自身免疫和病毒感染中T细胞功能障碍的决定性特征之一。早期的一些研究表明CD28对CD4 T细胞更重要&#xff0c;但也有越来越多的研究者发现其对CD8 T细胞…

HAT(CVPR 2023):Hybrid Attention Transformer for Image Restoration

HAT ​ 论文地址&#xff1a;HAT: Hybrid Attention Transformer for Image Restoration ​ 代码地址&#xff1a;XPixelGroup/HAT: CVPR2023 - Activating More Pixels in Image Super-Resolution Transformer 摘要 ​ 通过归因分析attribution analysis method - Local …

智能科技企业网站搭建的作用是什么

随着科学技术快速提升&#xff0c;各种智能产品随之而来&#xff0c;每个赛道里都涌入了大量企业商家&#xff0c;有些热门产品更是广受关注&#xff0c;对企业来说&#xff0c;形象、品牌、信息等方面需要完美呈现到用户眼前&#xff0c;而网站无疑是很好的工具。 企业通过【…

lwIP 细节之四:recv 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程&#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数&#xff0c;注册到协议栈&#xff0c;在适当的时候&#xff0c;由协议栈自动调用&#xff0c;所以称为回调。 注&#xff1a;除非特别说明&#xff0c;以下内…

常用whl文件地址整理

文章目录 一、Deep Graph Library&#xff08;DGL&#xff09;二、torch torchvision torchaudio三、numpy四、pandas可留言其他whl文件地址&#xff0c;不定期更新 一、Deep Graph Library&#xff08;DGL&#xff09; DGL是一个专门用于深度学习图形的Python包, 一款面向图神…

代码随想录算法训练营第50天| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

JAVA代码编写 123.买卖股票的最佳时机III 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 **注意&#xff1a;**你不能同时参与多笔交易&#xff08;你必须在再次购买前出…

HDPE硅芯管材具有优异的耐腐蚀性、耐磨损性和耐老化性

HDPE硅芯管材作为一种优质的管道材料&#xff0c;具有许多突出的性能。其中&#xff0c;其优异的耐腐蚀性、耐磨损性和耐老化性是其主要特点之一。 首先&#xff0c;HDPE硅芯管材具有出色的耐腐蚀性。它的高密度聚乙烯&#xff08;HDPE&#xff09;材料具有良好的耐腐蚀性能&a…

2023快速上手新红利项目:短剧分销推广CPS

短剧分销推广CPS是一个新红利项目&#xff0c;对于新手小白来说也可以快速上手。 以下是一些建议&#xff0c;帮助新手小白更好地进行短剧分销推广CPS&#xff1a; 学习基础知识&#xff1a;了解短剧的基本概念、制作流程和推广方式。了解短剧的市场需求和受众群体&#xff0c…

STM32F030C8读取CS1237采集模拟

STM32F030C8读取CS1237采集模拟 Chapter1 【问题解决记录】STM32F030C8读取CS1237采集模拟问题描述原因分析&#xff1a;解决方案&#xff1a; Chapter2 CS1237 STM32控制程序以及原理图需要注意事项 Chapter1 【问题解决记录】STM32F030C8读取CS1237采集模拟 原文链接&#x…

【技术分享】常见VLAN部署方式

VLAN部署方式&#xff1a; 第一种End-to-End VLAN&#xff08;端到端VLAN&#xff09; 全局部署的VLAN&#xff0c;VLAN信息可以扩展到整个网络&#xff08;换句话说就是每台交换机上VLAN信息一致&#xff09; 将用户分组到与物理位置无关的VLAN中&#xff1b;如果用户在园区…

第7章:深度剖析知识图谱中的知识推理:方法与应用探究

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

《算法通关村——回溯模板如何解决回溯问题》

《算法通关村——回溯模板如何解决回溯问题》 93. 复原 IP 地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.1…

【活动回顾】ABeam News | 兰州大学外国语学院回访ABeam 旗下德硕管理咨询(上海),持续推进远景合作

访企拓岗深入调研 持续推进远景合作 继11月上旬ABeam旗下艾宾信息技术开发&#xff08;西安&#xff09;团队一行拜访兰州大学并举行隆重的校企签约仪式后&#xff0c;近日兰州大学一行领导也如约莅临德硕管理咨询&#xff08;上海&#xff09;有限公司开展拓岗调研。 深化…

线上业务优化之案例实战

本文是我从业多年开发生涯中针对线上业务的处理经验总结而来&#xff0c;这些业务或多或少相信大家都遇到过&#xff0c;因此在这里分享给大家&#xff0c;大家也可以看看是不是遇到过类似场景。本文大纲如下&#xff0c; 后台上传文件 线上后台项目有一个消息推送的功能&#…

实物+3D动画展示离心式过滤器的工作原理 #雨水收集#雨水过滤

产品规格型号 规格型号&#xff1a;LLLXGL-100、LLLXGL-150、LLLXGL-200、LLLXGL-300

第一届古剑山ctf-pwn全部题解

1. choice 附件&#xff1a; https://github.com/chounana/ctf/blob/main/2023%E7%AC%AC%E4%B8%80%E5%B1%8A%E5%8F%A4%E5%89%91%E5%B1%B1pwn/choice.zip 漏洞代码&#xff1a; 漏洞成因&#xff1a; byte_804A04C输入的长度可以覆盖nbytes的值&#xff0c;导致后面输入时存…