休闲的贪吃蛇! 代码见底部链接!
硬禾学堂“寒假在家一起练”Pocket--编写贪吃蛇,STM32f103R8T6
标签
嵌入式系统
STM32
Fused_Buzzer
更新2021-02-27
855

      首先,偷摸着改题:玩贪吃蛇,自动屏幕调整这个功能好像不大实用,遂换成体感操作。接下来,将以硬件、软件以及软硬件配合三方面展开。


      1.硬件方面:lcd,buzzer,key,mpu6050。四样东西,正确移植程序并整合,同时学会看原理图找引脚。这里有个小插曲,当时移植某个程序的时候,没想到它里面有句__HAL_AFIO_REMAP_SWJ_DISABLE,刷进去之后把swj禁用了,后来去原理图找boot0和boot1,强行从BootLoader启动。(那可真是个精细活)


      2.软件方面,即贪吃蛇程序设计:基于时间推移,依据“添头”+“去尾”两大规则来实现Snake运动机制;根据显存数组,实现死亡以及食物机制。

 FtcU7PXt-z4vy-RmA6D9GYt3EKlV

      上述为程序的主要部分思路,其中最关键的是如何找到当前倒数第二个尾部坐标,即当前尾部坐标移除后的那个尾部坐标---啊---实际上也就是要寻找下一个指令/下一个时间的尾部坐标。
      观看经典贪吃蛇游戏(“当前浏览器无法开始游戏。。。”)后,冥冥之中发现:已知初始状态,一串指令(left,left,up,right。。。)后,Snake的位置是确定且唯一的;头经过的地方,终有一天是尾巴所在的地方=曾经的头是如今的尾。
      那么,要想知道一串指令后尾巴的坐标,必然需要记下曾经的头的踪迹。之后,应该就是靠蛇身长度这个特征回溯,因为没有其他明显的变量了,最多就是+1或者-1。。。机智如我

      于是,简单粗暴,当时直接开了个uint16的大数组兴奋地写啊写,写啊写:高8存x坐标,低8存y坐标;长度么,整个60*10(一秒运动一次,没人会玩贪吃蛇超过10分钟,吧)。
当时真觉得想的没问题啊,build也没报错啊,但一load就黑屏,一度怀疑是reset的问题,之后大半夜的一句句调试过去,在房间里徘徊到怀疑人生,到三点多才发现有可能是数组开大,直接导致的暴毙。。。
      次日,就是和内存斗智斗勇的一天。。。甚至那天晚上躺床上的时候,脑子里还想出环形数组这种东西,csdn一搜---啊---原来有这个名词/概念了,可惜可惜。现在想想,高中vb大题不也是有这种东西吗。。。
      ps:实际上,不光可以从数组进化到环形数组,还可以直接用双向队列的结构来更新Snake的位置,方便还省空间。这真的是和内存斗智斗勇啊。

 

      到这里,可以说软件完备、硬件可用了,但是软硬件的配合可太难了,我一开始先写的按键输入指令,单纯的一个scan+delay,导致有时候按键不太灵光。

      于是,打算用中断,当按下按键,触发中断函数,写到一个变量,主程序则只要读这个变量即可。这想得也没毛病啊,后来好像是因为hal库找中断源多一步,会造成不必要的卡顿,又折回去,改用循环scan+delay,理论上完美制造固定接收区间。

FtNtb7X0W0jZ62S-hFP3QbEvqw0_

这样写mpu6050,玩的时候好像依旧时间间隔不统一,粗想想可能是mpu_dmp_get_data单次执行时间有点长,遂又多了下面一部分,可以稍微改善下游戏体验。。。

FshkMFGYBb4Z23AK2--rAsvTgEvC

      最后,就是游戏框架的设计,加载界面,模式选择界面,游戏界面,死亡界面,回到模式选择界面。不得不说,加载的时候可有真正的游戏那味了!

      哦对,这贪吃蛇不会撞墙死,也没有加速机制,就很休闲,就很nice。

 

文件(大于10mb,遂百度网盘)链接: https://pan.baidu.com/s/18N8_wnSHMmuyhsW6VoSqNw 密码: gthg

团队介绍
西交利物浦
团队成员
沈逸潇
xjtlu
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号