练习 13-6: 游戏结束 在为完成练习 13-5 而编写的游戏中,记录飞船被撞到了多少次以及有多少外星人被射杀。确定合适的游戏结束条件,并在满足该条件后结束游戏。
解:
示例图如下:
1.创建 game_stats.py
class GameStats:
"""跟踪游戏的统计信息"""
def __init__(self, ai_game):
"""初始化统计信息"""
self.settings = ai_game.settings
self.reset_stats()
# 游戏刚启动时处于活动状态
self.game_active = True
def reset_stats(self):
"""初始化在游戏运行期间可能变化的统计信息"""
self.furongs_left = self.settings.furong_limit
2.在 furong.py 末尾增加 类center_furong()
def center_furong(self):
"""让郭芙蓉在屏幕左端中央"""
self.rect.midleft = self.screen_rect.midleft
self.x = float(self.rect.x)
3.在 settings.py 增加芙蓉设置
self.furong_limit = 2
4.调整 kung_fu.py
(1)添加新代码
def _furong_hit(self):
"""响应郭芙蓉被白展堂撞到"""
if self.stats.furongs_left > 0:
# 将 furong_left 减 1
self.stats.furongs_left -= 1
# 清空余下的白展堂和攻击
self.zhantangs.empty()
self.attack.empty()
# 创建一群新的大侠,并将郭芙蓉放在屏幕左边的中央
self._create_daxia()
self.furong.center_furong()
# 暂停
sleep(0.5)
else:
self.stats.game_active = False
def _check_zhantangs_left(self):
"""检查是否有白展堂到达屏幕左端"""
screen_rect = self.screen.get_rect()
for zhantang in self.zhantangs.sprites():
if zhantang.rect.left <= screen_rect.left:
# 像白展堂和郭芙蓉撞到一样处理
self._furong_hit()
break
(2)调整原来的代码
import sys
from time import sleep
import pygame
from settings import Settings
from game_stats import GameStats
from furong import Furong
from attack import Attack
from zhantang import Zhantang
class Kungfu:
def __init__(self):
pygame.init()
self.settings = Settings()
self.screen = pygame.display.set_mode(
(self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption('排山倒海')
# 创建一个用于存储游戏统计信息的实例
self.stats = GameStats(self)
self.furong = Furong(self)
self.attack = pygame.sprite.Group()
self.zhantangs = pygame.sprite.Group()
self._create_daxia()
def run_game(self):
while True:
self._check_events()
if self.stats.game_active:
self.furong.update()
self._upadte_attack()
self._update_zhantangs()
self._update_screen()
def _update_zhantangs(self):
"""检查是否有白展堂位于屏幕边缘,更新大侠群中所有白展堂的位置"""
self._check_daxia_edges()
self.zhantangs.update()
# 检查白展堂和郭芙蓉的碰撞
if pygame.sprite.spritecollideany(self.furong, self.zhantangs):
self._furong_hit()
# 检查是否有白展堂到达屏幕左端
self._check_zhantangs_left()
--snip--