1. 程式人生 > >10分鐘學會用python寫遊戲!Python其實很簡單!

10分鐘學會用python寫遊戲!Python其實很簡單!

10分鐘學會用python寫遊戲!Python其實很簡單!

 

安裝pygame

本人電腦是windows 10、python3.6,pygame下載地址:

https://pypi.python.org/pypi/Pygame/1.9.3

請自行下載對應python版本的

pygame

執行以下命令

10分鐘學會用python寫遊戲!Python其實很簡單!

 

建立Pygame視窗及響應使用者輸入

新建一個資料夾alien_invasion,並在資料夾中新建alien_invasion.py檔案,輸入如下程式碼。

10分鐘學會用python寫遊戲!Python其實很簡單!

 

進群:960410445 即可獲取原始碼!

執行上述程式碼,我們可以得到一個灰色介面的視窗:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

建立設定類

為了在寫遊戲的過程中能便捷地建立一些新功能,下面額外編寫一個settings模組,其中包含一個Settings類,用於將所有設定儲存在一個地方。

這樣在以後專案增大時修改遊戲的外觀就更加容易。

我們首先將alien_invasion.py中的顯示屏大小及顯示屏顏色進行修改。

首先在alien_invasion資料夾下新建python檔案settings.py,並向其中新增如下程式碼:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

然後再alien_invasion.py中匯入Settings類,並使用相關設定,修改如下:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

新增飛船影象

接下來,我們需要將飛船加入遊戲中。為了在螢幕上繪製玩家的飛船,我們將載入一幅影象,再使用Pygame()方法blit()繪製它。

在遊戲中幾乎可以使用各種型別的影象檔案,但是使用點陣圖(.bmp)檔案最為簡單,這是因為Pygame預設載入點陣圖。

雖然其他型別的影象也能載入,但是需要安裝額外的庫。

我們推薦去免費的圖片素材網站上去找影象:

https://pixabay.com/

我們在主專案資料夾(alien_invasion)中新建一個資料夾叫images,將如下bmp圖片放入其中。

10分鐘學會用python寫遊戲!Python其實很簡單!

 

接下來,我們建立飛船類ship.py:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

重構:模組game_functions

在大型專案中,經常需要在新增新程式碼前重構既有程式碼。重構的目的是為了簡化程式碼的結構,使其更加容易擴充套件。

我們將實現一個game_functions模組,它將儲存大量讓遊戲Alien invasion執行的函式。通過建立模組game_functions,可避免alien_invasion.py太長,使其邏輯更容易理解。

函式check_events()

首先我們將管理事件的程式碼移到一個名為check_events()的函式中,目的是為了隔離事件迴圈

10分鐘學會用python寫遊戲!Python其實很簡單!

 

然後我們修改alien_invasion.py程式碼,匯入game_functions模組,並將事件迴圈替換成對函式check_events()的呼叫:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

函式update_screen()

將更新螢幕的程式碼移到一個名為update_screen()函式中,並將這個函式放在模組game_functions中:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

其中alien_invasion修改如下:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

從上面一套流程走下來,我們發現:在實際的開發過程中,我們一開始將程式碼編寫得儘可能的簡單,並在專案越來越複雜時進行重構。接下來我們開始處理遊戲的動態方面。

駕駛飛船

這裡我們要實現的就是使玩家通過左右箭頭鍵來控制飛船的左移與右移。

響應按鍵

因為在pygame中,每次按鍵都被註冊為KEYDOWN事件,在check_events()中,我們通過event.type檢測到KEYDOWN事件後還需進一步判斷是哪個按鍵。程式碼如下:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

允許不斷移動

玩家按住右箭頭不動時,我們希望飛船能不斷地移動,知道玩家鬆開為止。這裡我們通過KETUO事件來判斷。因此我們設定一個標誌位moving_right來實現持續移動。原理如下:

飛船不動時,標誌moving_right將為false。玩家按下右箭頭時,我們將這個標誌設定為True;玩家鬆開時,我們將標誌重新設定成False。

這個移動屬性是飛船屬性的一種,我們用ship類來控制,因此我們給這個類增加一個屬性名稱叫,moving_right以及一個update()方法來檢測標誌moving_right的狀態。

ship

10分鐘學會用python寫遊戲!Python其實很簡單!

 

game_functions

10分鐘學會用python寫遊戲!Python其實很簡單!

 

最後在alien_invasion中呼叫update()方法

10分鐘學會用python寫遊戲!Python其實很簡單!

 

左右移動

前面我們實現了向右移動,接下來實現向左移動,邏輯類似,程式碼就不貼了。

調整飛船的速度

當前,每次執行while迴圈時,飛船最多移動一個畫素,我們可以在Settings中新增ship_speed_factor,用於控制飛船的速度。我們將根據這個屬性決定飛船每次迴圈時最多移動多少距離。

Settings:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

Ship:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

限制飛船的活動範圍

如果玩家按住箭頭的時間過長,飛船就會消失,那麼如何使飛船抵達螢幕邊緣時停止移動?這裡我們只需要修改Ship類中的update方法,增加一個邏輯判斷。

重構

這裡我們主要講check_events()函式進行重構,將其中部分程式碼分成兩部分,一部分處理KEYDOWN事件,一部分處理KEYUP事件。

game_functions:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

射擊

接下來新增射擊功能,使玩家按空格鍵時發射子彈,子彈將在螢幕中向上穿行,抵達屏幕後消失。

新增子彈設定

在Settings類中增加一些子彈的屬性,這裡我們建立一個寬3畫素,高15畫素的深灰色子彈。子彈的速度比飛船稍低。

建立Bullet類

10分鐘學會用python寫遊戲!Python其實很簡單!

 

將子彈儲存到group中

前面定義了Bullet類和必要的設定後,就可以編寫程式碼了,在玩家每次按空格鍵時都會發射一發子彈。

首先,我們在alien_invasion中建立一個group,用於儲存所有的有效子彈。

10分鐘學會用python寫遊戲!Python其實很簡單!

 

開火

這裡我們修改check_keydown_events()函式,來監聽玩家按下空格鍵的事件。這裡還需要修改update_screen()函式,確保螢幕每次更新時,都能重繪每一個子彈。

我們來看下效果:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

刪除消失的子彈

在alien_invasion中刪除消失的子彈。

10分鐘學會用python寫遊戲!Python其實很簡單!

 

限制子彈數量

為了鼓勵玩家有目標的射擊,我們規定螢幕上只能同時存在3顆子彈,我們只需要在每次建立子彈前檢查未消失的子彈數目是否小於3即可。

建立update_bullets()函式

為了使alien_invasion中程式碼更加簡單,我們將檢查子彈管理的程式碼,移到game_functions模組中:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

建立fire_bullet()函式

這裡我們將發射子彈的程式碼移到一個獨立的函式中:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

新增外星人,並檢測碰撞

在我們完成新的任務之前,我們先給遊戲新增一個結束遊戲的快捷鍵Q:

建立第一個外星人

這裡和建立飛船的方法一樣

10分鐘學會用python寫遊戲!Python其實很簡單!

 

建立一群外星人

這裡我們首先確定一行能容納多少個外星人以及要繪製幾行。這裡改動程式碼較多,直接看效果:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

移動外星人

前面我們建立的是靜態的外星人,現在我們需要讓外星人動起來。這裡我們在Settings類中設定外星人移動的速度,然後通過Alien類中的update的方法來實現移動

射殺外星人

要想射殺外星人,就必須先檢測兩個編組成員之間是否發生碰撞,在遊戲中,碰撞就是遊戲元素重疊在一起。

這裡我們使用sprite.groupcollide()來檢測兩個編組的成員之間的碰撞。

子彈擊中外星人時,需要立馬知道,並同時使被碰撞的外星人立即消失,因此我們需要在更新子彈的位置後立即檢測碰撞。

結束遊戲

這裡我們還需要知道何時該結束遊戲,有以下幾種情況:

飛船全部被摧毀

外星人到達螢幕底部

實際效果:

10分鐘學會用python寫遊戲!Python其實很簡單!

 

計分

最後我們將給遊戲新增一個Play按鈕,用於根據需要啟動遊戲以及在遊戲結束後重啟遊戲。

我們還將實現一個計分系統,能夠在玩家等級提高時加快節奏。

新增Play按鈕

這裡可以先將遊戲初始化為非活動狀態,當我們點選了按鈕,就開始遊戲。

由於Pygame中沒有內建的建立按鈕的方法。因此我們可以通過建立一個Button類來建立一個自帶標籤的實心矩形。

我們通過檢測滑鼠發生點選後的座標是否與我們繪製的按鈕發生碰撞與否來判斷是否發生了點選事件。

提高等級

為了使玩家將敵人消滅乾淨後能夠提高遊戲難度,增加趣味性,這裡我們可以在Settings類中進行修改,增加靜態初始值,和動態初始值。

記分、等級、剩餘飛船

10分鐘學會用python寫遊戲!Python其實很簡單!

 

打包成exe可執行檔案

上面遊戲開發完了,那麼你需要將其轉成文exe的可執行檔案。我們採用pyinstaller,安裝步驟參考:

https://github.com/pyinstaller/pyinstaller/