STM32实现贪吃蛇.docx

上传人:rrsccc 文档编号:9857961 上传时间:2021-03-30 格式:DOCX 页数:17 大小:19.85KB
返回 下载 相关 举报
STM32实现贪吃蛇.docx_第1页
第1页 / 共17页
STM32实现贪吃蛇.docx_第2页
第2页 / 共17页
STM32实现贪吃蛇.docx_第3页
第3页 / 共17页
STM32实现贪吃蛇.docx_第4页
第4页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《STM32实现贪吃蛇.docx》由会员分享,可在线阅读,更多相关《STM32实现贪吃蛇.docx(17页珍藏版)》请在三一文库上搜索。

1、STM32实现贪吃蛇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;/将随机函数产生

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

5、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;/随机点的坐标uint16_t snake_Speed=1000;/

6、蛇的速度,延时函数的参数: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,238;const GUI_POINT cPoints=2,

7、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,countof(aPoints),0,0);GUI_DrawPoly

8、gon(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_DispStringAt(速度:,250,40);switch(snake_Speed)/将速度

9、参数转化成习惯显示形式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;case 500:GUI_DispString(6);break;case 400:GUI_DispString(7);break;case 300:GUI_DispString(8);break;case 200:GUI_DispString(

10、9);break;case 100:GUI_DispString(10);break;/画按键GUI_FillPolygon(aButtons,countof(aButtons),270,155);/上GUI_FillPolygon(aButtons,countof(aButtons),245,180);/左GUI_FillPolygon(aButtons,countof(aButtons),295,180);/右GUI_FillPolygon(aButtons,countof(aButtons),270,205);/下GUI_FillPolygon(aButtons,countof(aBut

11、tons),270,180);/确认/初始化蛇出现的点xPos0=29;yPos0=29;GUI_SetColor(GUI_YELLOW);My_DrawPoint(xPossnake_Length-1,yPossnake_Length-1); /开始按钮while(1)delay_ms(10);if(snake_OK=1)snake_OK=0;break;/随机食物的点,不能出现在蛇身上rand_x=rand_dot();rand_y=rand_dot();i=0;while(iif(rand_x=xPos0&rand_y=xPos0)flag=1;/如果出现在蛇身上,重新取点i+;if(f

12、lag=1)rand_x=rand_dot();/重新取点rand_y=rand_dot(); /重新取点flag=0; /标志量清零i=0;GUI_SetColor(GUI_BLUE);My_DrawPoint(rand_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

13、(SysTick_Counter_Clear); /* 清空计数器 */SysTick_CounterCmd(SysTick_Counter_Enable); /* 开始倒数 */do/将按键检测放在延时循环中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

14、 != SET); /* 等待时间到达 */ SysTick_CounterCmd(SysTick_Counter_Disable); /* 关闭计数器 */ SysTick_CounterCmd(SysTick_Counter_Clear); /* 清空计数器 */ 按键检测程序void Move_Div(uint16_t Xpos,uint16_t Ypos)if(Xpos=270&Xpossnake_xDiv=0;snake_yDiv=-1;else if(Xpos=245&Xpossnake_xDiv=-1;snake_yDiv=0;else if(Xpos=295&Xpossnake

15、_xDiv=1;snake_yDiv=0;else if(Xpos=270&Xpossnake_xDiv=0;snake_yDiv=1;else if(Xpos=270&Xpossnake_OK=1;主程序:int main(void)TP_Init(); /触摸屏初始化delay_init();/延时初始化GUI_Init();/UCGUI初始化FSMC_Configuration();/读触摸屏初始化RTC_Init();/时钟初始化while(TouchPanel_Calibrate()!=0);/触摸屏校准,只需一次校准即可。参数存在SD卡中。snake_Init();/界面初始化wh

16、ile(1)/如果蛇吃到了食物if(xPossnake_Length-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);ra

17、nd_x=rand_dot();/产生新的食物rand_y=rand_dot();i=0;while(iif(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);GUI_DispStringAt(分数:,250

18、,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=800;break;case 800:snake_Speed=700;break;case 700:s

19、nake_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_xDi

20、v58)|(xPossnake_Length-1+snake_xDivflag=1;for(i=0;iif(xPossnake_Length-1+snake_xDiv=xPosi)&(yPossnake_Length-1+snake_yDiv=yPosi )flag=1;GUI_SetColor(GUI_RED);My_DrawPoint(xPos0,yPos0);for(i=0;ixPosi=xPosi+1;yPosi=yPosi+1;xPossnake_Length-1=xPossnake_Length-1+snake_xDiv;/蛇头移动yPossnake_Length-1=yPossn

21、ake_Length-1+snake_yDiv;GUI_SetColor(GUI_YELLOW);My_DrawPoint(xPossnake_Length-1,yPossnake_Length-1);if(flag=1)/如果撞到物体,重新开始GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_Font6x8);GUI_DispStringAt(Game Over,100,110);while(1)delay_ms(10);if(snake_OK=1)snake_OK=0;break;snake_Speed=1000;snake_Score=0;snake_Length=1;snake_Init();if(snake_OK=1)/截屏函数,测试用。snake_OK=0;Screen_shot(0, 0, 320, 240, /myScreen);/截屏函数,参照野火LCD教程。delay_ms(snake_Speed);/延时,也就是速度。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1