本系列是對入門書籍《Python編程:從入門到實踐》的筆記整理,屬於初級內容。標題順序採用書中標題。
本篇是Python小遊戲《外星人入侵》的最後一篇的後篇,本章將實現小遊戲的記分板功能並結束該項目的開發。
本篇標題編號就不從1開始了,緊接上篇,從標題4開始。
4. 記分板
下面我們將實現一個記分系統,實時跟蹤玩家的得分,並顯示最高得分,當前等級和餘下的飛船數。首先,我們需要創建一個Scoreboard類。
4.1 新增scoreboard.py
新增一個Scoreboard類,用作屏幕中的記分板,它的屏幕正中央上方部分是最高分數,屏幕右邊是當前分數和等級,左上角是剩餘的飛船數量,飛船數量用圖片表示,因此,我們還要將Ship類更改為從Sprite繼承(該類僅改動此處)。下面三張圖都是同一個文件。
4.2 修改settings.py
設置外星人的分數,外星人分數增長的速度:
4.3 修改game_stats.py
在GameStats中設置一個用於記錄最高分的屬性,也正因此,應該將它放在構造函數中,它只會變大,在沒有重新運行遊戲前,它不會被重置為0;在reset_stats()方法中,初始化score和level兩個屬性,這兩個屬性每點一次Play按鈕都會被重置。對於level這個屬性,每消滅一批艦隊,level就加1.
4.4 修改主程序alien_invasion.py
從上面的註釋可以看出,我們生成了一個計分板的實例score;game_functions.py中的四個函數都要添加score參數,換句話說,這四個函數都要修改,下面我們逐一修改這四個函數。
4.5 修改game_functions.py
4.5.1 修改參數
有幾個函數只需要在參數列表中增加score參數:
接下來是改動較多的函數。
4.5.2 修改check_play_button()函數
首先參數列表添加了score參數,if判斷中還添加了四行生成計分板的代碼。之所以這裡要添加這四行代碼,其實是為了當你重新開始(也就是第二次及以後點擊Play按鈕)遊戲時,計分板能正確顯示。
當第一運行遊戲時,沒有這四行也能正確顯示計分板。但是從第二次點擊Play開始,如果沒有這四行,遊戲的各個參數雖然更新了(通過check_play_button()中的各種重置函數得到了更新),可這些更新還沒有讓記分板中這四個參數的圖像得到重新繪製,即屬性的更新沒有自動觸發score的這四個函數。所以顯示會不正確,因此必須在這裡添加這四行代碼。
4.5.3 修改update_screen()函數
4.5.4 修改update_bullets()和update_aliens()函數
這倆函數只是增加參數而已。
check_aliens_bottom()內也變化也不大,該函數的變化不再以代碼的形式單獨列出:
該函數增加了一個score參數,它內部調用了ship_hit()函數,為這個調用也增加
score參數。這就是全部變化。4.5.5 修改check_bullet_alien_collisions()函數
首先我們增加了一個判斷語句,用於根據消滅的外星人來增加分數,由於有可能一顆子彈打到多個外星人但只算了一個外星人的分數,所有用循環來確保消滅掉的每一個外星人都得到了統計。collisions是一個字典,這裡子彈是鍵,該子彈消滅的外星人對象為值(是個列表)。
我們還新增了一個更新最高積分的函數check_high_score(),它的代碼如下:
第二個if中,添加了增加等級的語句,緊跟著的是重新在計分板中繪製等級圖像。
4.5.6 修改ship_hit()和check_aliens_bottom()函數
4.6 最後運行效果
至此所有的添加都已經結束,下圖是遊戲的最終效果:
5. 小結
Python小遊戲告一段落,一共三篇文章。本文中講述了:
如何創建用於開始新遊戲的Play按鈕;
如何檢測鼠標點擊事件;
如何在遊戲處於活動狀態時隱藏光標;
如何隨遊戲的進行調整節奏;
如何實現記分系統;
以及如何以文本和非文本方式顯示信息。
後三篇文章將是使用Python來進行數據統計分析、繪圖等內容。
閱讀更多 VPointer701 的文章