|
看到網(wǎng)上有人用單片機(jī)做俄羅斯方塊、貪吃蛇游戲后,自己也想做個(gè)。。。說干就干,先是分析游戲內(nèi)容,然后設(shè)計(jì)程序結(jié)構(gòu),最后調(diào)試硬件,寫代碼,花了一兩天時(shí)間搞定了,在此分享下成果,做的過程中,沒有參考任何游戲資料,所以應(yīng)該是100%原創(chuàng)吧。。。
1.jpg (82.14 KB, 下載次數(shù): 40)
下載附件
2022-9-14 02:18 上傳
游戲分析:
貪吃蛇游戲很簡(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)
下載附件
2022-9-14 02:18 上傳
評(píng)分
-
查看全部評(píng)分
|