用Python和Pygame寫遊戲-從入門到精通(實戰二:惡搞俄羅斯方塊2)

發表於2015-12-28

我們接著來做這個整死人不償命的俄羅斯方塊。

程式碼組織和名詞約定

上一次我們稍微整理了一下游戲執行的框架,這裡需要整理一下python程式碼的框架,一個典型的pygame指令碼結構如下:

其中,lib為pygame的指令碼,遊戲中聲音、影象、控制模組等都放在這裡;而data就是遊戲的資原始檔,影象、聲音等檔案放在這裡。當然這東西並不是硬性規定的,你可以用你自己喜歡的結構來組織自己的pygame遊戲,事實上,除了付你工錢的那傢伙以外,沒有人可以強迫你這樣做或那樣做~ 這次我還是用這種典型的方法來存放各個檔案,便於大家理解。

因為我是抽空在Linux和Windows上交叉編寫的,程式碼中沒有中文註釋,遊戲裡也沒有中文的輸出,所以希望看到清楚解釋的話,還是應該好好的看這幾篇文章。當然最後我會放出所有的程式碼,也會用py2exe編譯一份exe出來,方便傳給不會用python的人娛樂。

因為主要是講解pygame,很多python相關的知識點就一代而過了,只稍微解釋一下可能有些疑問的,如果有看不懂的,請留言,我會酌情追加到文章中。

我們約定,那個掉落方塊的區域叫board,落下的方塊叫shape,組成方塊的最小單位叫tile

我們的lib中可能會有這幾個檔案(未必是全部):

引導檔案

run_game.py很簡單,而且基本所有的pygame工程裡都長得一樣:

將lib目錄加入搜尋路徑就完事了,沒有什麼值得特別說明的。

主迴圈檔案

到現在為止,我們所有的pygame都只有一個介面,開啟是什麼,到關閉也就那個樣子。但實際上的遊戲,一般進去就會有一個開始介面,那裡我們可以選“開始”,“繼續”,“選項”……等等內容。pygame中如何實現這個呢?

因為pygame一開始執行,就是一根筋的等事件並響應,所以我們就需要在事件的迴圈中加入介面的判斷,然後針對的顯示介面。例如:

因為有很多朋友說之前使用的while True的方法不能正常退出,這裡我就聽取大家的意見乾脆把退出也作為一種狀態,相容性可能會好一些。不過在我的機器上(Windows 7 64bit + Python 2.6 32bit + Pygame 1.9.1 32bit)是正常的,懷疑是不是無法正常退出的朋友使用了64位的Python和Pygame(儘管64位Pygame也有,但並不是官方推出的,不保證效果)。

這裡定義了幾個遊戲狀態,最主要的就是’menu‘和’game‘,意義也是一目瞭然的。我們有遊戲物件和選單物件,當遊戲處於某種狀態的時候,就呼叫對應物件的run方法,這個run接受一個時間引數,具體意義相信大家也明白了,基於時間的控制。

同時,我們還有一個’level X‘的狀態,這個主要是控制選單到遊戲之間的轉換,不過雖然寫的level,實際的意義是模式,因為我們希望有幾種不同的遊戲模式,所以在從選單到遊戲過渡的時候,需要這個資訊。

這個程式中,所有的狀態都是通過字串來實現的,說實話未必很好。雖然容易理解但是效率等可能不高,也許使用標誌變數會更好一些。不過既然是例子,首先自然是希望大家能夠看的容易一些。所以最終還是決定使用這個方法。

Menu類

選單顯示了一些選項,並且在使用者調節的時候可以顯示當前的選項(一般來說就是高亮出來),最後確定時,改變狀態。

選單的話,大概就是長這個樣子,都是我們已經熟練掌握的東西,按上下鍵的時候會修改當前的選項,然後draw的時候也就判斷一下顏色有些不同的標識一下就OK了。這裡的draw就是把幾個專案寫出來的函式。繪圖部分和控制部分儘量分開,比較清晰,也容易修改。

這裡的run其實並沒有用到elapse引數,不過我們還是把它準備好了,首先可以與main一致,其次如果我們想在開始選單里加一些小動畫什麼的,也比較便於擴充套件。

工具函式

工具庫util.py裡其實沒有什麼特別的,都是一些便於使用的小東西,比如說在載入資原始檔是,我們希望只給出一個檔名就能正確載入,那就需要一個返回路徑的函式,就像這樣:

這個函式可以根據給定的檔名,自己搜尋相應的路徑,最後返回全路徑以供載入。

這次把一些周邊的程式碼說明了一下,當然僅有這些無法構成一個可以用的俄羅斯方塊,下一次我們就要開始搭建俄羅斯方塊的遊戲程式碼了。

相關文章