模块一:外星人管理与碰撞系统
目标:生成动态外星人群,处理移动、触边检测与子弹碰撞。
# alien.py(基础外星人类)
class Alien(Sprite):def __init__(self, game):super().__init__()self.screen = game.screenself.image = pygame.image.load('alien.bmp')self.rect = self.image.get_rect()self.rect.x = self.rect.width # 初始位置self.rect.y = self.rect.heightself.x = float(self.rect.x) # 精确水平位置(浮点数)def update(self):"""水平移动外星人"""self.x += self.settings.alien_speed * self.settings.fleet_directionself.rect.x = self.xdef check_edges(self):"""检测是否触边"""screen_rect = self.screen.get_rect()return self.rect.right >= screen_rect.right or self.rect.left <= 0# alien_invasion.py(外星人群管理)
class AlienInvasion:def _create_fleet(self):"""生成多行多列外星人"""alien = Alien(self)alien_width, alien_height = alien.rect.sizeavailable_space_x = self.settings.screen_width - 2 * alien_widthnumber_aliens_x = available_space_x // (2 * alien_width)available_space_y = self.settings.screen_height - 3 * alien_heightnumber_rows = available_space_y // (2 * alien_height)for row_number in range(number_rows):for alien_number in range(number_aliens_x):self._create_alien(alien_number, row_number)def _check_fleet_edges(self):"""触边后下移并反向"""for alien in self.aliens.sprites():if alien.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):"""下移并反转方向"""for alien in self.aliens.sprites():alien.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1def _check_collisions(self):"""子弹与外星人碰撞检测"""collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)if collisions:self.stats.score += self.settings.alien_points * sum(len(v) for v in collisions.values())self.sb.prep_score()self._check_high_score()
模块二:计分系统与游戏统计
目标:实时跟踪得分、最高分、剩余生命与关卡进度。
# game_stats.py
class GameStats:def __init__(self, game):self.settings = game.settingsself.reset_stats()self.high_score = 0self._load_high_score() # 从文件加载历史最高分def reset_stats(self):self.ships_left = self.settings.ship_limitself.score = 0self.level = 1def _load_high_score(self):try:with open("high_score.txt", "r") as f:self.high_score = int(f.read())except FileNotFoundError:pass # 首次运行无文件则保持0# scoreboard.py(UI渲染)
class Scoreboard:def __init__(self, game):self.screen = game.screenself.stats = game.statsself.text_color = (255, 255, 255)self.font = pygame.font.SysFont("Consolas", 32)self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):"""格式化得分并渲染图像"""rounded_score = round(self.stats.score, -1)score_str = f"Score: {rounded_score:,}"self.score_image = self.font.render(score_str, True, self.text_color)self.score_rect = self.score_image.get_rect(right=self.screen_rect.right - 20, top=20)def prep_high_score(self):"""渲染最高分"""high_score_str = f"High Score: {self.stats.high_score:,}"self.high_score_image = self.font.render(high_score_str, True, self.text_color)self.high_score_rect = self.high_score_image.get_rect(centerx=self.screen_rect.centerx, top=20)def prep_ships(self):"""显示剩余生命图标"""self.ships = pygame.sprite.Group()for ship_number in range(self.stats.ships_left):ship = Ship(self.game)ship.rect.x = 10 + ship_number * (ship.rect.width + 5)ship.rect.y = 10self.ships.add(ship)
模块三:菜单、音效与暂停功能
目标:实现主菜单界面、音效播放和游戏暂停逻辑。
# button.py(菜单按钮)
class Button:def __init__(self, game, msg, y_offset=0):self.screen = game.screenself.rect = pygame.Rect(0, 0, 200, 50)self.rect.center = game.screen_rect.centerself.rect.y += y_offsetself._prep_msg(msg)def _prep_msg(self, msg):"""渲染按钮文字"""self.msg_image = pygame.font.SysFont("Consolas", 36).render(msg, True, (255, 255, 255))self.msg_image_rect = self.msg_image.get_rect(center=self.rect.center)def draw(self):"""绘制按钮"""self.screen.fill((0, 135, 0), self.rect) # 绿色背景self.screen.blit(self.msg_image, self.msg_image_rect)# alien_invasion.py(音效与状态管理)
class AlienInvasion:def _load_sounds(self):"""加载所有音效资源"""self.bg_music = pygame.mixer.Sound('sounds/bg_music.mp3')self.shoot_sound = pygame.mixer.Sound('sounds/shoot.wav')self.explosion_sound = pygame.mixer.Sound('sounds/explosion.wav')self.bg_music.set_volume(0.3)self.bg_music.play(-1) # 循环播放背景音乐def _check_events(self):"""处理菜单事件"""for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_p: # 按P键暂停self.paused = not self.pausedelif event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()self._check_play_button(mouse_pos) # 点击Play按钮def _update_screen(self):"""动态绘制界面"""self.screen.fill(self.settings.bg_color)if self.game_active:self.ship.blitme()self.bullets.draw(self.screen)self.aliens.draw(self.screen)self.sb.show_score()else:self.play_button.draw() # 显示主菜单pygame.display.flip()
模块四:多样化敌人与技能系统
目标:扩展敌人类型,实现护盾、炸弹等特殊技能。
# alien.py(扩展敌人)
class ShieldAlien(Alien):def __init__(self, game):super().__init__(game)self.image = pygame.image.load('images/shield_alien.bmp')self.shield = 2 # 护盾层数def hit(self):"""被击中时减少护盾"""self.shield -= 1if self.shield <= 0:self.kill()class ShootingAlien(Alien):def __init__(self, game):super().__init__(game)self.shoot_cooldown = 2000 # 射击间隔(毫秒)self.last_shot = pygame.time.get_ticks()def try_shoot(self):"""尝试发射子弹"""current_time = pygame.time.get_ticks()if current_time - self.last_shot > self.shoot_cooldown:self.last_shot = current_timereturn AlienBullet(self.rect.center) # 返回子弹对象# ship.py(技能实现)
class Ship:def __init__(self, game):# ...原有代码...self.shield_active = Falseself.shield_start_time = 0self.bomb_count = 3 # 初始炸弹数量def activate_shield(self):"""激活护盾(持续5秒)"""if not self.shield_active:self.shield_active = Trueself.shield_start_time = pygame.time.get_ticks()def use_bomb(self):"""使用炸弹清屏"""if self.bomb_count > 0:self.bomb_count -= 1self.game.aliens.empty()self.game.bullets.empty()
系统整合与交互逻辑
1. 初始化流程:
class AlienInvasion:def __init__(self):pygame.init()self.settings = Settings()self.stats = GameStats(self)self.sb = Scoreboard(self)self.ship = Ship(self)self.aliens = pygame.sprite.Group()self.bullets = pygame.sprite.Group()self._create_fleet() # 生成初始外星人群self._load_sounds()self.play_button = Button(self, "Play", y_offset=-50)self.quit_button = Button(self, "Quit", y_offset=50)
2. 主游戏循环:
def run_game(self):while True:self._check_events()if self.game_active and not self.paused:self.ship.update()self._update_bullets()self._update_aliens()self._check_collisions()self._check_aliens_bottom() # 检测外星人触底self._update_screen()
关键设计总结
1. 模块化架构:各功能(外星人、计分、菜单、技能)独立实现,通过主类协调。
2. 事件驱动:统一事件循环处理输入、状态切换与资源更新。
3. 资源管理:集中加载图像、音效,支持动态替换(如护盾外星人图片)。
4. 可扩展性:通过继承(ShieldAlien)和组合(Scoreboard)灵活扩展功能。
调试与优化策略
1. 性能监控:使用 pygame.time.Clock() 控制帧率,避免CPU过载。
2. 碰撞优化:利用 pygame.sprite.Group 的批量检测代替逐元素遍历。
3. 内存管理:及时销毁越界子弹和死亡外星人,减少资源占用。
4. 平衡性调整:在 Settings 类中集中定义速度、生命值等参数,便于快速迭代。