日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

發布時間:2024/10/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介:本實驗基于stm32最小系統、0.96寸OLED(68*128)和搖桿實現一個經典的貪吃蛇小游戲。項目源碼地址點擊下載。

硬件設計:

普通搖桿,0.96寸OLED 單色屏幕(SPI協議通訊),stc32f103c8t6最小系統開發板,如下所示。

器件齊全后,用杜邦線將搖桿和oled正確地連接到stm32開發板上,注意各個器件的電源需要接到同一電壓,下圖是接線說明:

?接好線之后,將源碼編譯下載,進入調試,正常運行如下圖所示,如果屏幕出現花屏,那么將res引腳接到GND進行復位,再重新進行調試或單片機復位:

接著按下搖桿的中鍵就可以進入游戲:

屏幕的上方顯示得分,通過搖桿控制蛇的運動方向。

游戲失敗后可按下搖桿中鍵重新開始游戲。

代碼設計:?

源代碼下載解壓后,利用keil4工具打開工程可看到:

上面已表明各個文件的作用,?可重點看Snake.c游戲設計文件。如果代碼里面的注釋是亂碼,點擊Edit->Configuration->Editor->Encoding->選擇Chinese GB2312。下面面只列舉部分代碼說明。

main函數

int main(void) {RCC_PCLK1Config(RCC_HCLK_Div4);USART1_Configuration(); //初始化串口TIME_Configuration(); //初始化定時器ADC_Configuration(); //初始化搖桿的ad采集OLED_Init(); //oled初始化默認參數GameReady(); //進入游戲準備界面Tick_Updata(&sysms);while (1){event=JoyState(); //獲取搖桿的狀態ret=Game_InputHandle(event);//蛇移動if(ret){ //ret=1 表示屏幕需刷新GameMapToLcdCache(); //將像素從游戲圖像gamemap位圖經過放大后寫進LcdCache顯存OLED_Updata();//將LcdCache[8][128]顯存的數據發送到屏幕進行顯示sprintf(str,"Score=%d",GameScore);OLED_DispString(0,0,str); //屏幕上方顯示分數}} }

main函數并不復雜,while循環里面不斷獲取搖桿狀態,將狀態傳進Game_InputHandle函數進行游戲操作。

實現原理:

運用鏈表的特性,蛇的每一個節點就是鏈表的節點,節點的內容是該點的x,y坐標,如上圖所示。遍歷鏈表逐個讀取蛇身的每個節點里面的x,y坐標,根據該坐標在屏幕上描點,即可描繪出蛇的形狀來。

蛇的運動的原理是從蛇尾節點開始,其x,y坐標等于前一個節點的坐標,直至到頭節點,頭節點的新x,y坐標跟蛇運動的方向有關。每當蛇遲到食物時,尾部追加節點。

void GAME_NewSnake(SNAKELIST* SnakeList) //初始化鏈表,初始化蛇長度,4+1節 {int x=4,y=15,i;//蛇的初始位置SnakeList->x=x;SnakeList->y=y++;SnakeList->prev=SnakeList;SnakeList->next=SnakeList;for(i=0;i<4;i++){GAME_SnakeListAddNode(SnakeList,x,y+i);}GAME_SnakeFillInGameMap(gamemap,SnakeList); }

GAME_NewSnake游戲開始前,給蛇初始化5個節點,頭節點在x=4,y=15處,其余4個節點在其下方。通過GAME_SnakeFillInGameMap函數將蛇在gamemap上描畫出來。gamemap再放大映射到LCDcache顯存里面去,再通過spi把整個屏幕的像素發送到屏幕進行顯示。

void GAME_NewFood(unsigned char (*gamemap)[WIDTH]) //在地圖上隨機產生新的食物 {unsigned int seed1,seed2;int x,y;while(1){Tick_Updata(&seed1);Tick_Updata(&seed2);x=seed1%WIDTH;y=seed2%HEIGHT;if(gamemap[y][x]==0){gamemap[y][x]=2;break;}} }

GAME_NewFood在地圖上隨機生成一個食物,當然這里的隨機數,利用不斷變化的時鐘進行求余,得到的隨機坐標后,先判斷該左邊是否可用,若是已經存在東西(蛇身或者邊框)則繼續獲取隨機數,如此反復直到得到一個空的的隨機坐標。所以,當游戲玩到最后,蛇身很長的時候(界面沒有多少空白點),產生食物的時間會長很多。

unsigned char Game_InputHandle(unsigned char event)//對輸入按鍵事件的處理 {unsigned char ret=0;if(GameStatus==GAMEPAUSE&&event!=RESTART_EV){ //游戲狀態未運行時,除非按下restart,否則不進入return 0;}if(event==5-Snokedirection){//按下蛇前進的相反方向時,忽略event=NON; }switch(event){case NON:speed_max=200;if(If_TimeOut(&speed_move,SPPED_MOVE)){ //自動前進Tick_Updata(&speed_move);event=Snokedirection;}else{break;}case TURN_LEFT_EV: //蛇向左移動case TURN_RIGHT_EV://蛇向右移動case TURN_DOWN_EV: //蛇向下移動 case TURN_UP_EV: //蛇向上移動 if(If_TimeOut(&speed_turn,speed_max)){Tick_Updata(&speed_turn);speed_max=150;Snokedirection=event;ret=GAME_SnakeMove(gamemap,&SnokeHeadNode,event,&GameScore); printf("event=%d\r\n",event);}break;case RESTART_EV://游戲復位if(If_TimeOut(&speed_restart,SPPED_RESTART_MAX)){Tick_Updata(&speed_restart);GameStatus=GAMERUNING;GameScore=0;Snokedirection=TURN_UP_EV;GAME_BackgroundInit(gamemap);GAME_NewSnake(&SnokeHeadNode);GAME_NewFood(gamemap);ret=1;printf("event=%d\r\n",event);}break;default://errorbreak;}return ret; }

Game_InputHandle函數在main函數里被調用,SPPED_MOVE這個宏是控制蛇自動移動的速度的,所設置的值越低則運動的越快。speed_max的值是控制手動移動的速度,當搖桿狀態被持續維持為一個方向時,就會按照該速度進行前進。

源碼添加了許多注釋,歡迎下載。若有疑問歡迎提出。

相關推薦:

基于stm32、0.96寸OLED實現的俄羅斯方塊小游戲(詳細源碼注釋)

?

<<天下難事,必做于易;天下大事,必做于細。——老子>>

總結

以上是生活随笔為你收集整理的基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国内三级视频 | www.日韩在线观看 | 日韩欧美国产亚洲 | 亚洲破处视频 | 国产一区二区三区18 | 日韩高清毛片 | 光明影院手机版在线观看免费 | 欧美黄色免费观看 | 明里柚番号 | 涩涩视频在线观看免费 | 涩涩片影院| 国产在线第一页 | 国产精品九一 | 亚洲男人天堂2018 | 西西午夜影院 | 农村妇女毛片精品久久久 | 亚洲免费精品视频 | 9999精品| 不卡中文一二三区 | 青青草色视频 | 欧美裸体女人 | 国产手机在线视频 | 免费一级淫片aaa片毛片a级 | 欧美成人免费一级人片100 | 国产精品8 | 麻豆免费观看视频 | 天天色天天射综合网 | 久久国产色av免费观看 | 国产亚洲欧美在线精品 | 欧美一级视频免费观看 | 国内精品久久久久久久久久 | 日本黄色不卡视频 | 青草视频网 | 超碰人人爱人人 | 日批视频在线免费看 | 免费看成人毛片 | 自由 日本语 热 亚洲人 | 亚洲午夜无码久久 | 绯色av一区二区三区高清 | 国产91在线播放精品91 | 国产亚洲美女精品久久久2020 | 国产一级高清 | 亚洲区欧美 | 日韩一区二区在线播放 | 91免费版黄色| 国产精品日韩一区二区三区 | 天天爽天天爽天天爽 | 日日夜夜国产精品 | 免费观看毛片 | 夜色成人| 亚洲av激情无码专区在线播放 | 久久精品人妻一区二区三区 | 日韩天堂网 | 日噜噜夜噜噜 | 亚洲经典一区二区三区四区 | 欧美高清成人 | 成人av播放 | 日韩性xxxx | 一区二区传媒有限公司 | 丁香综合网 | 国产一区二区高清 | av在线操| 红桃成人在线 | 免费看欧美黑人毛片 | 狠狠撸在线视频 | 久久久久久国产精品三级玉女聊斋 | 黄av网 | 台湾性dvd性色av | 日韩成人av一区 | 少妇无码av无码专区在线观看 | 亚洲免费视频一区 | 亚洲欧美日韩国产精品 | 精品久久二区 | 影视先锋av资源 | 亚洲免费成人在线 | 日韩中文字幕在线免费观看 | 亚洲尹人 | 成年人小视频 | 国产农村妇女精品一二区 | 国产又粗又黄又爽 | 日本一区二区三区免费观看 | 亚洲第一色区 | 午夜福利理论片在线观看 | 亚洲人在线观看 | 亚洲av人人澡人人爽人人夜夜 | 韩国伦理av | 污视频在线播放 | 精品人妻无码一区二区色欲产成人 | 久久天堂视频 | 美女av网 | 成年丰满熟妇午夜免费视频 | 99国产精品免费视频 | 黑人一级大毛片 | 国产麻豆天美果冻无码视频 | 特级黄色一级片 | 久久成人福利视频 | 最近中文字幕在线中文视频 | 9l视频自拍蝌蚪9l视频成人 | 四虎影院在线免费播放 |