久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2296|回復: 0
打印 上一主題 下一主題
收起左側

STM32F407貪吃蛇游戲源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:880136 發表于 2021-2-23 09:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "system.h"
  2. #include "SysTick.h"
  3. #include "led.h"
  4. #include "usart.h"
  5. #include "tftlcd.h"
  6. #include "time.h"
  7. #include "key.h"
  8. #include "snake.h"
  9. #include "rtc.h"
  10. #include "stdlib.h"



  11. #define SNAKE_Max_Long 50//蛇的最大長度
  12. u8 pause=0;
  13. u8 start=0;

  14. //蛇結構體
  15. struct Snake
  16. {
  17.         s16 X[SNAKE_Max_Long];
  18.         s16 Y[SNAKE_Max_Long];
  19.         u8 Long;//蛇的長度
  20.         u8 Life;//蛇的生命 0活著 1死亡
  21.         u8 Direction;//蛇移動的方向
  22. }snake;

  23. //食物結構體
  24. struct Food
  25. {
  26.         u8 X;//食物橫坐標
  27.         u8 Y;//食物縱坐標
  28.         u8 Yes;//判斷是否要出現食物的變量 0有食物 1需要出現食物
  29. }food;

  30. //游戲等級分數
  31. struct Game
  32. {
  33.         u16 Score;//分數
  34.         u8 Life;//游戲等級        
  35. }game;

  36. void touch(void)
  37. {        
  38.         key=KEY_Scan(0);        
  39.         
  40.         if(key==KEY_UP_PRESS&&snake.Direction!=4)                //上
  41.         {
  42.                 snake.Direction=3;
  43.         }
  44.         if(key==KEY1_PRESS&&snake.Direction!=3)           //下
  45.         {
  46.                 snake.Direction=4;
  47.         }
  48.         if(key==KEY2_PRESS&&snake.Direction!=1)           //左
  49.         {
  50.                 snake.Direction=2;
  51.         }
  52.         if(key==KEY0_PRESS&&snake.Direction!=2)          //右
  53.         {
  54.                 snake.Direction=1;
  55.         }
  56. }
  57. void TIM2_IRQHandler(void)
  58. {
  59.         if(TIM_GetITStatus(TIM2,TIM_IT_Update)!= RESET)
  60.         {
  61.                 touch();
  62.                 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);        
  63.         }
  64. }  


  65. //游戲結束
  66. void gameover()
  67. {
  68.         start=0;//停止游戲
  69.         Test_Show_CH_Font24(80,65,0,RED);               
  70.         Test_Show_CH_Font24(104,65,1,RED);               
  71.         Test_Show_CH_Font24(128,65,2,RED);               
  72.         Test_Show_CH_Font24(152,65,3,RED);               
  73.         Test_Show_CH_Font24(176,65,4,RED);               
  74.         FRONT_COLOR=BLACK;
  75.         BACK_COLOR=GRAY;
  76.         LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16,"0");//顯示生命值        
  77. }

  78. //玩游戲
  79. void play()
  80. {
  81.         u16 i,n;//i蛇的關節數 n用來判斷食物和蛇的身體是否重合
  82.         u8 life_buf[2];
  83.         u8 socre_buf[4];
  84.         snake.Long=2;//定義蛇的長度
  85.         snake.Life=0;//蛇還活著
  86.         snake.Direction=1;//蛇的起始方向定義為右
  87.         game.Score=0;//分數為0
  88.         game.Life=4;//蛇的生命值
  89.         food.Yes=1;//出現新食物
  90.         snake.X[0]=12;snake.Y[0]=24;
  91.         snake.X[1]=12;snake.Y[1]=24;

  92.         while(1)
  93.         {
  94.                         if(food.Yes==1)//出現新的食物
  95.                         {
  96.                                 while(1)
  97.                                 {
  98.                                                 //在設定的區域內顯示食物               
  99.                                                 //food.X=12+rand()%(240/12)*12;
  100.                                                 //food.Y=12+rand()%(160/12)*12;
  101.                                                 srand(rtc_sec);//添加隨機種子 采用的RTC時鐘
  102.                                                 food.X=12+rand()%(228/12)*12;
  103.                                                 food.Y=12+rand()%(148/12)*12;
  104.                                                 for(n=0;n<snake.Long;n++)
  105.                                                 {
  106.                                                         if(food.X==snake.X[n]&&food.Y==snake.Y[n])
  107.                                                                 break;
  108.                                                 }
  109.                                                 if(n==snake.Long)
  110.                                                 food.Yes=0;        
  111.                                                 break;
  112.                                         }
  113.                         }
  114.                                 
  115.                                 if(food.Yes==0)//有食物就要顯示
  116.                                 {        
  117.                                         LCD_Fill(food.X,food.Y,food.X+10,food.Y+10,RED);
  118.                                 }
  119.                                 //取得需要重新畫的蛇的節數
  120.                                 for(i=snake.Long-1;i>0;i--)
  121.                                 {
  122.                                         snake.X[i]=snake.X[i-1];
  123.                                         snake.Y[i]=snake.Y[i-1];
  124.                                 }
  125.                                 //通過按鍵來設置蛇的運動方向
  126.                                 switch(snake.Direction)
  127.                                 {
  128.                                         case 1:snake.X[0]+=12;break;//向右運動
  129.                                         case 2:snake.X[0]-=12;break;//向左運動
  130.                                         case 3:snake.Y[0]-=12;break;//向上運動
  131.                                         case 4:snake.Y[0]+=12;break;//向下運動
  132.                                 }
  133.                                 for(i=0;i<snake.Long;i++)//畫出蛇        
  134.                                 LCD_Fill(snake.X[i],snake.Y[i],snake.X[i]+10,snake.Y[i]+10,BLUE);//畫蛇身體
  135.                                 while(pause==1){};
  136.                                 delay_ms(500);//延時
  137.                                 LCD_Fill(snake.X[snake.Long-1],snake.Y[snake.Long-1],snake.X[snake.Long-1]+10,snake.Y[snake.Long-1]+10,GRAY);//消除蛇身               
  138.                                                 
  139.                                        
  140.                                 //判斷是否撞墻
  141.                                 if(snake.X[0]<0||snake.X[0]>240||snake.Y[0]<0||snake.Y[0]>150)
  142.                                         snake.Life=1;//蛇死掉了
  143.                
  144.                                 //當蛇的身體超過3節后判斷蛇自身的碰撞
  145.                                 for(i=3;i<snake.Long;i++)
  146.                                 {
  147.                                         if(snake.X[i]==snake.X[0]&&snake.Y[i]==snake.Y[0])//自身的任一坐標值與蛇頭坐標相等就認為是自身碰撞
  148.                                                 game.Life-=1;
  149.                                 }
  150.                                 if(snake.Life==1||game.Life==0)//以上兩種判斷以后如果蛇死掉了跳出內循環,重新開始
  151.                                 {
  152.                                         gameover();
  153.                                         break;
  154.                                 }        
  155.                                 //判斷蛇是否吃到了食物
  156.                                 if(snake.X[0]==food.X&&snake.Y[0]==food.Y)
  157.                                 {
  158.                                         LCD_Fill(food.X,food.Y,food.X+10,food.Y+10,GRAY);//把吃到的食物消除
  159.                                         if(!((snake.Long==SNAKE_Max_Long)&&(snake.Long==SNAKE_Max_Long)))
  160.                                         snake.Long++;//蛇的身體長一節
  161.                                         game.Score+=10;
  162.                                         socre_buf[0]=game.Score/100+0x30;
  163.                                         socre_buf[1]=game.Score%100/10+0x30;
  164.                                         socre_buf[2]=game.Score%100%10+0x30;
  165.                                         socre_buf[3]='\0';
  166.                                         FRONT_COLOR=BLACK;
  167.                                         BACK_COLOR=GRAY;
  168.                
  169.                                         LCD_ShowString(40,165,tftlcd_data.width,tftlcd_data.height,16,socre_buf);//顯示成績        
  170.                                         food.Yes=1;//需要重新顯示食物
  171.                                 }
  172.                                 life_buf[0]=game.Life%10+0x30;
  173.                                 life_buf[1]='\0';
  174.                         
  175.                                 LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16,life_buf);//顯示生命值        
  176.                 }        
  177. }


  178. int main()
  179. {               
  180.         SysTick_Init(168);
  181.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中斷優先級分組 分2組
  182.         LED_Init();
  183.         KEY_Init();
  184.         USART1_Init(9600);
  185.         TFTLCD_Init();                        //LCD初始化
  186.         LCD_ShowPictureEx(0, 0, 240, 400);
  187.         while(1)
  188.         {
  189.                 if(KEY_Scan(1)==KEY_UP_PRESS)break;
  190.                 FRONT_COLOR=RED;
  191.                 LCD_ShowString(20,10,tftlcd_data.width,tftlcd_data.height,16,"Press K_UP key to Enter...");
  192.                 delay_ms(200);
  193.                 LCD_ShowString(20,10,tftlcd_data.width,tftlcd_data.height,16,"                          ");
  194.                 delay_ms(200);
  195.         }        
  196.         TIM2_Init(50,8399);
  197.         RTC_Config();
  198.         RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);//配置WAKE UP中斷,1秒鐘中斷一次
  199.         LCD_Clear(GRAY);
  200.         show();//畫游戲界面
  201.         play();//玩游戲
  202. }

復制代碼


所有程序: 8-貪吃蛇游戲.rar (772.36 KB, 下載次數: 24)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年无码av片在线 | 久久久免费少妇高潮毛片 | 国产国拍亚洲精品av | 日日操操 | 亚洲成人精品在线 | 日韩欧美手机在线 | 亚洲电影一区二区三区 | 91视频免费黄 | 精品国产乱码久久久久久88av | 欧美黄色性生活视频 | 精品国产女人 | 欧美一二精品 | jizz亚洲人| 视频在线一区 | 操视频网站 | 91综合在线观看 | 亚洲欧美精品国产一级在线 | 日本高清视频在线播放 | 最近中文字幕在线视频1 | 成人在线中文字幕 | 一区二区三区国产精品 | 国产精品久久久久久久久久 | 日韩成人在线观看 | 久久国产精品72免费观看 | 日日夜夜天天 | 亚洲av毛片 | 久久精品无码一区二区三区 | 黑人一级黄色大片 | caoporn国产精品免费公开 | 午夜免费视频 | 日韩欧美国产精品一区二区 | 久久精品青青大伊人av | 国产精品18久久久久久白浆动漫 | 日韩中文一区二区三区 | 一级黄在线观看 | 色视频网站在线观看 | 精品久久一区二区 | 国产一级免费在线观看 | 伊人伊人伊人 | 亚洲精品91 | 国产精品久久久久久久久免费 |