Python飛機大戰|10分鐘學會用python寫遊戲(內附教程分享)
2018年python語言大火,這把火看趨勢已然延續到了2019年!
除了在科學計算領域python有用武之地之外,在遊戲、後臺等方面,python也大放異彩,
我將按照正規的項目開發流程,手把手教大家寫個python小遊戲,遊戲的名字叫做alien invasion!
安裝pygame並創建能左右移動的飛船
安裝pygame
本人電腦是windows 10、python3.6,pygame下載地址:
https://pypi.python.org/pypi/Pygame/1.9.3
請自行下載對應python版本的
pygame
運行以下命令
Python|10分鐘學會用python寫遊戲
創建Pygame窗口及響應用戶輸入
新建一個文件夾alien_invasion,並在文件夾中新建alien_invasion.py文件,輸入如下代碼。
Python|10分鐘學會用python寫遊戲
運行上述代碼,我們可以得到一個灰色界面的窗口:
Python|10分鐘學會用python寫遊戲
創建設置類
為了在寫遊戲的過程中能便捷地創建一些新功能,下面額外編寫一個settings模塊,其中包含一個Settings類,用於將所有設置存儲在一個地方。
這樣在以後項目增大時修改遊戲的外觀就更加容易。
我們首先將alien_invasion.py中的顯示屏大小及顯示屏顏色進行修改。
首先在alien_invasion文件夾下新建python文件settings.py,並向其中添加如下代碼:
Python|10分鐘學會用python寫遊戲
然後再alien_invasion.py中導入Settings類,並使用相關設置,修改如下:
Python|10分鐘學會用python寫遊戲
添加飛船圖像
接下來,我們需要將飛船加入遊戲中。為了在屏幕上繪製玩家的飛船,我們將加載一幅圖像,再使用Pygame()方法blit()繪製它。
在遊戲中幾乎可以使用各種類型的圖像文件,但是使用位圖(.bmp)文件最為簡單,這是因為Pygame默認加載位圖。
雖然其他類型的圖像也能加載,但是需要安裝額外的庫。
我們推薦去免費的圖片素材網站上去找圖像:
https://pixabay.com/
我們在主項目文件夾(alien_invasion)中新建一個文件夾叫images,將如下bmp圖片放入其中。
Python|10分鐘學會用python寫遊戲
接下來,我們創建飛船類ship.py:
Python|10分鐘學會用python寫遊戲
重構:模塊game_functions
在大型項目中,經常需要在添加新代碼前重構既有代碼。重構的目的是為了簡化代碼的結構,使其更加容易擴展。
我們將實現一個game_functions模塊,它將存儲大量讓遊戲Alien invasion運行的函數。通過創建模塊game_functions,可避免alien_invasion.py太長,使其邏輯更容易理解。
函數check_events()
首先我們將管理事件的代碼移到一個名為check_events()的函數中,目的是為了隔離事件循環
Python|10分鐘學會用python寫遊戲
然後我們修改alien_invasion.py代碼,導入game_functions模塊,並將事件循環替換成對函數check_events()的調用:
Python|10分鐘學會用python寫遊戲
函數update_screen()
將更新屏幕的代碼移到一個名為update_screen()函數中,並將這個函數放在模塊game_functions中:
Python|10分鐘學會用python寫遊戲
其中alien_invasion修改如下:
Python|10分鐘學會用python寫遊戲
從上面一套流程走下來,我們發現:在實際的開發過程中,我們一開始將代碼編寫得儘可能的簡單,並在項目越來越複雜時進行重構。接下來我們開始處理遊戲的動態方面。
駕駛飛船
這裡我們要實現的就是使玩家通過左右箭頭鍵來控制飛船的左移與右移。
響應按鍵
因為在pygame中,每次按鍵都被註冊為KEYDOWN事件,在check_events()中,我們通過event.type檢測到KEYDOWN事件後還需進一步判斷是哪個按鍵。代碼如下:
Python|10分鐘學會用python寫遊戲
允許不斷移動
玩家按住右箭頭不動時,我們希望飛船能不斷地移動,知道玩家鬆開為止。這裡我們通過KETUO事件來判斷。因此我們設置一個標誌位moving_right來實現持續移動。原理如下:
飛船不動時,標誌moving_right將為false。玩家按下右箭頭時,我們將這個標誌設置為True;玩家鬆開時,我們將標誌重新設置成False。
這個移動屬性是飛船屬性的一種,我們用ship類來控制,因此我們給這個類增加一個屬性名稱叫,moving_right以及一個update()方法來檢測標誌moving_right的狀態。
ship
Python|10分鐘學會用python寫遊戲
game_functions
Python|10分鐘學會用python寫遊戲
最後在alien_invasion中調用update()方法
Python|10分鐘學會用python寫遊戲
左右移動
前面我們實現了向右移動,接下來實現向左移動,邏輯類似,代碼就不貼了。
調整飛船的速度
當前,每次執行while循環時,飛船最多移動一個像素,我們可以在Settings中添加ship_speed_factor,用於控制飛船的速度。我們將根據這個屬性決定飛船每次循環時最多移動多少距離。
Settings:
Python|10分鐘學會用python寫遊戲
Ship:
Python|10分鐘學會用python寫遊戲
限制飛船的活動範圍
如果玩家按住箭頭的時間過長,飛船就會消失,那麼如何使飛船抵達屏幕邊緣時停止移動?這裡我們只需要修改Ship類中的update方法,增加一個邏輯判斷。
重構
這裡我們主要講check_events()函數進行重構,將其中部分代碼分成兩部分,一部分處理KEYDOWN事件,一部分處理KEYUP事件。
game_functions:
Python|10分鐘學會用python寫遊戲
射擊
接下來添加射擊功能,使玩家按空格鍵時發射子彈,子彈將在屏幕中向上穿行,抵達屏幕後消失。
添加子彈設置
在Settings類中增加一些子彈的屬性,這裡我們創建一個寬3像素,高15像素的深灰色子彈。子彈的速度比飛船稍低。
創建Bullet類
Python|10分鐘學會用python寫遊戲
將子彈存儲到group中
前面定義了Bullet類和必要的設置後,就可以編寫代碼了,在玩家每次按空格鍵時都會發射一發子彈。
首先,我們在alien_invasion中創建一個group,用於存儲所有的有效子彈。
Python|10分鐘學會用python寫遊戲
開火
這裡我們修改check_keydown_events()函數,來監聽玩家按下空格鍵的事件。這裡還需要修改update_screen()函數,確保屏幕每次更新時,都能重繪每一個子彈。
我們來看下效果:
Python|10分鐘學會用python寫遊戲
刪除消失的子彈
在alien_invasion中刪除消失的子彈。
Python|10分鐘學會用python寫遊戲
限制子彈數量
為了鼓勵玩家有目標的射擊,我們規定屏幕上只能同時存在3顆子彈,我們只需要在每次創建子彈前檢查未消失的子彈數目是否小於3即可。
創建update_bullets()函數
為了使alien_invasion中代碼更加簡單,我們將檢查子彈管理的代碼,移到game_functions模塊中:
Python|10分鐘學會用python寫遊戲
創建fire_bullet()函數
這裡我們將發射子彈的代碼移到一個獨立的函數中:
Python|10分鐘學會用python寫遊戲
添加外星人,並檢測碰撞
在我們完成新的任務之前,我們先給遊戲添加一個結束遊戲的快捷鍵Q:
創建第一個外星人
這裡和創建飛船的方法一樣
Python|10分鐘學會用python寫遊戲
創建一群外星人
這裡我們首先確定一行能容納多少個外星人以及要繪製幾行。這裡改動代碼較多,直接看效果:
Python|10分鐘學會用python寫遊戲
移動外星人
前面我們創建的是靜態的外星人,現在我們需要讓外星人動起來。這裡我們在Settings類中設置外星人移動的速度,然後通過Alien類中的update的方法來實現移動
射殺外星人
要想射殺外星人,就必須先檢測兩個編組成員之間是否發生碰撞,在遊戲中,碰撞就是遊戲元素重疊在一起。
這裡我們使用sprite.groupcollide()來檢測兩個編組的成員之間的碰撞。
子彈擊中外星人時,需要立馬知道,並同時使被碰撞的外星人立即消失,因此我們需要在更新子彈的位置後立即檢測碰撞。
結束遊戲
這裡我們還需要知道何時該結束遊戲,有以下幾種情況:
飛船全部被摧毀
外星人到達屏幕底部
實際效果:
Python|10分鐘學會用python寫遊戲
計分
最後我們將給遊戲添加一個Play按鈕,用於根據需要啟動遊戲以及在遊戲結束後重啟遊戲。
我們還將實現一個計分系統,能夠在玩家等級提高時加快節奏。
添加Play按鈕
這裡可以先將遊戲初始化為非活動狀態,當我們點擊了按鈕,就開始遊戲。
由於Pygame中沒有內置的創建按鈕的方法。因此我們可以通過創建一個Button類來創建一個自帶標籤的實心矩形。
我們通過檢測鼠標發生點擊後的座標是否與我們繪製的按鈕發生碰撞與否來判斷是否發生了點擊事件。
提高等級
為了使玩家將敵人消滅乾淨後能夠提高遊戲難度,增加趣味性,這裡我們可以在Settings類中進行修改,增加靜態初始值,和動態初始值。
記分、等級、剩餘飛船
Python|10分鐘學會用python寫遊戲
打包成exe可執行文件