算法的学习与贪吃蛇的实现框架

描述

一. 简介

将前面几篇文章介绍的几个小游戏整合在一起,加入了简陋的数字时钟和图片显示功能,合在一起作为一个小项目分享给大家,希望大家喜欢。只需要两个外设即可实现----显示屏和红外控制模块

二. 功能介绍

作为一个小项目来说,功能还是比较齐全的。 1. 上电开机后,会进行一段开机动画的加载。 2. 然后是主界面的显示,一共包括三个部分,时钟、游戏和相册。 3. 通过红外按键进行选择。 4. 时钟 : 一个简单的时分秒的显示(#^.^#)。 5. 游戏 : 游戏下面又有一个界面显示,用来选择对应的游戏,贪吃蛇,俄罗斯方块和2048,都是一些常规的游戏。 6. 相册:一个简单的二值相册(经过边缘检测后的图像)显示,包括了我预先存储的三张图片。 7. 贪吃蛇: 贪吃蛇部分有必要单独拿出来说说,其中加入了算法部分,利用A*算法,可以自动寻找到食物的位置,并指导贪吃蛇的移动。算法的学习与贪吃蛇结合也是一个值得学习的点,同时也是一个难点。 以上就是本次小项目全部功能了。

三. 实现框架介绍

这次的设计为裸机程序,所以只能采用前后台系统的方式来实现。

前台为我们的应用程序,后外为我们的中断回调函数,里面主要用来红外模块数据的接收,以及时间的产生(贪吃蛇的移动以及俄罗斯方块的下落)。

 前台程序简要介绍

以贪吃蛇部分为例,进入到贪吃蛇部分后,就是清屏将上一个部分的显示清除掉,然后是贪吃蛇的初始化以及使能定时器4,用来记录数据,然后就是一个while循环了。根据不同的按键状态调用不同的函数。退出这个部分也很简单,修改当前的状态,然后break就可以了。其他部分都是如此。

 

  else if(CurrMode == Snake)  //贪吃蛇游戏    {      LCDDMAFullOn(BackGround);      SnakeInit();      TIM_Cmd(TIM4,ENABLE);      while(1)      {        if(KEYState == KEYLEFT)          DirectionChange(MoveLeft);        else if(KEYState == KEYRIGHT)          DirectionChange(MoveRight);        else if(KEYState == KEYUP)          DirectionChange(MoveUp);        else if(KEYState == KEYDOWN)          DirectionChange(MoveDown);        else if(KEYState == KEYRETURN)        {          CurrIndex = 0;          SnakeDestory();          TIM_Cmd(TIM4,DISABLE);          CurrMode = Main;          break;        }      }    }

 

2. 后台程序简要介绍

本次主要用到了两个后台程序,一个是红外数据的接收

 

void EXTI0_IRQHandler(void){  if(EXTI_GetITStatus(EXTI_Line0) != RESET)  {    uint8_t data;    data = InfraredDataRecv();    if(data == InfraredLeft)        KEYState = KEYLEFT;    else if(data == InfraredRight)        KEYState = KEYRIGHT;    else if(data == InfraredUp)        KEYState = KEYUP;    else if(data == InfraredDown)        KEYState = KEYDOWN;    else if(data == InfraredReturn)        KEYState = KEYRETURN;    delay_ms(10);    /*清除标志位 */    EXTI_ClearITPendingBit(EXTI_Line0);  }}
另外一个是定时器中断,其作用可以看注释

 

 

void TIM4_IRQHandler(void){    if(TIM_GetITStatus(TIM4,TIM_IT_Update) == SET)   //判断是否发生中断    {
       if(CurrMode == Snake)            SnakeGame();  //蛇的移动        else if(CurrMode == Tetris)        {            TetrisFlag = 1;   //俄罗斯方块下落标志        }        else if(CurrMode == Clock)        {            DClockFlag = 1;   //数字时钟加一标志        }       TIM_ClearITPendingBit(TIM4,TIM_IT_Update);    //清除中断标识    }}
  
      审核编辑:彭静
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分