找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6292|回复: 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)
回复

使用道具 举报

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 单片机教程网

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