|
看到網上有人用單片機做俄羅斯方塊、貪吃蛇游戲后,自己也想做個。。。說干就干,先是分析游戲內容,然后設計程序結構,最后調試硬件,寫代碼,花了一兩天時間搞定了,在此分享下成果,做的過程中,沒有參考任何游戲資料,所以應該是100%原創吧。。。
1.jpg (82.14 KB, 下載次數: 40)
下載附件
2022-9-14 02:18 上傳
游戲分析:
貪吃蛇游戲很簡單,不用多說,就是按鍵控制蛇的移動方向,使之吃到食物增加自身長度,當蛇碰到邊界或自身后游戲結束
所以開發這個游戲有一下幾個事情要做
1、游戲界面:
采用LCD12864液晶屏,不是市場上常見的大屏,而是小屏,顯示內容和大屏一樣,外接字庫芯片。
因為單個像素點太小,所以采用4*4像素作為一個最小顯示單元,這樣一來整屏就劃分成了32*64的游戲區域,
在此方面控制程序主有兩個,一個畫點函數,一個擦點函數,用于在屏幕任意坐標添加或刪除一個黑點,作為游戲顯示操作
2、蛇身的建立
這一步將整個蛇顯示到屏幕上,因為蛇身是一個點連接一個點,所以之前有想到用建立鏈表的方式去表示蛇,但后來發現有處理起來有點繁瑣,就舍棄了。
轉而第二種方式,采用數組方式,因為屏幕最大內容是32*64=2K個點,所以建立了一個2048 x 16bit的數組,雖然有點大,但是對于stm32擁有64K RAM來說就有點小巫見大巫了。。。
建立數組后,每個數據表示蛇在屏幕上的坐標,高八位表示行坐標,低八位表示列坐標,數組起始為頭部坐標,根據蛇的長度決定尾部坐標。這樣一來就解決了蛇身的問題
此外還建立了一個64*32bit的屏幕緩存,用以表示屏幕上任意坐標(x,y)處是否存在蛇身。
3、蛇的移動
當蛇要移動時,先提取頭部坐標,如(x,y),根據當前的移動方向,計算下一個坐標,如果方向為左(以屏幕左上角為(0,0)水平向右為x軸,向下為y軸)則下一坐標為(x-1,y)向右(x+1,y)向下(x,y+1)向上(x,y-1)
然后再一次將蛇身坐標(數組內容)依次往后挪一個,長度為蛇身坐標。如果下一坐標為食物,則在尾坐標后再添加一個位置,復制尾坐標,長度+1,否者刪除尾坐標。再將新坐標復制到數組0的地方作為新的蛇頭,此過程中,及時根據坐標的改變(添加新坐標或刪除坐標),在屏幕緩存相應位置畫點和擦點,標記蛇身。
4、游戲的規則,按照3計算新坐標后,判斷該店緩存是否為1(1表示存在蛇身或其他物體,0表示空白單元),如果為1,則表明蛇遇到物體了,如果該物體是食物,則進行游戲添加食物動作,如果不為食物則表明蛇撞自己了,即游戲失敗,此外還要判斷該坐標是否超出邊界。
5、動作控制,4個按鍵,采用中斷方式,代表4個方向。按下一個鍵,改變當前的移動方向,在這里要注意,方向改變之前要判斷當前方向必須不為反向,如轉變至左方向時,當前方向不能是右,防止蛇回頭,撞到自身,這是游戲中不允許的。
6、食物的出現,隨機出現,有兩種辦法,一是利用單片機的系統隨機誤差產生坐標,如ADC模塊,隨機讀取ADC數據模塊,分別對64和32取余。當然前提是誤差最大有64的擺幅,這是一種不夠精確地隨機數。
二是采用C語言rand()隨機函數,也是分別對64和32取余,比前者要科學,但前提是每次游戲運行前要給一個隨機種子,進行隨機函數種子初始化srand(seed),否者每次游戲運行出現的隨機序列(食物的坐標)都是一樣的,這一步就必須借助外部環境了,游戲中我采用的是這一方式獲得食物,這里通過記錄游戲開始后第一次按下鍵盤的時間作為隨機數種子,開了一個72M不分頻的定時器,因為技術頻率快,從游戲開始到第一次按鍵的時間幾乎是隨機的。當然也可以采用ADC模塊的隨機誤差數據。
然后就在游戲開始隨機產生一個食物,當游戲開始后,在計算下一坐標后,如果該點為食物,則吃掉它,并產生一個食物,通過對屏幕緩存的判斷,直到新的食物坐標是一個空白單元。
7、游戲進程控制:
開了一個定時器,周期決定蛇的移動速度。進入定時器后,根據當前的移動方向,進入不同的狀態機,計算下一坐標,判斷,(吃食物或者移動),移動蛇身將坐標往數組后面挪,如果游戲失敗,將游戲標志位置位,主函數則實時判斷游戲是否失敗,如果失敗,則關閉定時器,清屏,顯示游戲分數(蛇身長度),并進入死循環或等待系統軟復位。
|
-
2.jpg
(51.81 KB, 下載次數: 57)
下載附件
2022-9-14 02:18 上傳
評分
-
查看全部評分
|