diff --git a/alien_invasion.py b/alien_invasion.py index e6e3acb..1bcc4e2 100644 --- a/alien_invasion.py +++ b/alien_invasion.py @@ -1,8 +1,12 @@ import sys +from time import sleep import pygame from settings import Settings +from game_stats import GameStats +from scoreboard import Scoreboard +from button import Button from ship import Ship from bullet import Bullet from alien import Alien @@ -20,16 +24,23 @@ class AlienInvasion: self.settings.screen_height = self.screen.get_rect().height pygame.display.set_caption("Alien Invasion") + # 创建一个用于存储游戏统计信息的实例 + # 并创建记分牌 + self.stats = GameStats(self) + self.sb = Scoreboard(self) + self.ship = Ship(self) self.bullets = pygame.sprite.Group() self.aliens = pygame.sprite.Group() self._create_fleet() - + + # 创建Play按钮 + self.play_button = Button(self,"Play") # 背景音乐 pygame.mixer.music.load('music/flash.mp3') pygame.mixer.music.play(-1) # 重复循环 - + # 设置背景色 self.bg_color = (230, 230, 230) @@ -66,9 +77,12 @@ class AlienInvasion: """开始游戏的主循环""" while True: self._check_events() - self.ship.update() - self._update_bullets() - self._update_aliens() + + if self.stats.game_active: + self.ship.update() + self._update_bullets() + self._update_aliens() + self._update_screen() def _update_aliens(self): @@ -79,6 +93,13 @@ class AlienInvasion: 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): """更新子弹的位置并删除消失的子弹""" #更新子弹的位置 @@ -97,11 +118,20 @@ class AlienInvasion: 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): """响应按键和鼠标事件""" @@ -112,6 +142,34 @@ class AlienInvasion: self._check_keydown_events(event) elif event.type == pygame.KEYUP: self._check_keyup_events(event) + elif event.type == pygame.MOUSEBUTTONDOWN: + mouse_pos = pygame.mouse.get_pos() + self._check_play_button(mouse_pos) + + def _check_play_button(self,mouse_pos): + """在玩家单机Play按钮时开始新游戏""" + button_clicked = self.play_button.rect.collidepoint(mouse_pos) + if button_clicked and not self.stats.game_active: + # 重置游戏设置 + self.settings.initialize_dynamic_settings() + + # 重置游戏统计信息 + self.stats.reset_stats() + self.stats.game_active = True + self.sb.prep_score() + self.sb.prep_level() + self.sb.prep_ships() + + # 清空余下的外星人和子弹 + self.aliens.empty() + self.bullets.empty() + + # 创建一群新的外星人并让飞船居中 + self._create_fleet() + self.ship.center_ship() + + # 隐藏鼠标光标 + pygame.mouse.set_visible(False) def _check_keydown_events(self, event): """响应按键""" @@ -145,6 +203,13 @@ class AlienInvasion: bullet.draw_bullet() self.aliens.draw(self.screen) + # 显示得分 + self.sb.show_score() + + # 如果游戏处于非活动状态,就绘制Play按钮 + if not self.stats.game_active: + self.play_button.draw_button() + pygame.display.flip() def _check_fleet_edges(self): @@ -160,6 +225,46 @@ class AlienInvasion: alien.rect.y += self.settings.fleet_drop_speed self.settings.fleet_direction *= -1 + def _ship_hit(self): + """响应飞船被外星人撞到""" + if self.stats.ships_left > 0: + # 将ships_left减一并更新记分牌 + self.stats.ships_left -= 1 + self.sb.prep_ships() + + # 清空余下的外星人和子弹 + self.aliens.empty() + self.bullets.empty() + + # 创建一群新的外星人,并将飞船放到屏幕底端的中央 + self._create_fleet() + self.ship.center_ship() + + # 暂停 + sleep(0.5) + else: + self.stats.game_active = False + pygame.mouse.set_visible(True) + + def _check_aliens_bottom(self): + """检查是否有外星人到达了屏幕底端""" + screen_rect = self.screen.get_rect() + for alien in self.aliens.sprites(): + if alien.rect.bottom >= screen_rect.bottom: + # 像飞船被撞到一样处理 + self._ship_hit() + break + +if __name__ == '__main__': + # 创建游戏实例并运行游戏 + ai = AlienInvasion() + ai.run_game() + def _change_fleet_direction(self): + """将整个外星人下移,并改变它们的方向""" + for alien in self.aliens.sprites(): + alien.rect.y += self.settings.fleet_drop_speed + self.settings.fleet_direction *= -1 + if __name__ == '__main__': # 创建游戏实例并运行游戏 ai = AlienInvasion()