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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7040|回復: 7
收起左側

基于stm32f103VE的貪吃蛇小游戲源程序

  [復制鏈接]
ID:583948 發表于 2019-7-14 16:09 | 顯示全部樓層 |閱讀模式
按鍵控制,液晶屏顯示

外接按鍵原理圖,接單片機引腳PC10,PC11

外接按鍵原理圖,接單片機引腳PC10,PC11

開機動畫

開機動畫

游戲開始界面

游戲開始界面

單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include <stdio.h>
  3. #include "./key/bsp_exti.h"
  4. #include "./usart/bsp_usart.h"        
  5. #include "./lcd/bsp_ili9341_lcd.h"
  6. #include "./SysTick/bsp_SysTick.h"
  7. #include "./flash/bsp_spi_flash.h"
  8. #include "./key/bsp_key.h"

  9. static void LCD_Test(void);        
  10. uint32_t time = 0;
  11. char str[20];
  12. uint16_t  key_flag=0;
  13. uint16_t  tiaozhuan=0;   
  14. char dispBuff[100];
  15. #define SNAKE_Max_Long 100
  16. static void Delay ( __IO uint32_t nCount );

  17. void LCD_Test(void);
  18. void boot_animation(void);
  19. void play(void);

  20. struct Snake   
  21. {
  22.         uint16_t X[SNAKE_Max_Long];
  23.         uint16_t Y[SNAKE_Max_Long];     //最大長度
  24.         u8 Long;   
  25.         u8 Life;// 0活著 1死亡
  26.         u8 Direction;//蛇移動的方向
  27. }snake;    //蛇的結構體

  28. struct Food  
  29. {
  30.         u8 X;
  31.         u8 Y;
  32.         u8 Yes;  //0有食物 1需要出現食物
  33. }food;   //食物結構體

  34. struct Game  
  35. {
  36.         u16 Score;
  37.         u8 Life;
  38. }game;    游戲結構體


  39. void KEY1_IRQHandler(void)     
  40. {
  41.         if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)     //判斷按鍵中斷
  42.         {   
  43.                 tiaozhuan=1;   跳轉到游戲開始界面               
  44.                 key_flag=2;
  45.                 if(key_flag==2&&snake.Direction!=1)        
  46.                 snake.Direction=2;     //看下面程序對方向的描述
  47.                 EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);           //清除標志位        
  48.         }  
  49. }

  50. void KEY2_IRQHandler(void)    //同按鍵1一樣原理
  51. {
  52.         if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
  53.         {
  54.                 key_flag=1;
  55.                 if(key_flag==1&&snake.Direction!=2)
  56.                 snake.Direction=1;
  57.                 EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     
  58.         }  
  59.         
  60.         if(EXTI_GetITStatus(KEY3_INT_EXTI_LINE) != RESET)
  61.         {
  62.                 key_flag=3;
  63.                 if(key_flag==3&&snake.Direction!=4)
  64.                   snake.Direction=3;
  65.                 EXTI_ClearITPendingBit(KEY3_INT_EXTI_LINE);     
  66.         }  
  67.         
  68.                 if(EXTI_GetITStatus(KEY4_INT_EXTI_LINE) != RESET)
  69.         {
  70.                 key_flag=4;
  71.                 if(key_flag==4&&snake.Direction!=3)
  72.                  snake.Direction=4;
  73.                 EXTI_ClearITPendingBit(KEY4_INT_EXTI_LINE);     
  74.         }
  75. }

  76. void gameover()       //游戲結束函數
  77. {
  78.         LCD_SetTextColor(RED);
  79.         ILI9341_DispStringLine_EN(LINE(10),"          game over!");        
  80. }

  81. void finish()       //完成挑戰函數
  82. {
  83.         LCD_SetTextColor(RED);
  84.         sprintf(dispBuff,"          恭喜你完成挑戰");
  85.         ILI9341_DispStringLine_EN_CH(LINE(10),dispBuff);
  86. }

  87. void play(void)    //開始游戲函數
  88. {
  89.         u16 i;        
  90.         snake.Long=2;    //初始化蛇長為2
  91.         snake.Life=0;
  92.         snake.Direction=1;//蛇的起始方向定義為右
  93.         game.Life=1;//蛇的生命值
  94.         food.Yes=1;//出現新食物
  95.         snake.X[0]=0;snake.Y[0]=50;    初始化蛇坐標
  96.         snake.X[1]=10;snake.Y[1]=50;

  97.         ILI9341_Clear(90,130,60,60);
  98.         ILI9341_Clear(80,120,80,80);
  99.         ILI9341_Clear(70,110,100,100);
  100.         ILI9341_Clear(60,100,120,120);
  101.         ILI9341_Clear(50,90,140,140);
  102.         ILI9341_Clear(40,80,160,160);
  103.         ILI9341_Clear(30,70,180,180);
  104.         ILI9341_Clear(20,60,200,200);
  105.         ILI9341_Clear(10,50,220,220);
  106.                 while(1)
  107.         {
  108.                 LCD_SetColors(CYAN,BLACK);
  109.                 sprintf(dispBuff,"          貪吃蛇游戲");
  110.                 ILI9341_DispStringLine_EN_CH(LINE(1),dispBuff);
  111.                
  112.                 sprintf(dispBuff,"分數 : %d                       ",game.Score);
  113.                 LCD_SetColors(WHITE,BLACK);
  114.                 ILI9341_DispStringLine_EN_CH(LINE(18),dispBuff);
  115.                
  116.                 LCD_SetColors(WHITE,BLACK);
  117.                 ILI9341_DrawRectangle(0,40,240,240,0);
  118.                         if(food.Yes==1)
  119.                         {        
  120.                                 food.X=rand()%(230/10)*10;
  121.                                 food.Y=rand()%(230/10)*10;    //隨機函數放置食物
  122.                                 if((food.X<240)&&(food.Y<260&&food.Y>40))    //如果食物不在范圍內,則重新放置
  123.                                 {
  124.                                         food.Yes=0;
  125.                                 }
  126.                                 else
  127.                                 {
  128.                                         food.Yes=1;
  129.                                 }
  130.                         }
  131.                         if(food.Yes==0)
  132.                         {        
  133.                                  LCD_SetColors(BLUE,BLACK);
  134.                                 
  135.                                  ILI9341_DrawRectangle (food.X,food.Y,10,10,1);               顯示食物
  136.                         }
  137.                         
  138.                         for(i=snake.Long-1;i>0;i--)      //刷新蛇
  139.                         {
  140.                                 snake.X[i]=snake.X[i-1];
  141.                                 snake.Y[i]=snake.Y[i-1];
  142.                         }

  143.                         switch(snake.Direction)   //對方向的描述,按鍵中斷控制
  144.                         {
  145.                                 case 1:snake.X[0]+=10;break;//向右運動
  146.                                 case 2:snake.X[0]-=10;break;//向左運動
  147.                                 case 3:snake.Y[0]-=10;break;//向上運動                                
  148.                                 case 4:snake.Y[0]+=10;break;//向下運動        
  149.                         }
  150.                         for(i=0;i<snake.Long;i++)        
  151.                                        
  152.                         ILI9341_DrawRectangle(snake.X[i],snake.Y[i],10,10,1);
  153.                         Delay(0xFFFFF);
  154.                         
  155.                         LCD_SetTextColor        (BLACK)        ;
  156.                         ILI9341_DrawRectangle(snake.X[snake.Long-1],snake.Y[snake.Long-1],10,10,1);//消除蛇身               
  157.                         LCD_SetTextColor                (RED)        ;
  158.                   //判斷是否撞墻
  159.                         if(snake.X[0]<0||snake.X[0]>230||snake.Y[0]<40||snake.Y[0]>260)   
  160.                                         snake.Life=1;
  161.                         
  162.                         for(i=3;i<snake.Long;i++)   
  163.                         {
  164.                                 if(snake.X[i]==snake.X[0]&&snake.Y[i]==snake.Y[0])   //判斷撞自己
  165.                                 {
  166.                                         game.Life=0;
  167.                                 }
  168.                         }
  169.                         if(snake.Life==1||game.Life==0)
  170.                         {
  171.                         gameover();     //游戲結束
  172.                         game.Score =0;
  173.                                 
  174.                         Delay(0xFFFFFF);
  175.                         Delay(0xFFFFFF);   //延時大約兩秒重新開始游戲
  176.                                                                         
  177.                         ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);        
  178.                         break;
  179.                         }
  180.                         
  181.                         //判斷蛇是否吃到了食物
  182.                         if(snake.X[0]==food.X&&snake.Y[0]==food.Y)    //判斷蛇頭與實物的坐標是否一樣
  183.                         {
  184.                                 LCD_SetTextColor        (BLACK)        ;                                                
  185.                                 ILI9341_DrawRectangle(food.X,food.Y,10,10,1);
  186.                                 snake.Long++;     //蛇長加1
  187.                                 game.Score+=10;   //分數加10
  188.                                 food.Yes=1;   
  189.                         }
  190.                   if(game.Score==1000)     //分數達到1000
  191.                         {
  192.                                 finish();      //完成挑戰
  193.                                 game.Score =0;    //分數清零
  194.                                 
  195.                                 Delay(0xFFFFFF);
  196.                                 Delay(0xFFFFFF);
  197.                                                                                 
  198.                                 ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);        
  199.                                 break;
  200.                         }
  201.         }        
  202. }        
  203.         
  204. int main ( void )
  205. {
  206.         ILI9341_GramScan ( 6 );        
  207.         ILI9341_Init ();
  208.         Key_GPIO_Config();
  209.         SysTick_Init();
  210.         LCD_SetFont(&Font8x16);        
  211.         LCD_SetColors(YELLOW,BLACK);
  212.         EXTI_Key_Config();
  213.         ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);
  214.         if(tiaozhuan==0)
  215.                 {
  216.                         boot_animation();
  217.                 }
  218.         while ( 1 )
  219.         {         
  220.                 if(tiaozhuan==1)
  221.                         
  222.           play();
  223.         }
  224. }

  225. void LCD_Test(void)
  226. {
  227.         char dispBuff[200];
  228.         
  229.         LCD_SetTextColor(GREEN);
  230.         sprintf(dispBuff,"          貪吃蛇游戲");
  231.         ILI9341_DispStringLine_EN_CH(LINE(1),dispBuff);
  232.         Delay(0xFFFFF);
  233.         
  234. }


  235. void boot_animation(void)     //開機動畫
  236. {
  237.         char dispBuff1[200];
  238.         
  239.         LCD_Test();
  240.         LCD_SetColors(YELLOW,BLACK);
  241.         ILI9341_DrawRectangle(0,40,240,240,0);
  242.         Delay(0xFFFFF);
  243.         LCD_SetColors(WHITE,BLACK);
  244.         ILI9341_DrawRectangle(10,50,220,220,0);
  245.         Delay(0xFFFFF);
  246.         LCD_SetColors(BLUE,BLACK);
  247.         ILI9341_DrawRectangle(20,60,200,200,0);
  248.         Delay(0xFFFFF);
  249.         LCD_SetColors(RED,BLACK);
  250.         ILI9341_DrawRectangle(30,70,180,180,0);
  251.         Delay(0xFFFFF);
  252.         LCD_SetColors(MAGENTA,BLACK);
  253.         ILI9341_DrawRectangle(40,80,160,160,0);
  254.         Delay(0xFFFFF);
  255.         LCD_SetColors(GREEN,BLACK);
  256.         ILI9341_DrawRectangle(50,90,140,140,0);
  257.         Delay(0xFFFFF);
  258.         LCD_SetColors(CYAN,BLACK);
  259.         ILI9341_DrawRectangle(60,100,120,120,0);
  260.         Delay(0xFFFFF);
  261.         LCD_SetColors(RED,BLACK);
  262.         ILI9341_DrawRectangle(70,110,100,100,0);
  263.         Delay(0xFFFFF);
  264.         LCD_SetColors(GREY,BLACK);
  265.         ILI9341_DrawRectangle(80,120,80,80,0);
  266.         Delay(0xFFFFF);
  267.         LCD_SetColors(GBLUE,BLACK);
  268.         ILI9341_DrawRectangle(90,130,60,60,0);
  269.         Delay(0xFFFFF);
  270.         
  271.         
  272.         LCD_SetTextColor(GREEN);
  273.         sprintf(dispBuff1,"       按K1鍵開始游戲......");
  274.         ILI9341_DispStringLine_EN_CH(LINE(18),dispBuff1);
  275.         Delay(0xFFFFF);
  276. }

  277. static void Delay ( __IO uint32_t nCount )   //延時函數
  278. {
  279.   for ( ; nCount != 0; nCount -- );
  280. }
復制代碼

所有資料51hei提供下載:
貪吃蛇.7z (217.19 KB, 下載次數: 122)
F103-指南者-原理圖.pdf (172.93 KB, 下載次數: 44)

回復

使用道具 舉報

ID:1 發表于 2019-7-14 22:41 | 顯示全部樓層
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

ID:282095 發表于 2019-7-15 09:16 | 顯示全部樓層
請問硬件部分和系統架構呢
回復

使用道具 舉報

ID:583948 發表于 2019-7-15 11:43 | 顯示全部樓層
外接了兩個按鍵,PC10,PC11.
回復

使用道具 舉報

ID:669130 發表于 2019-12-31 22:04 | 顯示全部樓層
這個是mini的

貪吃蛇基于MINISTM32.7z

241.94 KB, 下載次數: 25, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:772899 發表于 2020-6-8 15:40 | 顯示全部樓層
大佬有超級瑪麗奧的不
回復

使用道具 舉報

ID:816545 發表于 2020-9-4 19:49 | 顯示全部樓層
下載到板子上好像不能控制移動
回復

使用道具 舉報

ID:903602 發表于 2021-4-11 18:56 | 顯示全部樓層
怎么
控制移動謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文一区二区 | 亚洲视频一 | 蜜臀久久99精品久久久久久宅男 | 亚洲黄色av | 免费成人高清在线视频 | 日韩一区二区在线观看视频 | 人人亚洲 | 国产偷录视频叫床高潮对白 | 国产精品久久久亚洲 | 午夜免费视频 | 亚洲 中文 欧美 日韩 在线观看 | 国产无套一区二区三区久久 | 亚洲人成人一区二区在线观看 | 国产精品视频500部 a久久 | 成人性视频免费网站 | 欧区一欧区二欧区三免费 | 四虎永久免费黄色影片 | 狠狠色综合网站久久久久久久 | 欧洲免费毛片 | 又爽又黄axxx片免费观看 | 国产精品久久久久永久免费观看 | 亚洲成人天堂 | 国产色视频网站 | 蜜臀av日日欢夜夜爽一区 | 在线观看中文字幕 | 成人欧美一区二区三区白人 | 欧美电影一区 | 中文字幕在线剧情 | 男女黄网站 | 美女视频久久 | 欧美激情亚洲 | 一区二区三区电影在线观看 | 91免费入口 | 视频在线一区二区 | 免费福利视频一区二区三区 | 国产一区二区三区在线看 | 日本免费网 | 久久精品久久综合 | 亚洲欧美在线观看视频 | 欧美成人猛片aaaaaaa | 欧美性视频在线播放 |