野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27474|回复: 5

分享指南者开发板上能运行的贪吃蛇游戏

[复制链接]
发表于 2017-8-13 15:55:38 | 显示全部楼层 |阅读模式
自己扩展了两个按键
可以实现基础的贪吃蛇游戏功能,
后续想加入游戏等级功能的话只要修改刷新的延时数值就好
希望能有些用吧,毕竟也折腾了几天才弄成
  1. #include "stm32f10x.h"

  2. #include <stdio.h>

  3. #include "./led/bsp_led.h"
  4. #include "./key/bsp_exti.h"
  5. #include "./i2c/bsp_i2c_gpio.h"
  6. #include "./lcd/bsp_ili9341_lcd.h"
  7. #include "./usart/bsp_usart.h"
  8. #include "./SysTick/bsp_SysTick.h"
  9.   
  10. #include "./key/bsp_key.h"  
  11. static void LCD_Test(void);       
  12. uint32_t time = 0;
  13. char str[20];
  14. uint16_t  key_flag=0;
  15. extern mk;
  16. char dispBuff[100];
  17. #define SNAKE_Max_Long 60//é&#223;μ&#196;×&#238;′ó3¤&#182;è
  18. static void Delay ( __IO uint32_t nCount );
  19. //é&#223;&#189;á11ì&#229;
  20. struct Snake
  21. {
  22.         uint16_t X[SNAKE_Max_Long];
  23.         uint16_t Y[SNAKE_Max_Long];
  24.         u8 Long;//é&#223;μ&#196;3¤&#182;è
  25.         u8 Life;//é&#223;μ&#196;éú&#195;ü 0&#187;&#238;×&#197; 1&#203;àí&#246;
  26.         u8 Direction;//é&#223;ò&#198;&#182;ˉμ&#196;·&#189;&#207;ò
  27. }snake;

  28. //ê3&#206;&#239;&#189;á11ì&#229;
  29. struct Food
  30. {
  31.         u8 X;//ê3&#206;&#239;oá×&#248;±ê
  32.         u8 Y;//ê3&#206;&#239;×Y×&#248;±ê
  33.         u8 Yes;//&#197;D&#182;&#207;ê&#199;·&#241;òa3&#246;&#207;&#214;ê3&#206;&#239;μ&#196;±&#228;á&#191; 0óDê3&#206;&#239; 1Dèòa3&#246;&#207;&#214;ê3&#206;&#239;
  34. }food;

  35. //ó&#206;&#207;·μè&#188;&#182;·&#214;êy
  36. struct Game
  37. {
  38.         u16 Score;//·&#214;êy
  39.         u8 Life;//ó&#206;&#207;·μè&#188;&#182;       
  40. }game;

  41. void KEY1_IRQHandler(void)
  42. {
  43.   //è·±£ê&#199;·&#241;2úéúá&#203;EXTI Line&#214;D&#182;&#207;
  44.         if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
  45.         {   key_flag=3;
  46.                 printf("key 1\n");
  47.                 if(key_flag=3&&snake.Direction!=4)
  48.                         snake.Direction=3;
  49.                  printf("Direction=%d\n",snake.Direction);
  50.                 EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     
  51.         }  
  52. }

  53. void KEY2_IRQHandler(void)
  54. {
  55.   //è·±£ê&#199;·&#241;2úéúá&#203;EXTI Line&#214;D&#182;&#207;
  56.         if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
  57.         {
  58.                 key_flag=4;
  59.                 printf("key 2\n");
  60.                 if(key_flag=4&&snake.Direction!=3)
  61.                   snake.Direction=4;
  62.                  printf("Direction=%d\n",snake.Direction);
  63.                 EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     
  64.         }  
  65.        
  66.         if(EXTI_GetITStatus(KEY3_INT_EXTI_LINE) != RESET)
  67.         {
  68.                 key_flag=1;
  69.                 printf("key 3\n");
  70.                 if(key_flag=2&&snake.Direction!=2)
  71.                   snake.Direction=1;
  72.                  printf("Direction=%d\n",snake.Direction);
  73.                 EXTI_ClearITPendingBit(KEY3_INT_EXTI_LINE);     
  74.         }  
  75.        
  76.        
  77.                 if(EXTI_GetITStatus(KEY4_INT_EXTI_LINE) != RESET)
  78.         {
  79.                 key_flag=2;
  80.                 printf("key 4\n");
  81.                 if(key_flag=2&&snake.Direction!=1)
  82.                   snake.Direction=2;
  83.                  printf("Direction=%d\n",snake.Direction);
  84.                 EXTI_ClearITPendingBit(KEY4_INT_EXTI_LINE);     
  85.         }

  86. }

  87. void USART1_IRQHandler(u8 GetData)//′&#174;&#191;ú&#214;D&#182;&#207;
  88. {

  89. if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  90.         {
  91.                 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  92.                 GetData=USART1->DR;
  93.                 mk=GetData;
  94.                 printf("ê&#213;μ&#189;μ&#196;êy&#190;Y£o\n");
  95.           printf("%d\n",GetData);
  96.           
  97.                 printf("0x%x\n",mk);
  98.                 if(mk==0x1)
  99.                 {       
  100.                 snake.Direction=1;
  101.                        
  102.                 }
  103.                 if(GetData==0x2)
  104.                 {
  105.                        
  106.             snake.Direction=2;
  107.                        
  108.                        
  109.                 }
  110.                
  111.        
  112.         }
  113.    
  114. }

  115. //ó&#206;&#207;·&#189;áê&#248;
  116. void gameover()
  117.         {

  118.                         ILI9341_DispStringLine_EN(LINE(1),"          game over!");
  119.                
  120.                 }
  121.                
  122. //í&#230;ó&#206;&#207;·
  123. void play()
  124. {
  125.         u16 i;       
  126.         snake.Long=2;//&#182;¨ò&#229;é&#223;μ&#196;3¤&#182;è
  127.         snake.Life=0;//é&#223;&#187;1&#187;&#238;×&#197;
  128.         snake.Direction=1;//é&#223;μ&#196;&#198;eê&#188;·&#189;&#207;ò&#182;¨ò&#229;&#206;aóò
  129.         game.Score=0;//·&#214;êy&#206;a0
  130.         game.Life=4;//é&#223;μ&#196;éú&#195;ü&#214;μ
  131.         food.Yes=1;//3&#246;&#207;&#214;D&#194;ê3&#206;&#239;
  132.         snake.X[0]=0;snake.Y[0]=50;
  133.         snake.X[1]=10;snake.Y[1]=50;


  134.                 while(1)
  135.         {
  136.                
  137.                    ILI9341_DrawRectangle(0,0,240,270,0);
  138.                

  139.       sprintf(dispBuff,"SCORE : %d ",game.Score);
  140.                
  141.                   ILI9341_DispStringLine_EN(LINE(18),dispBuff);
  142.                         if(food.Yes==1)//3&#246;&#207;&#214;D&#194;μ&#196;ê3&#206;&#239;
  143.                         {
  144.                                 //&#212;úéè&#182;¨μ&#196;&#199;&#248;óò&#196;ú&#207;&#212;ê&#190;ê3&#206;&#239;               

  145.                             food.X=rand()%(230/10)*10;
  146.                                         food.Y=rand()%(260/10)*10;

  147.                                         food.Yes=0;
  148.                         }
  149.                                 if(food.Yes==0)//óDê3&#206;&#239;&#190;íòa&#207;&#212;ê&#190;
  150.                                 {       
  151.                
  152.                                          LCD_SetColors(RED,BLACK);
  153.                                          ILI9341_DrawRectangle  (food.X,food.Y,10,10,1);
  154.                                
  155.                                 }
  156.                                 //è&#161;μ&#195;Dèòa&#214;&#216;D&#194;&#187;-μ&#196;é&#223;μ&#196;&#189;úêy
  157.                                 for(i=snake.Long-1;i>0;i--)
  158.                                 {
  159.                                         snake.X[i]=snake.X[i-1];
  160.                                         snake.Y[i]=snake.Y[i-1];
  161.                                 }

  162.                                
  163.        
  164.                                 switch(snake.Direction)
  165.                                 {
  166.                                         case 1:snake.X[0]+=10;break;//&#207;òóò&#212;&#203;&#182;ˉ
  167.                                         case 2:snake.X[0]-=10;break;//&#207;ò×ó&#212;&#203;&#182;ˉ
  168.                                         case 3:snake.Y[0]-=10;break;//&#207;òé&#207;&#212;&#203;&#182;ˉ
  169.                                
  170.                                         case 4:snake.Y[0]+=10;break;//&#207;ò&#207;&#194;&#212;&#203;&#182;ˉ
  171.                                        
  172.                                        
  173.                                 }
  174.                                         for(i=0;i<snake.Long;i++)//&#187;-3&#246;é&#223;       
  175.                                                
  176.                                 ILI9341_DrawRectangle(snake.X[i],snake.Y[i],10,10,1);//&#187;-é&#223;éíì&#229;
  177.                                
  178.                                

  179.                                
  180.                                          Delay(0xFFFFF);
  181.                                
  182.                                   
  183.                                     LCD_SetTextColor                                                                (BLACK  )        ;
  184.                                                 ILI9341_DrawRectangle(snake.X[snake.Long-1],snake.Y[snake.Long-1],10,10,1);//&#207;&#251;3yé&#223;éí               
  185.                                        
  186.                                          LCD_SetTextColor                                                                (RED  )        ;
  187.                                         //&#197;D&#182;&#207;ê&#199;·&#241;×2&#199;&#189;
  188.                                         if(snake.X[0]==0||snake.X[0]>240||snake.Y[0]==0||snake.Y[0]>270)

  189.                                                 snake.Life=1;//é&#223;&#203;àμ&#244;á&#203;
  190.                
  191.                                         //μ±é&#223;μ&#196;éíì&#229;3&#172;1y3&#189;úoó&#197;D&#182;&#207;é&#223;×&#212;éíμ&#196;&#197;&#246;×2
  192.                                         for(i=3;i<snake.Long;i++)
  193.                                         {
  194.                                                 if(snake.X[i]==snake.X[0]&&snake.Y[i]==snake.Y[0])//×&#212;éíμ&#196;è&#206;ò&#187;×&#248;±ê&#214;μó&#235;é&#223;í·×&#248;±ê&#207;àμè&#190;íè&#207;&#206;aê&#199;×&#212;éí&#197;&#246;×2
  195.                                                 {
  196.                                                         game.Life-=1;
  197.                                                 }
  198.                                         }
  199.                                         if(snake.Life==1||game.Life==0)//ò&#212;é&#207;á&#189;&#214;&#214;&#197;D&#182;&#207;ò&#212;oóè&#231;1&#251;éè&#203;àμ&#244;á&#203;ì&#248;3&#246;&#196;ú&#209;-&#187;·£&#172;&#214;&#216;D&#194;&#191;aê&#188;
  200.                                         {
  201.                                         gameover();
  202.                                                
  203.                                         Delay(0xFFFFFF);
  204.                                         Delay(0xFFFFFF);//&#209;óê±á&#189;&#195;&#235;oó&#214;&#216;D&#194;&#191;aê&#188;ó&#206;&#207;·
  205.                                   
  206.                                                
  207.                                         ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);       
  208.                                         break;
  209.                                         }       
  210.                                         //&#197;D&#182;&#207;é&#223;ê&#199;·&#241;3&#212;μ&#189;á&#203;ê3&#206;&#239;
  211.                                         if(snake.X[0]==food.X&&snake.Y[0]==food.Y)
  212.                                         {
  213.                                                
  214.                                                 LCD_SetTextColor                                                                (BLACK  )        ;
  215.                                         //        ILI9341_DrawRectangle(food.X,food.Y,food.X+1,food.Y+1,1);//°&#209;3&#212;μ&#189;μ&#196;ê3&#206;&#239;&#207;&#251;3y
  216.                                                
  217.                                                 ILI9341_DrawRectangle(food.X,food.Y,10,10,1);//°&#209;3&#212;μ&#189;μ&#196;ê3&#206;&#239;&#207;&#251;3y
  218.                                                 LCD_SetTextColor                                                                (RED  )        ;
  219.                                                 snake.Long++;//é&#223;μ&#196;éíì&#229;3¤ò&#187;&#189;ú
  220.                                                 game.Score+=10;
  221.                                                 //LCD_ShowNum(40,165,game.Score,3,16);//&#207;&#212;ê&#190;3é&#188;¨       
  222.                                                 food.Yes=1;//Dèòa&#214;&#216;D&#194;&#207;&#212;ê&#190;ê3&#206;&#239;
  223.                                         }
  224.                                                 //LCD_ShowNum(224,165,game.Life,1,16);//&#207;&#212;ê&#190;éú&#195;ü&#214;μ       
  225.         }       
  226. }


  227. int main ( void )
  228. {

  229.        
  230.        
  231.         ILI9341_GramScan ( 6 );
  232.    
  233.        
  234.   ILI9341_Init ();
  235.   LED_GPIO_Config();
  236.         USART_Config();       
  237.   Key_GPIO_Config();
  238.   SysTick_Init();
  239.   LCD_SetFont(&Font8x16);
  240.        
  241.         LCD_SetColors(RED,BLACK);
  242.   EXTI_Key_Config();
  243.   ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);
  244.         while ( 1 )
  245.         {
  246.          
  247.           
  248.   ILI9341_DrawRectangle(0,0,240,270,0);
  249.    
  250.                
  251.          printf("test\n");
  252.    play();


  253.         }

  254. }


  255. static void Delay ( __IO uint32_t nCount )
  256. {
  257.   for ( ; nCount != 0; nCount -- );
  258.        
  259. }
复制代码


OFTZIXDF4RJEGS4FWFH[`)4.jpg

我的贪吃蛇游戏.rar

5.76 MB, 下载次数: 423

回复

使用道具 举报

发表于 2017-8-14 09:04:04 | 显示全部楼层
谢谢分享,写得不错啊
回复 支持 反对

使用道具 举报

发表于 2017-8-14 09:23:06 | 显示全部楼层
cool            
回复 支持 反对

使用道具 举报

发表于 2017-11-16 14:02:08 | 显示全部楼层

火哥把这个程序移植到霸道上需要改什么地方呀
回复 支持 反对

使用道具 举报

发表于 2019-4-29 11:07:23 | 显示全部楼层

谢谢分享,写得不错啊
回复 支持 反对

使用道具 举报

发表于 2019-11-23 15:19:00 | 显示全部楼层
down了老哥代码,直接烧指南板子上就能跑,感谢老哥
老哥外接了两个按键做左右,我因为找不到按键,只好该程序了

板子上有两个按键,老哥定义的是上、下,我是加了一个条件判断,当判断&#128013;蛇运动方向已经处于上下状态时,修改按键的功能为左右,从而实现了两个按键修改四个方向的功能


把我修改后的发出来,大家指导指导。

我的贪吃蛇游戏_修改后.zip

7.83 MB, 下载次数: 163

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 20:20 , Processed in 0.029167 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表