单片机交流
直播中

王兰

13年用户 1660经验值
擅长:基础元器件
私信 关注
[问答]

怎样去开发一种基于STM32战舰V3开发板平台的贪吃蛇游戏

怎样去开发一种基于STM32战舰V3开发板平台的贪吃蛇游戏?有哪些操作步骤?

回帖(1)

王建军

2021-9-3 17:16:12
  基于STM32战舰V3开发板的贪吃蛇游戏
  本文是基于STM32战舰V3开发板平台的贪吃蛇游戏,主要用到了开发板上的ATK-HC05蓝牙模块,按键模块,LCD液晶显示屏模块;在程序设计方面主要是对贪吃蛇游戏进行程序设计,深入理解贪吃蛇游戏的设计思想以及开发板与手机蓝牙的信息交互,最终通过软件与硬件的配合实现STM32战舰V3开发板平台的贪吃蛇游戏。
  主要用到的软件资源有:串口3、定时器3
  主要用到的硬件资源有:按键4个、液晶显示屏、ATK-HC05蓝牙模块
  主循环中控制游戏进程与显示屏现实,通过定时器中断服务程序和串口中断服务程序,协调手机与蓝牙模块连接向开发板发送的控制数据与按键检测获取控制数据,结合主循环的游戏进程以按键和手机两种方式实现控制游戏的进行。
  可利用按键KEY_UP、KEY0、KEY1、 KEY2分别代表上、左、下、右或者手机端控制蛇的走位
  基本思路:蛇每吃一个食物蛇身子就增加一格,用WASD控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推
  附加功能:包含等级选择、暂停/继续、分数制、关卡的选择,难度的设置等
  地图的创建:创建地图,游戏开始前先建立好地图, 将外围一圈设置为城墙。
  void show_map(void){
  LCD_Fill(x1,y1,x2,y1+10,BLUE);
  LCD_Fill(x1,y1,x1+10,y3,BLUE);
  LCD_Fill(x4-10,y2,x4,y4,BLUE);
  LCD_Fill(x3,y4-10,x4,y4,BLUE);
  LCD_Fill(210,700,480,700,WHITE);} 食物的产生
  利用随机函数(rand())产生随机食物的坐标,该坐标的值不能与墙重合,不能与蛇身重合。食物我这里用的是红色方块表示。
  void Creat_food(void){
  rand();
  //产生一个30到50的随机数
  if(Food_flag==1)
  {
  Food_flag=0;
  Food_x= (rand()%45+1)*10;
  //产生一个1到45的随机数
  Food_y= (rand()%55+1)*10;
  //产生一个1到55的随机数
  }
  LCD_Fill(Food_x,Food_y,Food_x+10,Food_y+10,RED);} 构造一条蛇
  使用两个unsigned char类型的二维数组。 SNACK_x[100] SNACK_y[100]
  SNACK_x[100] SNACK_y[100]SNACK_x[0]=90,SNACK_y[0]=50;SNACK_x[1]=80,SNACK_y[1]=50;SNACK_x[2]=70,SNACK_y[2]=50;for(i=0;i《3;i++)//初始化蛇身长为SNACK_L=3,初始化蛇的位置:{LCD_Fill(SNACK_x,SNACK_y,SNACK_x+10,SNACK_y+10,RED);} 利用按键KEY_UP、KEY0、KEY1、 KEY2分别代表上、左、下、右或者手机端控制蛇的走位,以及当蛇每走一步就利用清屏,重新打印蛇身,模拟蛇的移动。
  #define LEFT 1#define RIGHT 2#define UP 3#define DOWN 4for(i=SNACK_L-1;i》0;i--)//记录蛇身{ SNACK_x=SNACK_x[i-1]; SNACK_y=SNACK_y[i-1];}//计算蛇头位置if(DIR==RIGHT) SNACK_x[0]=SNACK_x[0]+10;if(DIR==LEFT) SNACK_x[0]=SNACK_x[0]-10;if(DIR==UP) SNACK_y[0]=SNACK_y[0]-10;if(DIR==DOWN) SNACK_y[0]=SNACK_y[0]+10; 游戏结束
  当蛇撞墙, 以及咬到自己的身体时候游戏结束。
  if(SNACK_x[0]==0||SNACK_x[0]==470||SNACK_y[0]==0||SNACK_y[0]==590)//是否撞墙 { GAME_state=2;//GAME OVER delay_ms(500); delay_ms(500); LCD_Clear(WHITE); return; }for(i=1;i《SNACK_L;i++)//判断是否咬到蛇身 { if(SNACK_x[0]==SNACK_x && SNACK_y[0]==SNACK_y) { GAME_state=2;//GAME OVER delay_ms(500); delay_ms(500); LCD_Clear(WHITE); } }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分