一個簡單的遊戲-貪吃蛇

二 遊戲編程起步


1.一個簡單的遊戲-貪吃蛇


1.貪吃蛇遊戲剖析

1)遊戲的目標。在不被撞死的前提下,吃掉獎子增加自己的長度,來完成升級。

2)遊戲中的物體。蛇,牆壁,獎子。

3)動作。蛇移動,蛇吃獎子,蛇增加長度。

2.數據結構與算法分析

1)數據結構。簡單起見,所有物體都用方塊拼接。

        則蛇可以使用一個一維數組描述,數組的每個單元描述了蛇塊的狀態,如方向;可使用一個二維數組來描述地面情況,不可通過的地方爲牆壁設置爲1,可通過的地方設置爲0;獎子,就是一個特殊的方塊。

2)算法。

        注意觀察蛇的特點。將蛇肢解爲方塊,則會發現每個方塊的移動都依賴於它前面方塊上一次的移動狀態(第一個方塊由玩家控制)。


        如圖,1是蛇頭,4是尾,藍色箭頭是原來移動方向,紅色箭頭是玩家控制的方向(按了下鍵)。移動方向從1~4。(a)->(b) 下右右右,(b)->(c)下下右右。

        根據這個規律,我們可以總結出一個基本算法:用數組來存貯蛇塊,每個蛇塊結點包含的信息有當前的移動方向,那麼更新蛇的狀態時,從尾部到頭部進行處理。


[cpp] view plain copy

  1. for i=n-1 to 1  

  2. {  

  3. dir(i) = dir(i-1)  

  4. pos(i) += dir(i)  

  5. }  

  6. if dirKeyDown  

  7. {  

  8. dir(0) = k  

  9. }  

  10. pos(0) += dir(0)  




        這樣,最複雜的部分就解決了。當然這不是最好的算法,如果我們再仔細觀察下,就會發現這樣的規律,蛇每次移動的時候,都只是頭和尾發生了變化,那麼,每次更新蛇的時候,我們只需要將尾部的蛇塊移到頭部相應的位置,不就更簡單嗎?答案是肯定的。這就是算法的魅力!只要我們勤於動腦筋,總會發現一些更好的解決辦法。


[cpp] view plain copy

  1. pos(n-1) = pos(0)+dir  

  2. insert(n-1) before pos(0)  




        算法的複雜度立即從O(n)變到了O(1)!而且我們還會發現,我們只需要記錄一個方向就可以了,則空間複雜度也因此降低了。


3)地圖。描述了地面信息。

        我們的貪吃蛇遊戲地圖信息很簡單,總共有3類物體會站到地面上:牆壁,蛇,獎子。在每次更新的時候,我們將3類物體的信息按類別填充到地圖中。如,牆壁的位置填1,獎子的位置填2,蛇的位置填3(每個蛇塊都填),沒有東西的地方填0。然後,將這個填滿0,1,2,3的二維數組,交給渲染系統。

         到此,我們的幕後操作就算基本完成,剩下的就是些細節,等到編碼的時候在詳細處理。



3.渲染
地圖數據描述

        渲染貪吃蛇遊戲其實也很簡單,把地圖中1的部分塗成藍色,2的部分塗成紅色,3的部分塗成綠色,這將會是一個什麼樣的效果呢?看下圖:


        怎麼樣,有貪吃蛇遊戲的感覺嗎?再看看下圖:


        簡直是完美!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章