在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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
    +關注

    關注

    2270

    文章

    10900

    瀏覽量

    355985
  • 游戲
    +關注

    關注

    2

    文章

    742

    瀏覽量

    26316
  • 核心板
    +關注

    關注

    5

    文章

    1014

    瀏覽量

    29768
收藏 人收藏

    評論

    相關推薦

    用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+LCD實現簡單貪吃蛇小游戲的設計資料分享

    寒假放假回家,只能宅在家里,無聊之余,幸好帶了一塊開發回來,以前做項目都是在網上找相似或者有關聯的項目,把別人的代碼拿過來,修改修改,拼拼湊湊出自己項目,既然無聊就自己動腦筋思考,自己動手寫貪吃蛇的程序。下面是視頻效果: STM32
    發表于 02-07 07:46

    基于stm32貪吃蛇小游戲的設計資料分享

    指南者開發上,使其能在觸摸屏上顯示,并且添加了暫停/繼續的觸摸按鍵以及簡單的游戲結束顯示,大體再現了貪吃蛇這款小游戲。一、主要功能上圖是整個顯示屏的布局以及對應功能。
    發表于 02-21 07:27

    怎樣去設計一種基于stm32f103c8t6的貪吃蛇小游戲

    基于stm32f103c8t6的貪吃蛇小游戲是由哪些部分組成的?怎樣去設計一種基于stm32f103c8t6的貪吃蛇
    發表于 02-21 06:27

    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 ?1281次閱讀
    主站蜘蛛池模板: 黄色3级| 亚洲国产tv| 天天爽夜夜爽| 国内精品久久久久影院男同志| 边做饭边被躁欧美三级小说| 三级精品| 伊人网视频| 日韩免费| 操美女网址| 2018天天操天天干| 一区二区三区四区欧美| 毛片大全免费| 都市激情亚洲| 黑色丝袜美女被视频网站| 日本xx69| 四虎影城库| 222.www免费观看| susu成人影院| 亚洲香蕉影院| 国内精品久久久久久影院老狼| 免费特黄一区二区三区视频一| 乱说欲小说又粗又长| 午夜免费r级伦理片| 国产精品免费观看网站| 成人剧场| 四虎影视网站| 最新欧美一级视频| 91av视频| 欧美日韩亚洲国产一区二区综合 | 国产精品伦子一区二区三区| 国产亚洲精品aa在线观看| 性欧美丨18一19| 一级视频在线| 久久精品国产免费高清| 韩国免费特一级毛片| 奇米影视四色首页手机在线| 色婷婷激情综合| 色屁屁www影院免费观看视频| 永久网站色视频在线观看免费| 国产精品视频永久免费播放| 网站在线播放|