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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7003|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:583948 發(fā)表于 2019-7-14 16:09 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
按鍵控制,液晶屏顯示

單片機(jī)源程序如下:
  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];     //最大長(zhǎng)度
  24.         u8 Long;   
  25.         u8 Life;// 0活著 1死亡
  26.         u8 Direction;//蛇移動(dòng)的方向
  27. }snake;    //蛇的結(jié)構(gòu)體

  28. struct Food  
  29. {
  30.         u8 X;
  31.         u8 Y;
  32.         u8 Yes;  //0有食物 1需要出現(xiàn)食物
  33. }food;   //食物結(jié)構(gòu)體

  34. struct Game  
  35. {
  36.         u16 Score;
  37.         u8 Life;
  38. }game;    游戲結(jié)構(gòu)體


  39. void KEY1_IRQHandler(void)     
  40. {
  41.         if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)     //判斷按鍵中斷
  42.         {   
  43.                 tiaozhuan=1;   跳轉(zhuǎn)到游戲開(kāi)始界面               
  44.                 key_flag=2;
  45.                 if(key_flag==2&&snake.Direction!=1)        
  46.                 snake.Direction=2;     //看下面程序?qū)Ψ较虻拿枋?br />
  47.                 EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);           //清除標(biāo)志位        
  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()       //游戲結(jié)束函數(shù)
  77. {
  78.         LCD_SetTextColor(RED);
  79.         ILI9341_DispStringLine_EN(LINE(10),"          game over!");        
  80. }

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

  87. void play(void)    //開(kāi)始游戲函數(shù)
  88. {
  89.         u16 i;        
  90.         snake.Long=2;    //初始化蛇長(zhǎng)為2
  91.         snake.Life=0;
  92.         snake.Direction=1;//蛇的起始方向定義為右
  93.         game.Life=1;//蛇的生命值
  94.         food.Yes=1;//出現(xiàn)新食物
  95.         snake.X[0]=0;snake.Y[0]=50;    初始化蛇坐標(biāo)
  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,"分?jǐn)?shù) : %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;    //隨機(jī)函數(shù)放置食物
  122.                                 if((food.X<240)&&(food.Y<260&&food.Y>40))    //如果食物不在范圍內(nèi),則重新放置
  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)   //對(duì)方向的描述,按鍵中斷控制
  144.                         {
  145.                                 case 1:snake.X[0]+=10;break;//向右運(yùn)動(dòng)
  146.                                 case 2:snake.X[0]-=10;break;//向左運(yùn)動(dòng)
  147.                                 case 3:snake.Y[0]-=10;break;//向上運(yùn)動(dòng)                                
  148.                                 case 4:snake.Y[0]+=10;break;//向下運(yùn)動(dòng)        
  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();     //游戲結(jié)束
  172.                         game.Score =0;
  173.                                 
  174.                         Delay(0xFFFFFF);
  175.                         Delay(0xFFFFFF);   //延時(shí)大約兩秒重新開(kāi)始游戲
  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)    //判斷蛇頭與實(shí)物的坐標(biāo)是否一樣
  183.                         {
  184.                                 LCD_SetTextColor        (BLACK)        ;                                                
  185.                                 ILI9341_DrawRectangle(food.X,food.Y,10,10,1);
  186.                                 snake.Long++;     //蛇長(zhǎng)加1
  187.                                 game.Score+=10;   //分?jǐn)?shù)加10
  188.                                 food.Yes=1;   
  189.                         }
  190.                   if(game.Score==1000)     //分?jǐn)?shù)達(dá)到1000
  191.                         {
  192.                                 finish();      //完成挑戰(zhàn)
  193.                                 game.Score =0;    //分?jǐn)?shù)清零
  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)     //開(kāi)機(jī)動(dòng)畫(huà)
  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鍵開(kāi)始游戲......");
  274.         ILI9341_DispStringLine_EN_CH(LINE(18),dispBuff1);
  275.         Delay(0xFFFFF);
  276. }

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

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2019-7-14 22:41 | 只看該作者
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

板凳
ID:282095 發(fā)表于 2019-7-15 09:16 | 只看該作者
請(qǐng)問(wèn)硬件部分和系統(tǒng)架構(gòu)呢
回復(fù)

使用道具 舉報(bào)

地板
ID:583948 發(fā)表于 2019-7-15 11:43 | 只看該作者
外接了兩個(gè)按鍵,PC10,PC11.
回復(fù)

使用道具 舉報(bào)

5#
ID:669130 發(fā)表于 2019-12-31 22:04 | 只看該作者
這個(gè)是mini的

貪吃蛇基于MINISTM32.7z

241.94 KB, 下載次數(shù): 25, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

6#
ID:772899 發(fā)表于 2020-6-8 15:40 | 只看該作者
大佬有超級(jí)瑪麗奧的不
回復(fù)

使用道具 舉報(bào)

7#
ID:816545 發(fā)表于 2020-9-4 19:49 | 只看該作者
下載到板子上好像不能控制移動(dòng)
回復(fù)

使用道具 舉報(bào)

8#
ID:903602 發(fā)表于 2021-4-11 18:56 | 只看該作者
怎么
控制移動(dòng)謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜欧美一区二区三区在线播放 | 中文字幕一区二区三区在线观看 | 中文字幕 国产精品 | 精品视频在线播放 | 成人免费看黄 | 日韩亚洲一区二区 | 欧美激情久久久久久 | 国产精品日韩一区二区 | 一级毛片视频在线观看 | 亚洲一区二区免费 | 91精品国产一区二区三区 | 亚洲网在线 | 久久午夜精品 | 黄色网址免费在线观看 | 久久久亚洲 | 91精品久久久久久久久久入口 | 精精精精xxxx免费视频 | 欧美在线视频免费 | 91日韩在线 | 亚洲成人精品一区 | 欧美成人一区二区三区 | 国产95在线 | 日韩一区二区黄色片 | 日韩一区二区在线视频 | 一级h片| 99久久精品国产毛片 | 国产精品久久久久久久久久久久久久 | 久久亚洲国产精品 | 欧美精品综合在线 | 国产高清精品一区 | 中文字幕精品一区久久久久 | av二区三区 | 亚洲在线 | 亚洲精品乱码久久久久久黑人 | 久久国产一区二区 | 精品国产伦一区二区三区观看说明 | 毛色毛片免费看 | 午夜影院网站 | 久久国产精品一区 | 国产一区二区三区四区区 | 久久久久久久一级 |