0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

采用STM32核心板制作贪吃蛇小游戏

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-05-27 09:01 次阅读

硬件平台:STM32核心板、OLED显示(SPI接口)、按键

实现功能:

1.绘制蛇身,通过随机数生成食物;

2.按键控制运动方向,完成上下左右控制和加速控制;

3.游戏结束判断:当蛇头碰到上下左右墙壁或者碰到蛇身则游戏结束,可按任意键重新开始;

4.得分统计,每吃到一颗食物则+1积分,知道游戏结束;

实现原理:

1.完成按键驱动,用户控制蛇行动方向;

2.完成OLED驱动,实时刷新蛇行动轨迹和食物位置;

3.创建蛇身结构体信息,设置初始蛇身长度,每吃到一个食物结构体成员+1,蛇身变长,可通过链表实现或结构体数组实现;

实物效果:

1.设置初始蛇身和生成实物

pYYBAGKPaxqAQ-JBAAqbJG5Nlzc592.png

2.按键控制运动方向

poYBAGKPa1eAELZ9AAtrBv9ozoA672.png

3.游戏结束提示和得分统计

pYYBAGKPa6SAK6AeAAhByE97f90239.png

软件设计:

1.OLED底层画点函数实现,用户绘制蛇身和食物

static u8 oled_gram[8][128];//屏幕缓冲区
void OLED_DrawPoint(u8 x,u8 y,u8 c)
{
  u8 page=y/8;//y坐标值在第几页
  u8 line=y%8;//在当前页的第几行上
  if(c)oled_gram[page][x]|=1<;>

2.蛇身绘制,每个蛇身节点为4*4矩形填充

/*绘制贪吃蛇单个节点*/
static void OLED_DrawSnake(u8 x,u8 y,u8 c)
{
  u16 i;
  u8 x0=x;
  for(i=0;i<4*4;i++)
  {
    OLED_DrawPoint(x0,y,c);
    x0++;
    if(x0-x==4)
    {
      x0=x;
      y++;
    }
  }    
}

3.绘制贪吃蛇整个蛇身,遍历结构体数组。

//保存节点坐标结果体
struct SNAKE
{
  u8 x;//节点x坐标
  u8 y;//节点y坐标 
};
struct SNAKE snake_info[50];//蛇节点最多50个
static u8 node_cnt=0;//蛇身长度
}
/*绘制蛇身节点个数
struct SNAKE *buff --保存蛇身节点结构体指针
cnt  --蛇身节点个数
c -- 1为绘制,0为取消绘制
*/
static void OLED_DrawSnakebody(struct SNAKE *buff,u8 cnt,u8 c)
{
    u8 i=0;
    for(i=0;i;i++)>

4.食物坐标判断,计算是否吃到食物

/**************判断实物位置***************
**
**判断新生成的实物x坐标是否落在蛇身上
**形参:u8 x --实物光标位置
**      cnt  --蛇身节点个数
**返回值:1 --落在蛇身上,0 -- 没有
*******************************************/
static u8 OLED_GetSnakeFoodX(u8 x,u8 cnt)
{
  u8 i=0;
  for(i=0;i;i++)>

5.移动蛇身

/*******************动态移动蛇身********************************/
static void Snake_Move(u8 x,u8 y)
{
  u8 i=0;
  OLED_DrawSnake(snake_info[0].x,snake_info[0].y,0);//清除蛇尾
  for(i=0;i;i++)>

6.开始游戏,控制移动方向,生成实物,判断游戏是否结束,得分统计

/*******************控制方向,判断游戏是否结束********************/
u8 SnakeGameStart(void)
{
  u8 x=10;
  u8 y=30;
  u8 food_x,food_y;
  u8 stat=0;
  char buff[20];
  OLED_DrawRectangle(0, 0, 127, 63);//绘制矩形
  OLED_DrawRectangle(1, 1, 126, 62);//绘制矩形
  //创建蛇身1
  snake_info[node_cnt].x=x;
  snake_info[node_cnt].y=y;
  node_cnt++;
  //创建蛇身2
  snake_info[node_cnt].x=x+5;
  snake_info[node_cnt].y=y;  
  //保存蛇头坐标
  x=snake_info[node_cnt].x;
  y=snake_info[node_cnt].y;
  node_cnt++;
  OLED_DrawSnakebody(snake_info,node_cnt,1);//绘制蛇身
  //生成实物坐标
  food_x=((rand()%115)/5)*5+5;
  food_y=((rand()%50)/5)*5+5;
  OLED_DrawSnake(food_x,food_y,1);//绘制实物
  OLED_Refresh();//更新数据到屏幕
  while(1)
  {
    if(snake_info[node_cnt-1].x>=125 || snake_info[node_cnt-1].y>=60)//判断是否撞墙
    {
      snprintf(buff,sizeof(buff),"Mark:%d",node_cnt-2);
      OLED_DisplayStr(36,8,8,16,buff);//字符串显示
      OLED_DisplayStr(10,28,12,24,"Game over");//字符串显示
      OLED_Refresh();//更新数据到屏幕
      key_val=0;
      node_cnt=0;//清空节点
      break;//游戏结束
    }
    if(snake_info[node_cnt-1].x==food_x && snake_info[node_cnt-1].y==food_y)//判断是否吃到食物
    {
      if(stat&1<<0 || stat&1<<1)//向上或向下时y+5
      {
        snake_info[node_cnt].x=food_x;
        snake_info[node_cnt].y=food_y+5; 
      }
      else //向左或向右时x+5
      {
        snake_info[node_cnt].x=food_x+5;
        snake_info[node_cnt].y=food_y; 
      }
      node_cnt++;
      while(1)//保证重新生成的实物不再蛇身上
      {
        food_x=((rand()%115)/5)*5+5;
        if(OLED_GetSnakeFoodX(food_x,node_cnt)==0)break;
      }
      while(1)
      {
        food_y=((rand()%50)/5)*5+5;
        if(OLED_GetSnakeFoodY(food_y,node_cnt)==0)break;
      }
      OLED_DrawSnake(food_x,food_y,1);
      OLED_Refresh();//更新数据到屏幕 
    }
    switch(key_val)
    {
      case UP://上 
      stat&=~(0x3<<2);//清除左右标志 
      if(stat&1<<1){}//向下时不能直接向上
      else
      {
        stat|=1<<0;//向上
        y-=5;
        Snake_Move(x,y);
      }
      break;
      case DOWM://下
      stat&=~(0x3<<2);//清除左右标志 
      if(stat&1<<0){}//在向上时不能直接向下
      else
      {
        stat|=1<<1;//向下标志位
        y+=5;
        Snake_Move(x,y); 
      }
      break;
      case LEFT://左
      stat&=~(0x3<<0);//清除上下标志  
      if(stat&1<<3){}//向右时不能直接向左
      else
      {
        stat|=1<<2;//向左
        x-=5;
        Snake_Move(x,y);       
      }
      break; 
      case RIGHT://右 
      stat&=~(0x3<<0);//清除上下标志  
      if(stat&1<<2){}//向左时不能直接向右
      else
      {
        stat|=1<<3;
        x+=5;
        Snake_Move(x,y);      
      }
      break;      
    }
    OLED_Refresh();//更新数据到屏幕
    Delay_Ms(300);    
  }
  return 0;
}

7.主函数,硬件初始化,生成随机数种子,进入游戏

int main()
{
    LED_Init();//LED初始化
    USARTx_Init(USART1,115200,72);
    TIMx_Init(TIM2,72,20000);//定时器辅助串口1接收,计数一个周期时间为20ms
    KEY_Init();//按键初始化
    EXTI_Init();
    Beep_Init();//蜂鸣器初始化
    OLED_Init();
    srand(1);//生成随机数种子
  AA:
    SnakeGameStart();
    while(1)
    {
        if(key_val)//按任意键继续游戏
        {
          OLED_ClearGram();//清空缓冲区
          OLED_Refresh();//更新数据到屏幕
          key_val=0;
          goto AA;
        }
    }   
}
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2266

    文章

    10877

    浏览量

    354989
  • 游戏
    +关注

    关注

    2

    文章

    739

    浏览量

    26292
  • 核心板
    +关注

    关注

    5

    文章

    992

    浏览量

    29723
收藏 人收藏

    评论

    相关推荐

    用LabVIEW制作贪吃蛇小游戏的难度高么?大神们给点提示。

    用LabVIEW制作贪吃蛇小游戏的难度高么?大神们给点提示。
    发表于 11-19 17:02

    是否可以用msp430f5529制作贪吃蛇小游戏

    是否可以用msp430f5529制作贪吃蛇小游戏
    发表于 10-13 00:15

    【FPGA DEMO】Lab 9:贪吃蛇小游戏

    基于Perf-V开发,实现贪吃蛇小游戏的设计。实验中用开发上key1-key4按键来控制小蛇的移动,VGA设计该游戏的界面。基本步骤如上
    发表于 07-30 15:53

    求一种基于STM32贪吃蛇小游戏开发方案

    基于STM32贪吃蛇小游戏初学32一个月,学的并不多,便想着做一个贪吃蛇小游戏,因为有51单片机做贪吃
    发表于 08-04 08:23

    如何利用STM32制作贪吃蛇和推箱子游戏

    如何利用STM32制作贪吃蛇和推箱子游戏
    发表于 09-27 08:07

    怎样去开发一种基于STM32贪吃蛇小游戏

    怎样去开发一种基于STM32贪吃蛇小游戏
    发表于 10-18 06:42

    如何利用QT去制作一个贪吃蛇小游戏

    如何利用QT去制作一个贪吃蛇小游戏呢?并将其移植到嵌入式Linux平台下呢?
    发表于 12-23 09:37

    基于stm32贪吃蛇小游戏的设计资料分享

    指南者开发上,使其能在触摸屏上显示,并且添加了暂停/继续的触摸按键以及简单的游戏结束显示,大体再现了贪吃蛇这款小游戏。一、主要功能上图是整个显示屏的布局以及对应功能。
    发表于 02-21 07:27

    怎样去设计一种基于stm32f103c8t6的贪吃蛇小游戏

    基于stm32f103c8t6的贪吃蛇小游戏是由哪些部分组成的?怎样去设计一种基于stm32f103c8t6的贪吃蛇
    发表于 02-21 06:27

    贪吃蛇游戏设计贪吃蛇收尾基本完成

    电子发烧友网站提供《贪吃蛇游戏设计贪吃蛇收尾基本完成.rar》资料免费下载
    发表于 03-24 23:06 3次下载

    STM32+LCD实现简单的贪吃蛇小游戏

    的程序。下面是视频效果: STM32+LCD实现简单的贪吃蛇小游戏 因为自己开发...
    发表于 12-04 10:36 19次下载
    <b class='flag-5'>STM32</b>+LCD实现简单的<b class='flag-5'>贪吃蛇</b><b class='flag-5'>小游戏</b>

    基于stm32贪吃蛇小游戏

    野火指南者开发上,使其能在触摸屏上显示,并且添加了暂停/继续的触摸按键以及简单的游戏结束显示,大体再现了贪吃蛇这款小游戏。一、主要功能上图是整个显示屏的布局以及对应功能。
    发表于 12-24 19:32 21次下载
    基于<b class='flag-5'>stm32</b>的<b class='flag-5'>贪吃蛇</b><b class='flag-5'>小游戏</b>

    基于STM32贪吃蛇小游戏

    基于STM32贪吃蛇小游戏初学32一个月,学的并不多,便想着做一个贪吃蛇小游戏,因为有51单片机做贪吃
    发表于 12-24 19:33 28次下载
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>贪吃蛇</b><b class='flag-5'>小游戏</b>

    STM32贪吃蛇小游戏

    功能:贪吃蛇小游戏单片机:stm32f103c8t6用到的硬件资源:LED指示灯矩阵键盘OLED模块通用定时器软件设计:yi矩阵键盘(中断方式)前面文章有介绍定时器中断:用于更新游戏
    发表于 12-27 19:16 20次下载
    【<b class='flag-5'>STM32</b>】<b class='flag-5'>贪吃蛇</b><b class='flag-5'>小游戏</b>

    玩嗨OpenHarmony:基于OpenHarmony的贪吃蛇小游戏

    51CTO 开源基础软件社区 #夏日挑战赛# 《 OpenHarmony基于JS实现的贪吃蛇 》 1. 项目简介 贪吃蛇是一款非常经典的小游戏,概念起源于1976年由美国一家街机游戏B
    的头像 发表于 11-28 20:50 1227次阅读