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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32貪吃蛇游戲程序編寫(帶觸摸功能)

  [復制鏈接]
跳轉到指定樓層
樓主
給大家分享一個stm32貪吃蛇游戲程序
程序內的觸摸控制功能使用的是240*400分辨率的TFT彩屏,如果你的彩屏不是這個尺寸,出現觸摸位置不正確,你需要修改主函數內的觸摸參數判斷。具體可以看主函數。

程序僅供參考,如有問題可參考實驗例程內的一些基礎程序理解


單片機源程序如下:
  1. /* 文件比較大,使用自帶的下載軟件不能完全燒寫進去,因此請使用JLINK進行程序下載
  2.         下載后請按照LCD提示操作
  3.         1.可以使用按鍵操作貪吃蛇方向
  4.         2.可以使用觸摸控制貪吃蛇方向及游戲開始和暫停
  5.         3.游戲結束后按復位按鍵開始*/

  6. #include "sys.h"
  7. #include "delay.h"
  8. #include "usart.h"
  9. #include "led.h"
  10. #include "button.h"
  11. #include "lcd_driver.h"
  12. #include "gui.h"
  13. #include "tim.h"
  14. #include "rtc.h"
  15. #include "stdlib.h"
  16. #include "flash.h"
  17. #include "touch.h"
  18. #include "snake.h"


  19. #define SNAKE_Max_Long 50//蛇的最大長度
  20. u8 pause=0;
  21. u8 start=0;

  22. //蛇結構體
  23. struct Snake
  24. {
  25.         s16 X[SNAKE_Max_Long];
  26.         s16 Y[SNAKE_Max_Long];
  27.         u8 Long;//蛇的長度
  28.         u8 Life;//蛇的生命 0活著 1死亡
  29.         u8 Direction;//蛇移動的方向
  30. }snake;

  31. //食物結構體
  32. struct Food
  33. {
  34.         u8 X;//食物橫坐標
  35.         u8 Y;//食物縱坐標
  36.         u8 Yes;//判斷是否要出現食物的變量 0有食物 1需要出現食物
  37. }food;

  38. //游戲等級分數
  39. struct Game
  40. {
  41.         u16 Score;//分數
  42.         u8 Life;//游戲等級        
  43. }game;

  44. void touch(void)
  45. {        
  46.         static u8 start=0;
  47.         key=keyscan(0);        
  48.         if(TOUCH_Scan() == 0)
  49.         {               
  50.                 start=1;
  51.         }        
  52.         if(start==1)
  53.         {                                
  54.                
  55.                 if((key==K_UP_PRESS||(TouchData.lcdx>88&&TouchData.lcdx<152&&TouchData.lcdy>192&&TouchData.lcdy<224))&&snake.Direction!=4)                //上
  56.                 {
  57.                         TouchData.lcdx=0;
  58.                         TouchData.lcdy=0;
  59.                         snake.Direction=3;
  60.                 }
  61.                 if((key==K_DOWN_PRESS||(TouchData.lcdx>88&&TouchData.lcdx<152&&TouchData.lcdy>266&&TouchData.lcdy<298))&&snake.Direction!=3)           //下
  62.                 {
  63.                         TouchData.lcdx=0;
  64.                         TouchData.lcdy=0;
  65.                         snake.Direction=4;
  66.                 }
  67.                 if((key==K_LEFT_PRESS||(TouchData.lcdx>19&&TouchData.lcdx<83&&TouchData.lcdy>229&&TouchData.lcdy<261))&&snake.Direction!=1)           //左
  68.                 {
  69.                         TouchData.lcdx=0;
  70.                         TouchData.lcdy=0;
  71.                         snake.Direction=2;
  72.                 }
  73.                 if((key==K_RIGHT_PRESS||(TouchData.lcdx>157&&TouchData.lcdx<221&&TouchData.lcdy>229&&TouchData.lcdy<261))&&snake.Direction!=2)          //右
  74.                 {
  75.                         TouchData.lcdx=0;
  76.                         TouchData.lcdy=0;
  77.                         snake.Direction=1;
  78.                 }
  79.                 if(((TouchData.lcdx>174&&TouchData.lcdx<238&&TouchData.lcdy>286&&TouchData.lcdy<318)))//暫停
  80.                 {
  81.                         TouchData.lcdx=0;
  82.                         TouchData.lcdy=0;
  83.                         pause=1;  //暫停        
  84.                 }
  85.                 if(((TouchData.lcdx>1&&TouchData.lcdx<65&&TouchData.lcdy>286&&TouchData.lcdy<318)))//開始
  86.                 {
  87.                         TouchData.lcdx=0;
  88.                         TouchData.lcdy=0;
  89.                         pause=0;  //開始        
  90.                 }
  91.                
  92.         
  93.         }
  94. }
  95. void TIM3_IRQHandler(void)
  96. {
  97.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)!= RESET)
  98.         {
  99.                 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  100.                 touch();
  101.         }
  102. }  


  103. //游戲結束
  104. void gameover()
  105. {
  106.         start=0;//停止游戲

  107.         Test_Show_CH_Font24(80,65,0,RED);               
  108.         Test_Show_CH_Font24(104,65,1,RED);               
  109.         Test_Show_CH_Font24(128,65,2,RED);               
  110.         Test_Show_CH_Font24(152,65,3,RED);               
  111.         Test_Show_CH_Font24(176,65,4,RED);               
  112.         GUI_Show12ASCII(224,165,"0",BLACK,GRAY);//顯示生命值        
  113. }

  114. //玩游戲
  115. void play()
  116. {
  117.         u16 i,n;//i蛇的關節數 n用來判斷食物和蛇的身體是否重合
  118.         u8 life_buf[2];
  119.         u8 socre_buf[4];
  120.         snake.Long=2;//定義蛇的長度
  121.         snake.Life=0;//蛇還活著
  122.         snake.Direction=1;//蛇的起始方向定義為右
  123.         game.Score=0;//分數為0
  124.         game.Life=4;//蛇的生命值
  125.         food.Yes=1;//出現新食物
  126.         snake.X[0]=12;snake.Y[0]=24;
  127.         snake.X[1]=12;snake.Y[1]=24;

  128.         while(1)
  129.         {
  130.                         if(food.Yes==1)//出現新的食物
  131.                         {
  132.                                 while(1)
  133.                                 {
  134.                                                 //在設定的區域內顯示食物               
  135.                                                 //food.X=12+rand()%(240/12)*12;
  136.                                                 //        food.Y=12+rand()%(160/12)*12;
  137.                                                 srand(calendar.sec);//添加隨機種子 采用的RTC時鐘
  138.                                                 food.X=12+rand()%(228/12)*12;
  139.                                                 food.Y=12+rand()%(148/12)*12;
  140.                                                 for(n=0;n<snake.Long;n++)
  141.                                                 {
  142.                                                         if(food.X==snake.X[n]&&food.Y==snake.Y[n])
  143.                                                                 break;
  144.                                                 }
  145.                                                 if(n==snake.Long)
  146.                                                 food.Yes=0;        
  147.                                                 break;
  148.                                         }
  149.                         }
  150.                                 
  151.                                 if(food.Yes==0)//有食物就要顯示
  152.                                 {        
  153.                                         GUI_Box(food.X,food.Y,food.X+10,food.Y+10,RED);
  154.                                 }
  155.                                 //取得需要重新畫的蛇的節數
  156.                                 for(i=snake.Long-1;i>0;i--)
  157.                                 {
  158.                                         snake.X[i]=snake.X[i-1];
  159.                                         snake.Y[i]=snake.Y[i-1];
  160.                                 }
  161.                                 //通過觸摸屏來設置蛇的運動方向
  162.                                 switch(snake.Direction)
  163.                                 {
  164.                                         case 1:snake.X[0]+=12;break;//向右運動
  165.                                         case 2:snake.X[0]-=12;break;//向左運動
  166.                                         case 3:snake.Y[0]-=12;break;//向上運動
  167.                                         case 4:snake.Y[0]+=12;break;//向下運動
  168.                                 }
  169.                                         for(i=0;i<snake.Long;i++)//畫出蛇        
  170.                                                 GUI_Box(snake.X[i],snake.Y[i],snake.X[i]+10,snake.Y[i]+10,BLUE);//畫蛇身體
  171.                                                 while(pause==1){};
  172.                                                 delay_ms(500);//延時
  173.                                                 GUI_Box(snake.X[snake.Long-1],snake.Y[snake.Long-1],snake.X[snake.Long-1]+10,snake.Y[snake.Long-1]+10,GRAY);//消除蛇身               
  174.                                                 
  175.                                        
  176.                                         //判斷是否撞墻
  177.                                         if(snake.X[0]<0||snake.X[0]>240||snake.Y[0]<0||snake.Y[0]>150)
  178.                                                 snake.Life=1;//蛇死掉了
  179.                         
  180.                                         //當蛇的身體超過3節后判斷蛇自身的碰撞
  181.                                         for(i=3;i<snake.Long;i++)
  182.                                         {
  183.                                                 if(snake.X[i]==snake.X[0]&&snake.Y[i]==snake.Y[0])//自身的任一坐標值與蛇頭坐標相等就認為是自身碰撞
  184.                                                         game.Life-=1;
  185.                                         }
  186.                                         if(snake.Life==1||game.Life==0)//以上兩種判斷以后如果蛇死掉了跳出內循環,重新開始
  187.                                         {
  188.                                                 gameover();
  189.                                                 break;
  190.                                         }        
  191.                                         //判斷蛇是否吃到了食物
  192.                                         if(snake.X[0]==food.X&&snake.Y[0]==food.Y)
  193.                                         {
  194.                                                 GUI_Box(food.X,food.Y,food.X+10,food.Y+10,GRAY);//把吃到的食物消除
  195.                                                 if(!((snake.Long==SNAKE_Max_Long)&&(snake.Long==SNAKE_Max_Long)))
  196.                                                 snake.Long++;//蛇的身體長一節
  197.                                                 game.Score+=10;
  198.                                                 socre_buf[0]=game.Score/100+0x30;
  199.                                                 socre_buf[1]=game.Score%100/10+0x30;
  200.                                                 socre_buf[2]=game.Score%100%10+0x30;
  201.                                                 socre_buf[3]='\0';
  202.                                                 GUI_Show12ASCII(40,165,socre_buf,BLACK,GRAY);//顯示成績        
  203.                                                 food.Yes=1;//需要重新顯示食物
  204.                                         }
  205.                                            life_buf[0]=game.Life%10+0x30;
  206.                                            life_buf[1]='\0';
  207. ……………………

  208. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
貪吃蛇游戲(帶觸摸功能).zip (5.04 MB, 下載次數: 241)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2017-5-30 01:46 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:308507 發表于 2018-4-17 22:54 | 只看該作者
我想請問一下,我用串口燒錄,燒錄沒有問題,但是發送選項字節然后有問題,程序也不能運行,黑屏,想請教下您
回復

使用道具 舉報

地板
ID:308507 發表于 2018-4-19 19:56 | 只看該作者
HARDWARE文件為啥沒有
回復

使用道具 舉報

5#
ID:314829 發表于 2018-4-23 22:24 | 只看該作者
123456lp 發表于 2018-4-19 19:56
HARDWARE文件為啥沒有

你可以把光盤里的程序兩個合在一起,就是一個新的項目
也可以多去實驗室簽到,就問題不大
回復

使用道具 舉報

6#
ID:247623 發表于 2018-9-21 11:44 | 只看該作者
原理圖沒有的嗎
回復

使用道具 舉報

7#
ID:393586 發表于 2018-9-25 13:07 | 只看該作者
這個不錯不錯
回復

使用道具 舉報

8#
ID:237159 發表于 2019-4-24 15:18 | 只看該作者
厲害了,感謝分享
回復

使用道具 舉報

9#
ID:513219 發表于 2019-4-24 21:51 | 只看該作者
課程設計就靠這個了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎午夜剧场 | 欧美日产国产成人免费图片 | 免费啪啪 | 成人av在线播放 | 全免费a级毛片免费看视频免费下 | 日本一区二区在线视频 | 日韩欧美视频免费在线观看 | 欧美精品三区 | 日韩午夜| 久久国产一区 | 欧美精品在线一区 | 日韩精品一区二区三区在线观看 | 国产精品久久精品 | 免费毛片在线 | 国产精品高清一区二区三区 | 国产精品99久久久久久宅男 | 国产视频91在线 | 九色视频网站 | 欧美激情va永久在线播放 | 精品欧美乱码久久久久久 | 日本天堂一区 | 国产精品九九 | 老牛影视av一区二区在线观看 | 日韩国产专区 | 亚洲国产成人精品久久 | 国产夜恋视频在线观看 | 亚洲女人天堂成人av在线 | 九九热精品视频在线观看 | 欧美一级精品片在线看 | 欧美久久久网站 | 精品亚洲一区二区 | 中文字幕一区二区三区四区五区 | 日韩高清国产一区在线 | 性欧美hd| 男人天堂久久久 | 亚洲不卡在线视频 | 日韩欧美一区二区三区免费看 | av一二三区| 理论片午午伦夜理片影院 | 国产一区二区三区四区 | 999久久久久久久久 国产欧美在线观看 |