找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

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

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

游戲分析:

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

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

1、游戲界面:

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

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

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

2、蛇身的建立

這一步將整個(gè)蛇顯示到屏幕上,因?yàn)樯呱硎且粋(gè)點(diǎn)連接一個(gè)點(diǎn),所以之前有想到用建立鏈表的方式去表示蛇,但后來發(fā)現(xiàn)有處理起來有點(diǎn)繁瑣,就舍棄了。

轉(zhuǎn)而第二種方式,采用數(shù)組方式,因?yàn)槠聊蛔畲髢?nèi)容是32*64=2K個(gè)點(diǎn),所以建立了一個(gè)2048 x 16bit的數(shù)組,雖然有點(diǎn)大,但是對(duì)于stm32擁有64K RAM來說就有點(diǎn)小巫見大巫了。。。

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

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

3、蛇的移動(dòng)

當(dāng)蛇要移動(dòng)時(shí),先提取頭部坐標(biāo),如(x,y),根據(jù)當(dāng)前的移動(dòng)方向,計(jì)算下一個(gè)坐標(biāo),如果方向?yàn)樽螅ㄒ云聊蛔笊辖菫椋?,0)水平向右為x軸,向下為y軸)則下一坐標(biāo)為(x-1,y)向右(x+1,y)向下(x,y+1)向上(x,y-1)

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

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

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

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

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

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

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

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

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

2.jpg

評(píng)分

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

查看全部評(píng)分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:262 發(fā)表于 2022-9-15 20:52 | 只看該作者
好東東,能分享一下代碼嗎?
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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