找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2968|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

[MCU實戰(zhàn)經(jīng)驗]基于stm32和LCD12864的貪吃蛇游戲制作,游戲分析(原創(chuàng)設(shè)計)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1044689 發(fā)表于 2022-9-14 00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
看到網(wǎng)上有人用單片機(jī)做俄羅斯方塊、貪吃蛇游戲后,自己也想做個。。。說干就干,先是分析游戲內(nèi)容,然后設(shè)計程序結(jié)構(gòu),最后調(diào)試硬件,寫代碼,花了一兩天時間搞定了,在此分享下成果,做的過程中,沒有參考任何游戲資料,所以應(yīng)該是100%原創(chuàng)吧。。。

游戲分析:

貪吃蛇游戲很簡單,不用多說,就是按鍵控制蛇的移動方向,使之吃到食物增加自身長度,當(dāng)蛇碰到邊界或自身后游戲結(jié)束

所以開發(fā)這個游戲有一下幾個事情要做

1、游戲界面:

采用LCD12864液晶屏,不是市場上常見的大屏,而是小屏,顯示內(nèi)容和大屏一樣,外接字庫芯片。

因為單個像素點太小,所以采用4*4像素作為一個最小顯示單元,這樣一來整屏就劃分成了32*64的游戲區(qū)域,

在此方面控制程序主有兩個,一個畫點函數(shù),一個擦點函數(shù),用于在屏幕任意坐標(biāo)添加或刪除一個黑點,作為游戲顯示操作

2、蛇身的建立

這一步將整個蛇顯示到屏幕上,因為蛇身是一個點連接一個點,所以之前有想到用建立鏈表的方式去表示蛇,但后來發(fā)現(xiàn)有處理起來有點繁瑣,就舍棄了。

轉(zhuǎn)而第二種方式,采用數(shù)組方式,因為屏幕最大內(nèi)容是32*64=2K個點,所以建立了一個2048 x 16bit的數(shù)組,雖然有點大,但是對于stm32擁有64K RAM來說就有點小巫見大巫了。。。

建立數(shù)組后,每個數(shù)據(jù)表示蛇在屏幕上的坐標(biāo),高八位表示行坐標(biāo),低八位表示列坐標(biāo),數(shù)組起始為頭部坐標(biāo),根據(jù)蛇的長度決定尾部坐標(biāo)。這樣一來就解決了蛇身的問題

此外還建立了一個64*32bit的屏幕緩存,用以表示屏幕上任意坐標(biāo)(x,y)處是否存在蛇身。

3、蛇的移動

當(dāng)蛇要移動時,先提取頭部坐標(biāo),如(x,y),根據(jù)當(dāng)前的移動方向,計算下一個坐標(biāo),如果方向為左(以屏幕左上角為(0,0)水平向右為x軸,向下為y軸)則下一坐標(biāo)為(x-1,y)向右(x+1,y)向下(x,y+1)向上(x,y-1)

然后再一次將蛇身坐標(biāo)(數(shù)組內(nèi)容)依次往后挪一個,長度為蛇身坐標(biāo)。如果下一坐標(biāo)為食物,則在尾坐標(biāo)后再添加一個位置,復(fù)制尾坐標(biāo),長度+1,否者刪除尾坐標(biāo)。再將新坐標(biāo)復(fù)制到數(shù)組0的地方作為新的蛇頭,此過程中,及時根據(jù)坐標(biāo)的改變(添加新坐標(biāo)或刪除坐標(biāo)),在屏幕緩存相應(yīng)位置畫點和擦點,標(biāo)記蛇身。

4、游戲的規(guī)則,按照3計算新坐標(biāo)后,判斷該店緩存是否為1(1表示存在蛇身或其他物體,0表示空白單元),如果為1,則表明蛇遇到物體了,如果該物體是食物,則進(jìn)行游戲添加食物動作,如果不為食物則表明蛇撞自己了,即游戲失敗,此外還要判斷該坐標(biāo)是否超出邊界。

5、動作控制,4個按鍵,采用中斷方式,代表4個方向。按下一個鍵,改變當(dāng)前的移動方向,在這里要注意,方向改變之前要判斷當(dāng)前方向必須不為反向,如轉(zhuǎn)變至左方向時,當(dāng)前方向不能是右,防止蛇回頭,撞到自身,這是游戲中不允許的。

6、食物的出現(xiàn),隨機(jī)出現(xiàn),有兩種辦法,一是利用單片機(jī)的系統(tǒng)隨機(jī)誤差產(chǎn)生坐標(biāo),如ADC模塊,隨機(jī)讀取ADC數(shù)據(jù)模塊,分別對64和32取余。當(dāng)然前提是誤差最大有64的擺幅,這是一種不夠精確地隨機(jī)數(shù)。

二是采用C語言rand()隨機(jī)函數(shù),也是分別對64和32取余,比前者要科學(xué),但前提是每次游戲運行前要給一個隨機(jī)種子,進(jìn)行隨機(jī)函數(shù)種子初始化srand(seed),否者每次游戲運行出現(xiàn)的隨機(jī)序列(食物的坐標(biāo))都是一樣的,這一步就必須借助外部環(huán)境了,游戲中我采用的是這一方式獲得食物,這里通過記錄游戲開始后第一次按下鍵盤的時間作為隨機(jī)數(shù)種子,開了一個72M不分頻的定時器,因為技術(shù)頻率快,從游戲開始到第一次按鍵的時間幾乎是隨機(jī)的。當(dāng)然也可以采用ADC模塊的隨機(jī)誤差數(shù)據(jù)。

然后就在游戲開始隨機(jī)產(chǎn)生一個食物,當(dāng)游戲開始后,在計算下一坐標(biāo)后,如果該點為食物,則吃掉它,并產(chǎn)生一個食物,通過對屏幕緩存的判斷,直到新的食物坐標(biāo)是一個空白單元。

7、游戲進(jìn)程控制:

開了一個定時器,周期決定蛇的移動速度。進(jìn)入定時器后,根據(jù)當(dāng)前的移動方向,進(jìn)入不同的狀態(tài)機(jī),計算下一坐標(biāo),判斷,(吃食物或者移動),移動蛇身將坐標(biāo)往數(shù)組后面挪,如果游戲失敗,將游戲標(biāo)志位置位,主函數(shù)則實時判斷游戲是否失敗,如果失敗,則關(guān)閉定時器,清屏,顯示游戲分?jǐn)?shù)(蛇身長度),并進(jìn)入死循環(huán)或等待系統(tǒng)軟復(fù)位。

2.jpg (51.81 KB, 下載次數(shù): 57)

2.jpg

評分

參與人數(shù) 1黑幣 +15 收起 理由
wpppmlah + 15 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

無效樓層,該帖已經(jīng)被刪除
板凳
ID:262 發(fā)表于 2022-9-15 20:52 | 只看該作者
好東東,能分享一下代碼嗎?
回復(fù)

使用道具 舉報

地板
ID:101093 發(fā)表于 2022-9-15 23:02 | 只看該作者
做的不錯,技術(shù)超強(qiáng)!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表