基於STC89C516的多游戲實現


所用器件:STC89C516,矩陣鍵盤,LCD1602,16*16點陣,74HC595,無源蜂鳴器,晶振為11.0592MHZ

使用說明:

  開機(復位)進入啟動界面,1602顯示Welcome。500ms后進入菜單界面,1602顯示SnakesSubsonic(貪吃蛇)。此時S1按鍵為上翻,S3按鍵為下翻,S2按鍵為確認。共有三種游戲選擇,按順序為SnakesSubsonic、FallingDiamonds(類似於鋼琴塊)、ElectronicOrgan(電子琴)。上翻下翻可循環選項。

               

  進入貪吃蛇界面后,點陣顯示初始化界面,同時1602顯示Press any key to continue..

                     

按下任意按鍵開始游戲。S2按鍵為上,S10按鍵為下,S5按鍵為左,S7按鍵為右,S6按鍵為暫停,S16按鍵為退出。開始游戲后,1602顯示分數,點陣顯示游戲界面。按下暫停后游戲界面保持,同時1602顯示Press any key to continue..等待按鍵繼續游戲。游戲規則和普通貪吃蛇一樣,吃到自己或者撞牆就會結束游戲,此時點陣熄滅,1602保持最后的分數,按任意鍵結束游戲,返回菜單界面。按下退出和自然結束的結果一樣。

  

  進入鋼琴塊界面后,點陣下落方塊,1602顯示分數。S1-S4對應下落的四列,S6為暫停,S16為退出。暫停和退出的現象和貪吃蛇相同。游戲規則為在鋼琴塊快下落到底部時按鍵有效,且越接近底部得分越高,過早按鍵會結束游戲。按鍵順序即消除順序必須要與下落順序一致,否則結束游戲。按下S1-S4時,對應的一列最下方會短暫點亮,增加游戲體驗,同時消除對應方塊。游戲結束和貪吃蛇一樣。

  

  進入電子琴界面后,1602顯示Let it be,含義為演奏你想要的音樂。S1按鍵按下后自動播放一段音樂,點陣顯示循環動態圖。S2-S4對應低音So、La、Si。S5-S11對應中音Do、Re、Mi、Fa、So、La、Si。S12-S15對應高音Do、Re、Mi、Fa。一共可演奏14個音。S16為退出,直接返回菜單。按下S1后,長按任意鍵可手動退出播放,或者等播放結束自動退出播放,退出播放后返回演奏模式。演奏時,按下按鍵即可發聲,長按長響,短按短響。根據不同音調的頻率設置定時器進而控制蜂鳴器,所以音准很好,可以無瑕疵演奏簡單音樂。因圖片無法體現該部分,故補貼圖,詳細情況請見源碼。

功能實現:

  菜單功能通過外層死循環顯示選項並通過內層死循環等待按鍵。通過變量保存選項。按鍵按下后切換選項或者調用游戲控制函數。核心代碼如下:

 1 while (1)
 2     {
 3         MenusLcd1602(function);
 4         while (1)
 5         {
 6             keyvalue = KeyScan_Up();
 7             if (keyvalue > 0 && keyvalue < 4)
 8             {
 9                 if (keyvalue == 1) //上翻
10                 {
11                     if (function == 0)
12                         function = 2;
13                     else
14                         --function;
15                 }
16                 else if (keyvalue == 3) //下翻
17                 {
18                     if (function == 2)
19                         function = 0;
20                     else
21                         ++function;
22                 }
23                 else //確認
24                 {
25                     switch (function)
26                     {
27                         case 0 : Snakes_Subsonic(); break;
28                         case 1 : Falling_Diamonds(); break;
29                         case 2 : Electronic_Organ(); break;
30                     }
31                 }
32                 break;
33             }
34         }
35     }

  不同游戲的實現不同,在此不贅述。值得一提的是,有些C語言版本的貪吃蛇會使用鏈表保存蛇身,使用遞歸產生食物,但在51中無法這樣。malloc函數可能會在ram中產生內存碎片,產生不正常的結果。在51中基本不會使用遞歸,需要使用循環代替。鋼琴塊中,本來使用隨機下落的方法,但是這樣的體驗很差,沒有自己寫下落方塊的體驗感好。電子琴的實現比較簡單,其中點陣動態圖其實是12幀圖片的循環播放,而且那12幀圖片是我花了整整一下午描點描出來的...

反思總結:

  這次作品的基本功能都已經實現,並采取分文件編寫,一個模塊一個文件,一個游戲一個文件。提高了我對於單片機的控制能力,以及代碼的架構能力。整個作品完成后,我也深深感到所學的不足。比如有許多地方涉及到多任務管理,而我采取的方法是大循環內一次調用不同任務。雖然這種偽多任務基本可以滿足需求,但是對於游戲體驗來說還是存在影響。並且如果任務繼續增加,那么這種偽多任務的方法肯定就會產生問題。所以下一步改進可能會使用RTX51這種實時系統的框架實現作品。

源碼鏈接:https://pan.baidu.com/s/19O0d92iTBRRgMoPU3UIYMw 密碼:eu9m

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM