diff --git a/Alien_Invasion.py b/Alien_Invasion.py index 712752f..a92dd84 100644 --- a/Alien_Invasion.py +++ b/Alien_Invasion.py @@ -74,13 +74,68 @@ class AlienInvasion: alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number self.aliens.add(alien) - def run_game(self): # 开始游戏主循环 + def run_game(self): + """开始游戏的主循环""" while True: self._check_events() self.ship.update() + + if self.stats.game_active: + self.ship.update() + self._update_bullets() + self._update_aliens() + self._update_screen() # 监视键盘和鼠标事件 + def _update_aliens(self): + """ + 检查是否有外星人位于屏幕边缘 + 并更新整群外星人的位置 + """ + self._check_fleet_edges() + self.aliens.update() + + # 检测外星人和飞船之间的碰撞 + if pygame.sprite.spritecollideany(self.ship, self.aliens): + self._ship_hit() + + # 检查是否有外星人到达了屏幕底端 + self._check_aliens_bottom() + + def _update_bullets(self): + """更新子弹的位置并删除消失的子弹""" + #更新子弹的位置 + self.bullets.update() + + # 删除消失的子弹 + for bullet in self.bullets.copy(): + if bullet.rect.bottom <= 0: + self.bullets.remove(bullet) + + self._check_bullet_alien_collisions() + + def _check_bullet_alien_collisions(self): + """响应子弹和外星人碰撞""" + # 删除发生碰撞的子弹和外星人 + + collisions = pygame.sprite.groupcollide( + self.bullets, self.aliens, True, True) + if collisions: + for aliens in collisions.values(): + self.stats.score += self.settings.alien_points * len(aliens) + self.sb.prep_score() + + if not self.aliens: + # 删除现有的子弹并新建一群外星人 + self.bullets.empty() + self._create_fleet() + self.settings.increase_speed() + + # 提高等级 + self.stats.level += 1 + self.sb.prep_level() + def _check_events(self): for event in pygame.event.get(): if event.type == pygame.QUIT: