目錄
13.6.2 響應外星人和飛船碰撞
game_stats.py
settings.py
alien_invasion.py
game_functions.py
ship.py
注意
13.6.3 有外星人到達屏幕底端
game_functions.py
13.6.4 游戲結束
game_stats.py
game_functions.py
13.7 確定應運行游戲的哪些部分
alien_invasion.py
13.8 小結
第14 章
記 分
14.1 添加 Play 按鈕
game_stats.py
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
13.6.2 響應外星人和飛船碰撞
現(xiàn)在需要確定外星人與飛船發(fā)生碰撞時,該做些什么。我們不銷毀ship實例并創(chuàng)建一個新的 ship實例,而是通過跟蹤游戲的統(tǒng)計信息來記錄飛船被撞了多少次(跟蹤統(tǒng)計信息還有助于記 分)。 下面來編寫一個用于跟蹤游戲統(tǒng)計信息的新類——GameStats,并將其保存為文件 game_stats.py:
game_stats.py
class GameStats():
"""跟蹤游戲的統(tǒng)計信息"""
def __init__(self, ai_settings):
"""初始化統(tǒng)計信息"""
self.ai_settings = ai_settings
1 self.reset_stats()
def reset_stats(self):
"""初始化在游戲運行期間可能變化的統(tǒng)計信息"""
self.ships_left = self.ai_settings.ship_limit
在這個游戲運行期間,我們只創(chuàng)建一個GameStats實例,但每當玩家開始新游戲時,需要重 置一些統(tǒng)計信息。為此,我們在方法reset_stats()中初始化大部分統(tǒng)計信息,而不是在__init__() 中直接初始化它們。我們在__init__()中調(diào)用這個方法,這樣創(chuàng)建GameStats實例時將妥善地設置 這些統(tǒng)計信息(見?),同時在玩家開始新游戲時也能調(diào)用reset_stats()。 當前只有一項統(tǒng)計信息——ships_left,其值在游戲運行期間將不斷變化。一開始玩家擁有 的飛船數(shù)存儲在settings.py的ship_limit中:
settings.py
# 飛船設置
self.ship_speed_factor = 1.5
self.ship_limit = 3
我們還需對alien_invasion.py做些修改,以創(chuàng)建一個GameStats實例:
alien_invasion.py
--snip--
from settings import Settings
1 from game_stats import GameStats
--snip--
def run_game():
--snip--
pygame.display.set_caption("Alien Invasion")
# 創(chuàng)建一個用于存儲游戲統(tǒng)計信息的實例
2 stats = GameStats(ai_settings)
--snip--
# 開始游戲主循環(huán)
while True:
--snip--
gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
3 gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)
--snip--
我們導入了新類GameStats( 見1),創(chuàng)建了一個名為stats的實例(見2),再調(diào)用 update_aliens()并添加了實參stats、screen和ship(見3)。在有外星人撞到飛船時,我們將使用這些實參來跟蹤玩家還有多少艘飛船,以及創(chuàng)建一群新的外星人。 有外星人撞到飛船時,我們將余下的飛船數(shù)減1,創(chuàng)建一群新的外星人,并將飛船重新放置 到屏幕底端中央(我們還將讓游戲暫停一段時間,讓玩家在新外星人群出現(xiàn)前注意到發(fā)生了碰撞, 并將重新創(chuàng)建外星人群)。 下面將實現(xiàn)這些功能的大部分代碼放到函數(shù)ship_hit()中:
game_functions.py
import sys
1 from time import sleep
import pygame
--snip--
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):
"""響應被外星人撞到的飛船"""
# 將ships_left減1
2 stats.ships_left -= 1
# 清空外星人列表和子彈列表
3 aliens.empty()
bullets.empty()
# 創(chuàng)建一群新的外星人,并將飛船放到屏幕底端中央
4 create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
# 暫停
5 sleep(0.5)
6 def update_aliens(ai_settings, stats, screen, ship, aliens, bullets):
--snip--
# 檢測外星人和飛船碰撞
if pygame.sprite.spritecollideany(ship, aliens):
ship_hit(ai_settings, stats, screen, ship, aliens, bullets)
我們首先從模塊time中導入了函數(shù)sleep(),以便使用它來讓游戲暫停(見1)。新函數(shù) ship_hit()在飛船被外星人撞到時作出響應。在這個函數(shù)內(nèi)部,將余下的飛船數(shù)減1(見2),然 后清空編組aliens和bullets(見3)。
接下來,我們創(chuàng)建一群新的外星人,并將飛船居中(見4),稍后將在Ship類中添加方法 center_ship()。最后,我們更新所有元素后(但在將修改顯示到屏幕前)暫停,讓玩家知道其 飛船被撞到了(見5)。屏幕將暫時停止變化,讓玩家能夠看到外星人撞到了飛船。函數(shù)sleep() 執(zhí)行完畢后,將接著執(zhí)行函數(shù)update_screen(),將新的外星人群繪制到屏幕上。
我們還更新了update_aliens()的定義,使其包含形參stats、screen和bullets(6),讓它 能夠在調(diào)用ship_hit()時傳遞這些值。
下面是新方法center_ship(),請將其添加到ship.py的末尾:
ship.py
def center_ship(self):
"""讓飛船在屏幕上居中"""
self.center = self.screen_rect.centerx
為讓飛船居中,我們將飛船的屬性center設置為屏幕中心的x坐標,而該坐標是通過屬性 screen_rect獲得的。
注意
我們根本沒有創(chuàng)建多艘飛船,在整個游戲運行期間,我們都只創(chuàng)建了一個飛船實例,并 在該飛船被撞到時將其居中。統(tǒng)計信息ships_left讓我們知道飛船是否用完。
請運行這個游戲,射殺幾個外星人,并讓一個外星人撞到飛船。游戲暫停后,將出現(xiàn)一群新 的外星人,而飛船將在屏幕底端居中。
13.6.3 有外星人到達屏幕底端
如果有外星人到達屏幕底端,我們將像有外星人撞到飛船那樣作出響應。請?zhí)砑右粋€執(zhí)行這 項任務的新函數(shù),并將其命名為update_aliens():
game_functions.py
def check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets):
"""檢查是否有外星人到達了屏幕底端"""
screen_rect = screen.get_rect()
for alien in aliens.sprites():
1 if alien.rect.bottom >= screen_rect.bottom:
# 像飛船被撞到一樣進行處理
ship_hit(ai_settings, stats, screen, ship, aliens, bullets)
break
def update_aliens(ai_settings, stats, screen, ship, aliens, bullets):
--snip--
# 檢查是否有外星人到達屏幕底端
2 check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets)
函數(shù)check_aliens_bottom()檢查是否有外星人到達了屏幕底端。到達屏幕底端后,外星人的 屬性rect.bottom的值大于或等于屏幕的屬性rect.bottom的值(見1)。如果有外星人到達屏幕底 端,我們就調(diào)用ship_hit();只要檢測到一個外星人到達屏幕底端,就無需檢查其他外星人,因 此我們在調(diào)用ship_hit()后退出循環(huán)。
我們在更新所有外星人的位置并檢測是否有外星人和飛船發(fā)生碰撞后調(diào)用check_aliens_ bottom()(見2)?,F(xiàn)在,每當有外星人撞到飛船或抵達屏幕底端時,都將出現(xiàn)一群新的外星人。
13.6.4 游戲結束
現(xiàn)在這個游戲看起來更完整了,但它永遠都不會結束,只是ships_left不斷變成更小的負數(shù)。 下面在GameStats中添加一個作為標志的屬性game_active,以便在玩家的飛船用完后結束游戲:
game_stats.py
def __init__(self, settings):
--snip--
# 游戲剛啟動時處于活動狀態(tài)
self.game_active = True
現(xiàn)在在ship_hit()中添加代碼,在玩家的飛船都用完后將game_active設置為False:
game_functions.py
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):
"""響應飛船被外星人撞到"""
if stats.ships_left > 0:
# 將ships_left減1
stats.ships_left -= 1
--snip--
#暫停一會兒
sleep(0.5)
else:
stats.game_active = False
ship_hit()的大部分代碼都沒變。我們將原來的所有代碼都移到了一個if語句塊中,這條if 語句檢查玩家是否至少還有一艘飛船。如果是這樣,就創(chuàng)建一群新的外星人,暫停一會兒,再接 著往下執(zhí)行。如果玩家沒有飛船了,就將game_active設置為False。
13.7 確定應運行游戲的哪些部分
在alien_invasion.py中,我們需要確定游戲的哪些部分在任何情況下都應運行,哪些部分僅在 游戲處于活動狀態(tài)時才運行:
alien_invasion.py
# 開始游戲主循環(huán)
while True:
gf.check_events(ai_settings, screen, ship, bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)
gf.update_screen(ai_settings, screen, ship, aliens, bullets)
在主循環(huán)中,在任何情況下都需要調(diào)用check_events(),即便游戲處于非活動狀態(tài)時亦如此。 例如,我們需要知道玩家是否按了Q鍵以退出游戲,或單擊關閉窗口的按鈕。我們還需要不斷更 新屏幕,以便在等待玩家是否選擇開始新游戲時能夠修改屏幕。其他的函數(shù)僅在游戲處于活動狀 態(tài)時才需要調(diào)用,因為游戲處于非活動狀態(tài)時,我們不用更新游戲元素的位置。 現(xiàn)在,你運行這個游戲時,它將在飛船用完后停止不動。
13.8 小結
在本章中,你學習了:如何在游戲中添加大量相同的元素,如創(chuàng)建一群外星人;如何使用嵌 套循環(huán)來創(chuàng)建元素網(wǎng)格,還通過調(diào)用每個元素的方法update()移動了大量的元素;如何控制對象 在屏幕上移動的方向,以及如何響應事件,如有外星人到達屏幕邊緣;如何檢測和響應子彈和外 星人碰撞以及外星人和飛船碰撞;如何在游戲中跟蹤統(tǒng)計信息,以及如何使用標志game_active 來判斷游戲是否結束了。
在與這個項目相關的最后一章中,我們將添加一個Play按鈕,讓玩家能夠開始游戲,以及游 戲結束后再玩。每當玩家消滅一群外星人后,我們都將加快游戲的節(jié)奏,并添加一個記分系統(tǒng), 得到一個極具可玩性的游戲!
第14 章
記 分
14.1 添加 Play 按鈕
在本節(jié)中,我們將添加一個Play按鈕,它在游戲開始前出現(xiàn),并在游戲結束后再次出現(xiàn),讓 玩家能夠開始新游戲。 當前,這個游戲在玩家運行alien_invasion.py時就開始了。下面讓游戲一開始處于非活動狀態(tài), 并提示玩家單擊Play按鈕來開始游戲。為此,在game_stats.py中輸入如下代碼:
game_stats.py
def __init__(self, ai_settings):
"""初始化統(tǒng)計信息"""
self.ai_settings = ai_settings
self.reset_stats()
# 讓游戲一開始處于非活動狀態(tài)
self.game_active = False
def reset_stats(self):
--snip--
現(xiàn)在游戲一開始將處于非活動狀態(tài),等我們創(chuàng)建Play按鈕后,玩家才能開始游戲。
關于“Python”的核心知識點整理大全35-CSDN博客
關于“Python”的核心知識點整理大全34-CSDN博客
關于“Python”的核心知識點整理大全33-CSDN博客
關于“Python”的核心知識點整理大全32-CSDN博客
關于“Python”的核心知識點整理大全31-CSDN博客
關于“Python”的核心知識點整理大全30-CSDN博客
關于“Python”的核心知識點整理大全29-CSDN博客
關于“Python”的核心知識點整理大全28-CSDN博客
關于“Python”的核心知識點整理大全27-CSDN博客
關于“Python”的核心知識點整理大全26-CSDN博客
關于“Python”的核心知識點整理大全25-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-764692.html
關于“Python”的核心知識點整理大全12-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-764692.html
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
到了這里,關于關于“Python”的核心知識點整理大全37的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!