STM32实现贪吃蛇_第1页
STM32实现贪吃蛇_第2页
STM32实现贪吃蛇_第3页
STM32实现贪吃蛇_第4页
STM32实现贪吃蛇_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、STM32实现贪吃蛇STM32学习笔记二 竹天笑题记:离写第一篇学习笔记,已经好久了,那时还在学校,而我已经离开那个使我忧伤使我愁的地方。走的时候,荷花差不多谢了,西大的荷花花期是那么长,而总是要谢了。花看了三年,只是离开的时候想再看看,却没有了。来公司快两个星期了,上班下班办手续,洗被子洗衣服,订门窗理柜子。哎,没心没肺的,匆匆忙忙的过完一天又一天,还没来得及伤感,就赶上了忙碌。工作就黑压压的埋过来来了,好在晚上还不要加班。乘晚上还有点空,就把这个在学ucgui的时候想测试ucgui各函数功能的东西,花了一个晚上写完,写到12点多,只好做了简单的测试,没问题,算是半实验品吧,里面肯定存在很多

2、问题,纯属自娱自乐。呵呵,界面非常简单要点:1、触摸屏校准信息保存在SD卡,不必每次开机都校准。(读写SD卡,请参阅野火SD的教程,触摸屏校准信息保存在SD卡,请参阅定点原子SD的教程。)2、随机函数的实现,一般都是用定时器实现随机种子,我用的是时钟实现随机种子。(请百度随机函数。)3、蛇的算法。(自己想的,可能有BUG,每次移动时候,头移动,尾消去,中间的不变。)4、触摸按键的实现。(按键检测本来想放在外部中断中(触摸中断),但是发现怎么也搞不定,最后只好放在延时程序中,求大神指教。)5、测试用:截屏函数的实现。(请参照野火SD的教程,本人用的是红牛三代的屏,如果屏要读屏数据点的话,初始化的

3、读数据时序要放长一些,不然会读出花点,如果只是显示,那么写时序可以短一点。)6、画界面:界面的范围是x:0-239,y:0-239。由于蛇点的大小是4*4个像素点组成,因此,将坐标缩小到x/y:0-59。除去外框0和59,因此蛇可以出现的位置是x/y:1-58。同样随机点(是不是应该称为食物?)出现的位置是x/y:1-58。废话少说,还是直接上程序。随机函数:uint8_t rand_dot(void) uint8_t r;srand(RTC_GetCounter(); /产生随机种子,实现真正的随机函数,如果没有此句就是伪随机函数。r=rand()%58+1;/将随机函数产生点的范围放到1-

4、58 return r;RTC的初始化是固定格式,不在此处贴出。画点函数:(将一个点扩展成4*4,另外除去四个角上的点,就类似于圆形了。)void My_DrawPoint(uint8_t x,uint8_t y)uint8_t i;GUI_SetPenSize(1);for(i=0;i<2;i+)GUI_DrawPoint(x*4+i+1,y*4);for(i=0;i<4;i+)GUI_DrawPoint(x*4+i,y*4+1);for(i=0;i<4;i+)GUI_DrawPoint(x*4+i,y*4+2);for(i=0;i<2;i+)GUI_DrawPoin

5、t(x*4+i+1,y*4+3);全局参数#define snake_MaxLength 20/最大长度int8_t snake_xDiv=1;/0上,0下,-1左,1右int8_t snake_yDiv=0;/-1上,1下,0左,0右uint8_t snake_OK;/确定uint8_t snake_Length=1;/蛇的长度,初始化为1uint8_t xPossnake_MaxLength;/存蛇每个数据点的x轴坐标uint8_t yPossnake_MaxLength;/存蛇每个数据点的y轴坐标uint8_t i,flag;/标志量uint8_t rand_x,rand_y;/随机点的

6、坐标uint16_t snake_Speed=1000;/蛇的速度,延时函数的参数:1000最慢,100最快uint8_t snake_Score=0;/分数/注意,防止数据截断,u8:0-255,有正有负时要用符号。一不小心就出错了。初始化界面的参数:#define countof(Array) (sizeof(Array)/sizeof(Array0)/画外框,从x:0-239,y:0-239,外框厚度4.const GUI_POINT aPoints=0,0,239,0,239,239,0,239;const GUI_POINT bPoints=1,1,238,1,238,238,1,2

7、38;const GUI_POINT cPoints=2,2,237,2,237,237,2,237;const GUI_POINT dPoints=3,3,236,3,236,236,3,236;/画按键,按键大小长20,宽20.const GUI_POINT aButtons=0,0,20,0,20,20,0,20;初始化界面:void snake_Init(void)GUI_SetBkColor(GUI_RED);GUI_SetColor(GUI_YELLOW); GUI_Clear();GUI_SetPenSize(1);/画外框GUI_DrawPolygon(aPoints,coun

8、tof(aPoints),0,0);GUI_DrawPolygon(bPoints,countof(bPoints),0,0);GUI_DrawPolygon(cPoints,countof(cPoints),0,0);GUI_DrawPolygon(dPoints,countof(dPoints),0,0);GUI_SetColor(GUI_BLUE); /画分数GUI_SetFont(&GUI_FontHZ_SimSun_16); GUI_DispStringAt("分数:",250,20);GUI_DispDec(snake_Score,3);/画速度GUI_

9、DispStringAt("速度:",250,40);switch(snake_Speed)/将速度参数转化成习惯显示形式case 1000:GUI_DispString("1");break;case 900:GUI_DispString("2");break;case 800:GUI_DispString("3");break;case 700:GUI_DispString("4");break;case 600:GUI_DispString("5");break;cas

10、e 500:GUI_DispString("6");break;case 400:GUI_DispString("7");break;case 300:GUI_DispString("8");break;case 200:GUI_DispString("9");break;case 100:GUI_DispString("10");break;/画按键GUI_FillPolygon(aButtons,countof(aButtons),270,155);/上GUI_FillPolygon(aBu

11、ttons,countof(aButtons),245,180);/左GUI_FillPolygon(aButtons,countof(aButtons),295,180);/右GUI_FillPolygon(aButtons,countof(aButtons),270,205);/下GUI_FillPolygon(aButtons,countof(aButtons),270,180);/确认/初始化蛇出现的点xPos0=29;yPos0=29;GUI_SetColor(GUI_YELLOW);My_DrawPoint(xPossnake_Length-1,yPossnake_Length-1

12、);/开始按钮while(1)delay_ms(10);if(snake_OK=1)snake_OK=0;break;/随机食物的点,不能出现在蛇身上rand_x=rand_dot();rand_y=rand_dot();i=0;while(i<1)if(rand_x=xPos0&&rand_y=xPos0)flag=1;/如果出现在蛇身上,重新取点i+;if(flag=1)rand_x=rand_dot();/重新取点rand_y=rand_dot();/重新取点flag=0;/标志量清零i=0;GUI_SetColor(GUI_BLUE);My_DrawPoint(r

13、and_x,rand_y);/延时函数:请参照定点原子的systick的例程。void delay_ms(uint16_t nms) uint32_t temp = delay_fac_ms * nms; if (temp > 0x00ffffff) temp = 0x00ffffff; SysTick_SetReload(temp); /* 时间加载 */ SysTick_CounterCmd(SysTick_Counter_Clear); /* 清空计数器 */ SysTick_CounterCmd(SysTick_Counter_Enable); /* 开始倒数 */ do/将按键

14、检测放在延时循环中if(touch_flag = 1)/*如果触笔按下了*/ if(getDisplayPoint(&display, Read_Ads7846(), &matrix )!=DISABLE) Move_Div(display.x,display.y);/按键检测程序 / Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT); while (Status != SET); /* 等待时间到达 */ SysTick_CounterCmd(SysTick_Counter_Disable); /* 关闭计数器 */SysT

15、ick_CounterCmd(SysTick_Counter_Clear); /* 清空计数器 */按键检测程序void Move_Div(uint16_t Xpos,uint16_t Ypos) if(Xpos>=270&&Xpos<=290&&Ypos>=155&&Ypos<=175)/上 snake_xDiv=0;snake_yDiv=-1; else if(Xpos>=245&&Xpos<=265&&Ypos>=180&&Ypos<=200)/

16、左 snake_xDiv=-1;snake_yDiv=0; else if(Xpos>=295&&Xpos<=315&&Ypos>=180&&Ypos<=200)/右 snake_xDiv=1;snake_yDiv=0; else if(Xpos>=270&&Xpos<=290&&Ypos>=205&&Ypos<=225)/下 snake_xDiv=0;snake_yDiv=1; else if(Xpos>=270&&Xpos&l

17、t;=290&&Ypos>=180&&Ypos<=200)/确定 snake_OK=1; 主程序:int main(void) TP_Init(); /触摸屏初始化 delay_init();/延时初始化GUI_Init();/UCGUI初始化FSMC_Configuration();/读触摸屏初始化RTC_Init();/时钟初始化while(TouchPanel_Calibrate()!=0);/触摸屏校准,只需一次校准即可。参数存在SD卡中。snake_Init();/界面初始化while(1) /如果蛇吃到了食物if(xPossnake_Le

18、ngth-1+snake_xDiv)=rand_x)&&(yPossnake_Length-1+snake_yDiv)=rand_y)snake_Length+;/长度增加xPossnake_Length-1=xPossnake_Length-2+snake_xDiv;/新增加的蛇点yPossnake_Length-1=yPossnake_Length-2+snake_yDiv;GUI_SetColor(GUI_YELLOW);My_DrawPoint(xPossnake_Length-1,yPossnake_Length-1);rand_x=rand_dot();/产生新的食

19、物rand_y=rand_dot();i=0;while(i<snake_Length)/产生的食物不能出现在蛇身上if(rand_x=xPosi&&rand_y=xPosi)flag=1;i+;if(flag=1)rand_x=rand_dot();rand_y=rand_dot();flag=0;i=0;GUI_SetColor(GUI_BLUE);My_DrawPoint(rand_x,rand_y);snake_Score+;/分数增加GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_FontHZ_SimSun_16); G

20、UI_DispStringAt("分数:",250,20);/显示分数GUI_DispDec(snake_Score,3);if(snake_Length=snake_MaxLength)/过关长度GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_Font6x8);GUI_DispStringAt("Passed",100,110);delay_ms(5000);switch(snake_Speed)/速度增加case 1000:snake_Speed=900;break;case 900:snake_Speed=

21、800;break;case 800:snake_Speed=700;break;case 700:snake_Speed=600;break;case 600:snake_Speed=500;break;case 500:snake_Speed=400;break;case 400:snake_Speed=300;break;case 300:snake_Speed=200;break;case 200:snake_Speed=100;break;case 100:snake_Speed=1000;break;snake_Length=1;/重置蛇长度snake_Init();/界面初始化elseflag=0;/置蛇没撞物体标志量if(xPossnake_Length-1+snake_xDiv>58)|(xPossnake_Length-1+snake_xDiv<1)|(yPossnake_Length-1+snake_yDiv>58)|(yPossnake_Length-1+snake_yDiv<1)/判断蛇有没有撞墙flag=1;for(i=0;i<snake_Length-2;i+)/判断蛇有没有撞蛇,但是不知道为什么不管用if(xPossnake_Length-1+snake_xDiv=xP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论