二 遊戲編程起步
1.一個簡單的遊戲-貪吃蛇
1.貪吃蛇遊戲剖析
1)遊戲的目標。在不被撞死的前提下,吃掉獎子增加自己的長度,來完成升級。
2)遊戲中的物體。蛇,牆壁,獎子。
3)動作。蛇移動,蛇吃獎子,蛇增加長度。
2.數據結構與算法分析
1)數據結構。簡單起見,所有物體都用方塊拼接。
則蛇可以使用一個一維數組描述,數組的每個單元描述了蛇塊的狀態,如方向;可使用一個二維數組來描述地面情況,不可通過的地方爲牆壁設置爲1,可通過的地方設置爲0;獎子,就是一個特殊的方塊。
2)算法。
注意觀察蛇的特點。將蛇肢解爲方塊,則會發現每個方塊的移動都依賴於它前面方塊上一次的移動狀態(第一個方塊由玩家控制)。
如圖,1是蛇頭,4是尾,藍色箭頭是原來移動方向,紅色箭頭是玩家控制的方向(按了下鍵)。移動方向從1~4。(a)->(b) 下右右右,(b)->(c)下下右右。
根據這個規律,我們可以總結出一個基本算法:用數組來存貯蛇塊,每個蛇塊結點包含的信息有當前的移動方向,那麼更新蛇的狀態時,從尾部到頭部進行處理。
[cpp] view plain copy
for i=n-1 to 1
{
dir(i) = dir(i-1)
pos(i) += dir(i)
}
if dirKeyDown
{
dir(0) = k
}
pos(0) += dir(0)
這樣,最複雜的部分就解決了。當然這不是最好的算法,如果我們再仔細觀察下,就會發現這樣的規律,蛇每次移動的時候,都只是頭和尾發生了變化,那麼,每次更新蛇的時候,我們只需要將尾部的蛇塊移到頭部相應的位置,不就更簡單嗎?答案是肯定的。這就是算法的魅力!只要我們勤於動腦筋,總會發現一些更好的解決辦法。
[cpp] view plain copy
pos(n-1) = pos(0)+dir
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的部分塗成綠色,這將會是一個什麼樣的效果呢?看下圖:
怎麼樣,有貪吃蛇遊戲的感覺嗎?再看看下圖:
簡直是完美!