Python 實戰開發俄羅斯方塊遊戲

GitChat的部落格發表於2018-07-03

“人生苦短,我用 Python”,這是網路上的一句戲言,卻真實反映了 Python 語言的江湖地位。2017年 IEEE Spectrum 雜誌釋出的程式語言排行榜中,Python 排行榜首。Python 也被視為 AI 時代的頭牌語言,是資料科學和機器學習領域使用最多的語言。Python 語言學習曲線平滑,上手容易。然而,新手必須通過專案實戰才能顯著提高 Python 開發能力。本達人課意在通過俄羅斯方塊遊戲開發實戰,來提高初學者的 Python 程式設計能力。

本課程共包含兩大部分。

第一部分(第1篇)主要講解如何搭建開發環境。課程採用的整合開發環境是Pycharm Community 2017.3。這一部分先講如何在 Pycharm 內建立專案,接著講如何安裝 Pygame 工具包。

第二部分(第2-23篇)開啟俄羅斯方塊遊戲開發實戰。每一篇對應一個實驗步驟,每一個實驗步驟實現一個核心功能,從文章標題可窺一二。

開發實戰部分的每篇文章基本遵循這樣的撰寫思路:文章開頭首先展示實驗步驟的目標,即程式執行效果,接著分析其背後的具體實現思路和步驟,並給出詳盡的程式碼解讀及重難點分析,最後大家可以在 GitHub 上檢視對應的原始碼。

作者介紹

葉常春,原國防科技大學計算機學院副教授。擁有十餘年的程式設計教學經驗,主講大學計算機基礎、計算機程式設計、資料結構和演算法設計與分析等課程,熟悉 Python、Android、C/C++、Java、JavaScript + HTML + CSS、PHP 和 SQL 等語言。熱愛教學,熱愛程式設計。踐行“做中學”理念,在入門級程式設計課程中指導學生開發出俄羅斯方塊、五子棋和推箱子等遊戲程式。相信只要給予時間和土壤,任何一名學生都能成長為程式設計高手。

課程內容

導讀:功能概覽

引言

你有玩過俄羅斯方塊遊戲嗎?這是一款規則簡單、上手容易,卻讓人愛不釋手的遊戲。作為一名程式設計師,你有沒有想過自己寫一個俄羅斯方塊遊戲程式,分享給家人、朋友、還有同學玩一玩呢?我在教大學一年級學生開發這款遊戲的時候,就有學生自豪地跟我講他在高中同學群裡分發了遊戲程式,高中同學好生羨慕呢。

除了幫你贏得身邊人的掌聲,編寫俄羅斯方塊遊戲程式能實實在在地提升你的程式設計技能。在自己十多年的教學過程中,剛學完程式設計基礎課程的同學經常問我:“老師,我現在編寫的程式只有幾十行,但現在的軟體動輒上萬行,我下一步該怎麼走?”我的建議是,下一步做到能夠熟練編寫幾百行的程式。進一步,我還會提議去編寫小遊戲程式。因為我知道,大家都愛玩遊戲,編寫遊戲程式更能夠激發同學們的幹勁,所需的知識面比程式設計基礎課所覆蓋的知識面要更廣。編寫遊戲程式要涉及圖形介面程式設計、事件驅動機制、定時器、音效和影象等等。程式設計基礎課通常沒有覆蓋到的這些內容。

編寫俄羅斯方塊遊戲程式,是一種專案實戰。我建議你通過一系列專案實戰來提升程式設計技能,同時強烈建議你每一個專案實戰的成果和經驗教訓釋出到你的網路空間中。可以釋出到部落格中,可以釋出到 GitHub 或其他類似網站上。這樣,你把自己的學習成長軌跡記錄下來,一方面會大大加快自己成長的速度,另一方面的好處是,幫助你找到一份好工作。你想呀,你怎麼讓面試官相信你擁有了足夠的技能呢?光靠嘴巴說,是沒有信服力的。如果你把自己做過的一個個專案講出來並公佈專案 URL 連結,面試官拿到可靠的證據,不錄取你還錄取誰呢。

“人生苦短,我用 Python”,這是網路上的一句戲言,卻真實反映了 Python 語言的江湖地位。2018年4月,關注程式語言流行程度的 PYPL 指數指出,Python 的受歡迎程度獲得5.2%的巨幅增長,是開發人員中受歡迎程度上升最快的語言。Python 也被視為 AI 時代的頭牌語言,是資料科學和機器學習領域使用最多的語言。Python 語言學習曲線平滑,上手容易。然而,新手必須通過專案實戰才能顯著提高 Python 開發能力。

本達人課面向擁有 Python 程式設計基礎的入門級程式設計師,通過俄羅斯遊戲開發實戰來提高新手的 Python 程式設計能力。對於程式設計基礎為零的讀者,我推薦先學習《Python程式設計:從入門到實踐》一書,以及我本人釋出的視訊課程

功能概覽

本課程共包含兩大部分。

第一部分(第1篇)講解如何搭建開發環境。課程採用的整合開發環境是 Pycharm Community 2017.3。這一部分先講如何在 Pycharm 內建立專案,接著講如何安裝 Pygame 工具包。

第二部分(第2-22篇)開啟俄羅斯方塊遊戲開發實戰。每一篇對應一個實驗步驟。每一個實驗步驟實現一個核心功能。文章標題概括描述了每一篇實現的核心功能。每篇文章會首先指出實驗步驟的目標,即所要實現的程式效果。接著,描述實驗步驟的實現思路和任務,並逐個任務地講解具體的做法,即如何在前面開發基礎上修改/補充程式碼,並解析背後的思考過程。最後,分享該實驗步驟對應的原始碼,我會將其放在 Github 上,供大家瀏覽、下載。

全部21個實驗步驟的編排遵循“小步走”的策略。我一再提醒自己,每一步驟要小,要有可見的結果。這樣,一方面控制了單個實驗步驟的難度,另一方面開發者可以清晰地判斷開發工作是否達成了目標。比如,第一個步驟是繪製遊戲視窗,我只用了7行程式碼來實現這一小小功能,僅此而已,其他圖形繪製工作在本節中並不會涉及。諸如此類,後續每個實驗步驟都經過了仔細斟酌,保證每節課只專注一個核心功能,力求步驟小,將其講清講透,難度可控。如果你瀏覽本課程的目錄,或多或少能夠看出“小步走”的策略。

整個課程走完後,程式的執行效果是什麼樣子的呢?

有兩個方法可以看執行效果。第一,大家可以觀看我製作的視訊。第二,可以訪問我上傳到 Github 的原始碼,然後把原始碼壓縮包(.zip)下載到本地,解壓後執行它。

注意,你需要首先安裝有 Python 3 以及 Pygame 工具包。如果你不知道怎麼從 Github 下載原始碼壓縮包,或者不知道如何安裝 Python 3,又或者不知道如何安裝 Pygame 工具包,上網搜尋做法,保管你找到詳盡的說明文件。你也可以訪問本人釋出的視訊課程,課程第一章講解了如何安裝 Python 3。

知識內容方面,通過本課程你將學到:

  1. 物件導向程式設計;
  2. 把一個程式分解成多個模組的分析方法;
  3. 使用第三方工具包的 API;
  4. 事件驅動機制,包括鍵盤按鍵事件響應和定時事件響應等;
  5. 生成隨機數的功能實現;
  6. 表示遊戲狀態的資料結構;
  7. 圖形使用者介面(GUI)程式設計,包括圖形、影象和音效。

如果本課程是你需要的,讓我們開始吧。祝好運!

第01課:Pycharm 中建立專案

步驟目標

本文將實現兩個目標:

  1. 在 Pycharm Community(以下簡稱 Pycharm)中建立工程(也叫專案,Project)。
  2. 安裝遊戲程式依賴的 pygame 包。我們將利用 pygame 第三方工具包來開發俄羅斯方塊遊戲程式。

正式開始之前,你需要在自己的電腦中安裝 Python 3.x 和 Pycharm Community(叫做社群版,免費,完全夠用)。如果沒有安裝,請參閱以下文件/視訊資料完成安裝。

建立工程

啟動 Pycharm。

第一次啟動 Pycharm,看到的介面如圖1所示。點選“Create New Project”選項,就進入建立新工程環節。點選“Open”選項,開啟已有的工程。

圖1 第一次啟動Pycharm

如果已開啟了一個工程,如圖2所示,那麼選擇選單“File/New Project…”即可建立新工程。

圖2 開啟一個工程時的介面

注意:這裡的截圖都取自 Windows 系統上 Pycharm Community 2017.3.4 的執行介面,與 Linux 系統上的 Pycharm 執行介面會有少許差異,但不會構成誤解。後面的課程內容同上。

給工程取名

在文字輸入框內指定工程對應的資料夾,如圖3所示。Pycharm 建立工程的主要動作是建立該工程專屬的資料夾,開發過程中建立的原始碼檔案和其他隸屬於工程的檔案都將放在這個資料夾下面。比如,我們在路徑“C:\Users\612226\Documents”下建立工程“TetrisGame”,那麼將會在上述路徑下建立名為“TetrisGame”的資料夾。

圖3 指定工程名稱(實質是指定工程資料夾的名稱)

需要指出的是,Windows 系統中檔案路徑的寫法和 Linux 系統中的寫法是有差異的。比如,Windows 系統中的檔案路徑寫法類似於“C:\Users\612226\PycharmProjects”,而在 Linux系統中,該路徑名的寫法類似於“/Users/612226/PycharmProjects”。

兩者的差異主要有兩點:

  1. Windows 系統中,碟符(本例的“C:\”)打頭。Linux 系統中,斜槓 /(代表根目錄)打頭。
  2. Windows 系統中,上下級之間用反斜槓“\”分隔。Linux 系統中,上下級之間用斜槓“/”分隔。

工程建立成功

點選圖3“Create”按鈕,將建立工程,進入如圖4所示的介面。下一步驟(點選底部的“下一步驟”按鈕即可到達)將講解如何往工程內加入 Python 程式碼檔案。

圖4 工程建立成功

安裝 pygame 包

本達人課進行的遊戲開發依賴於 pygame 包。下面講解如何安裝 pygame 包。

如果沒有安裝 pygame 包,執行遊戲程式時,將遇到錯誤,原因在於 import pygame 語句執行失敗。

選擇並點選 Pycharm 頂部選單“File / Settings”(這裡,斜槓/用於分隔上下級選單項。此處意味著,先點選 File,然後在下級選單點選 Settings。下同。),將彈出 TetrisGame 工程的屬性設定視窗,如圖5所示。在設定視窗的左上角搜尋框內輸入 interpreter,將匹配 Project Interpreter 配置項,接著點選右上角綠色加號+。

圖5 屬性設定視窗

在彈出的視窗(見圖6)上部的搜尋框內輸入 pygame,再點選下部的“Install Package”按鈕。

圖6 安裝 pygame 包

等待安裝完畢。安裝完畢後,效果如圖7所示。

圖7 pygame 包安裝完畢

關閉視窗,再在如圖5所示的視窗內點選“OK”,這樣就退出了屬性設定操作,回到圖4所示的編輯介面。

小結

本文首先介紹瞭如何新建工程(工程也叫作專案)。Pycharm 新建工程的主要動作是建立工程資料夾。接著介紹瞭如何為工程安裝 pygame 包(實際上是在工程附屬的虛擬環境內安裝 pygame 包)。

上述兩項工作的前提是安裝了 Python 3 和 Pycharm。

第02課:顯示遊戲視窗

步驟目標

本文將達成的目標是:開發完成一個 Python 程式,執行該程式將顯示圖1所示的俄羅斯方塊遊戲視窗。

圖1 俄羅斯方塊遊戲視窗

完成本目標的前提是,你在自己的電腦中安裝了 Python 3 和 Pycharm(用免費的社群版即可),而且你已經針對俄羅斯方塊遊戲開發建立了工程,並安裝了 Pygame 包。如果你沒有做到以上前提,請返回到第一篇,那裡講了怎麼做。

顯示遊戲視窗功能實現的步驟分成兩個子步驟:

  1. 建立和編寫程式檔案 main.py。
  2. 執行 main.py。

顯示遊戲視窗功能實現

上一篇中,我們已經建立了 TetrisGame 工程(工程名字可以換成別的)。下面讓我們在該工程下建立第一個 Python 程式檔案 main.py。你可以把 main.py 換成其他檔名。我之所以使用 main.py 這個名字,是因為它表明該檔案是程式執行開始的地方。

建立和編寫程式檔案 main.py

(1)建立程式檔案 main.py。

圖2演示瞭如何在 TetrisGame 工程內建立 Python 程式檔案。做法是滑鼠右鍵點選工程 TetrisGame,然後在彈出的選單中選擇“New/Python File”,在彈出的小視窗內輸入程式檔名:main,點選“OK”按鈕後將建立 main.py 檔案。

要強調的是,New 選單的下級選單中要選擇的是處於中部的“Python File”,不是頂部的“File”。

圖2 建立程式檔案

(2)編寫main.py的程式碼。

將下文展示的程式碼(最左側的數字序號是程式碼行號),敲入 main.py 程式檔案內。前面四行是註釋,不需要敲程式序檔案內。

執行 main.py

滑鼠右鍵選中“main.py”,在彈出的選單中點選“Run ‘Main’”選單項執行程式。程式執行後,將彈出遊戲視窗,見圖1。

下文將對 main.py 中的程式碼及程式的執行流程做詳細解讀。

程式檔案 main.py 的說明

實現顯示遊戲視窗的程式碼 main.py,如下

1.    # @Time    : 2018/4/23 16:442.    # @Author  : freedomyeah3.    # @Email   : iamdouble@163.com4.    # @Copyright:  MIT5.    import sys6.    import pygame7.    8.    def main():9.        #初始化pygame。啟用Pygame必不可少的一步,在程式開始階段執行。10.        pygame.init()11.        #建立螢幕物件(也即視窗物件)12.        screen = pygame.display.set_mode((1200, 900) )  #解析度是1200*90013.        pygame.display.set_caption("俄羅斯方塊")  #視窗標題14.     15.        #螢幕背景色16.        bg_color = (230, 230, 230)17.    18.        #遊戲主迴圈19.        while True:20.            #監視鍵盤和滑鼠事件21.            for event in pygame.event.get():22.                if event.type == pygame.QUIT:  #關閉視窗的事件23.                    sys.exit()   #退出程式24.    25.             #填充螢幕背景色26.            screen.fill(bg_color)27.    28.            #重新整理螢幕29.            pygame.display.flip()30.     31.    if __name__ == '__main__':32.        main()

對於上面的程式碼,說明如下:

(1)第5行匯入 sys 模組。第23行呼叫了 sys 模組的 exit() 函式,作用是退出程式。

(2)第6行匯入 pygame 模組。pygame 模組用於繪製圖形和顯示視窗。

(3)第8~29行定義了 main() 函式,然後在第32行呼叫 main()函式。第31行程式碼的作用是檢測本行程式碼所在的程式檔案(此處就是main.py)是否是“直接執行的情形”,如果是就呼叫 main() 函式;否則不呼叫 main() 函式。

  • 在 Pycharm 中右鍵點選 main.py 可直接執行它。此外,在命令列介面上,比如 Windows 終端上,輸入“python main.py”,也可直接執行 main.py。
  • 什麼時候 main.py 不屬於直接執行的情形呢?答案是,別的程式檔案(比如 abc.py)匯入 main.py(即:import main.py)的時候。

(4)對於 main() 函式內的程式碼,解釋說明如下。

  • 第10行是呼叫 pygame 模組的 init 函式進行初始化。使用 pygame 函式之前務必進行初始化。
  • 第12行是呼叫 display 模組的 set_mode 函式,作用是初始化螢幕物件(也即視窗物件)。此處傳入一個引數,即(1200, 900)元組,這使得視窗的解析度是1200x900。display 模組隸屬於 pygame 模組。
  • 第13行程式碼的作用是設定視窗標題。
  • 第16行程式碼的作用是把顏色值(230, 230, 230)賦值給 bg_color 變數。第26行程式碼將把 bg_color 用作視窗背景色,效果如圖1所示。顏色值(230, 230, 230)中,三個整數依次是三原色中紅色、綠色和藍色的濃度值。濃度值是一個整數,最大為255,最小為0。
  • 第19~29行程式碼在下面解釋說明。

(5)第19行~29行構成一個 while 迴圈。

  • 第19行語句中,迴圈測試條件是 True,意味著這是一個無窮迴圈。也就是說,迴圈會一直執行,直至玩家關閉視窗。
  • 第21行中,pygame.event.get() 的作用是獲取事件列表。事件列表內包含0個或多個事件物件。第21行將依次賦值給 event 變數。

知識點: 玩家每次按鍵盤,將引發鍵盤按鍵事件,接著 pygame 將新建事件物件,然後事件物件將加入到事件列表中。玩家操作滑鼠也會引發事件。

  • 第22行程式碼中,event.type 是事件物件的型別。pygame.QUIT 是 pygame 模組內定義的常量,指的是關閉視窗的事件型別。玩家點選視窗標題欄上的關閉按鈕(見圖1右上角),將引發 pygame.QUIT 型別的事件。而玩家按下鍵盤的話,將引發 pygame.KEYDOWN 型別的事件。
  • 第23行程式碼是在玩家點選視窗標題欄上的關閉按鈕時執行的,作用是退出整個程式。
  • 第26行是填充螢幕背景色。第29行是重新整理螢幕,以使最近的繪製操作生效。

根據上面的描述,我們能猜測到玩家是向程式發出命令來控制遊戲的。目前只能夠識別玩家發出的關閉視窗的命令(具體動作是點選視窗標題欄的關閉按鈕)。將來會增加更多程式碼來識別通過鍵盤發出的各種命令。

程式執行流程

對於程式執行流程,我們需要了然於胸。否則,隨著程式碼增加,有可能理不清頭緒。

程式執行流程的主幹是:

(1)初始化 pygame;

(2)初始化遊戲視窗,並設定視窗標題;

(3)反覆地執行遊戲主迴圈:

  • 遍歷事件列表,對每一個事件作出響應處理。響應處理的結構大致是:
 if(是關閉視窗事件)     退出程式 elif(是鍵盤按鍵事件)     處理按鍵事件
  • 繪製視窗內的元素。例如填充背景色。以後會有更多繪製操作。
  • 重新整理視窗。

實現新功能的絕大多數程式碼,將插入遊戲主迴圈內。當然,我們會把擴充的程式碼封裝成一個個函式。

小結

正如開頭所說,本文的目標是顯示解析度為1200x900的遊戲視窗。如果你達成目標,說明你幹得不錯。

在理解各行程式碼用途的前提下,你可以抄程式碼,不必要記住它們。然而,你務必吃透程式主迴圈,以免將來對不斷增加的程式碼失去掌控。

我已經把原始碼上傳至 GitHub

你點選網頁中的“main.py”(如圖3所示),就可以瀏覽該檔案。要下載整個工程資料夾(目前其下只有 main.py 檔案),則先點選“Clone or download”,再點選“Download Zip”,你將下載到一份 zip 檔案,解壓後正是工程資料夾。

圖3 在GitHub上瀏覽或下載原始碼
第03課:繪製遊戲區域
第04課:繪製小方塊
第05課:繪製方塊
第06課:捕捉鍵盤按鍵事件
第07課:移動方塊
第08課:防止方塊出界
第09課:翻轉方塊
第10課:隨機生成新方塊
第11課:加速落到底部
第12課:壘牆
第13課:解決壘牆時方塊重疊問題
第14課:方塊自動下落
第15課:消行計分
第16課:玩家指示開始遊戲
第17課:玩家暫停遊戲
第18課:遊戲結束
第19課:防止穿牆
第20課:提示下一方塊
第21課:強制重新開始和介面變樣
第22課:難度級別和使用說明
第23課:背景音樂和背景圖片

閱讀全文: http://gitbook.cn/gitchat/column/5b1a31bc862a01660e35955c

相關文章