更新 'alien_invasion.py'

This commit is contained in:
201110132 2021-06-23 21:46:33 +08:00
parent 2d829b7a3d
commit 2a8fb174d6
1 changed files with 110 additions and 5 deletions

View File

@ -1,8 +1,12 @@
import sys import sys
from time import sleep
import pygame import pygame
from settings import Settings from settings import Settings
from game_stats import GameStats
from scoreboard import Scoreboard
from button import Button
from ship import Ship from ship import Ship
from bullet import Bullet from bullet import Bullet
from alien import Alien from alien import Alien
@ -20,16 +24,23 @@ class AlienInvasion:
self.settings.screen_height = self.screen.get_rect().height self.settings.screen_height = self.screen.get_rect().height
pygame.display.set_caption("Alien Invasion") pygame.display.set_caption("Alien Invasion")
# 创建一个用于存储游戏统计信息的实例
# 并创建记分牌
self.stats = GameStats(self)
self.sb = Scoreboard(self)
self.ship = Ship(self) self.ship = Ship(self)
self.bullets = pygame.sprite.Group() self.bullets = pygame.sprite.Group()
self.aliens = pygame.sprite.Group() self.aliens = pygame.sprite.Group()
self._create_fleet() self._create_fleet()
# 创建Play按钮
self.play_button = Button(self,"Play")
# 背景音乐 # 背景音乐
pygame.mixer.music.load('music/flash.mp3') pygame.mixer.music.load('music/flash.mp3')
pygame.mixer.music.play(-1) # 重复循环 pygame.mixer.music.play(-1) # 重复循环
# 设置背景色 # 设置背景色
self.bg_color = (230, 230, 230) self.bg_color = (230, 230, 230)
@ -66,9 +77,12 @@ class AlienInvasion:
"""开始游戏的主循环""" """开始游戏的主循环"""
while True: while True:
self._check_events() self._check_events()
self.ship.update()
self._update_bullets() if self.stats.game_active:
self._update_aliens() self.ship.update()
self._update_bullets()
self._update_aliens()
self._update_screen() self._update_screen()
def _update_aliens(self): def _update_aliens(self):
@ -79,6 +93,13 @@ class AlienInvasion:
self._check_fleet_edges() self._check_fleet_edges()
self.aliens.update() self.aliens.update()
# 检测外星人和飞船之间的碰撞
if pygame.sprite.spritecollideany(self.ship, self.aliens):
self._ship_hit()
# 检查是否有外星人到达了屏幕底端
self._check_aliens_bottom()
def _update_bullets(self): def _update_bullets(self):
"""更新子弹的位置并删除消失的子弹""" """更新子弹的位置并删除消失的子弹"""
#更新子弹的位置 #更新子弹的位置
@ -97,11 +118,20 @@ class AlienInvasion:
collisions = pygame.sprite.groupcollide( collisions = pygame.sprite.groupcollide(
self.bullets, self.aliens, True, True) 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: if not self.aliens:
# 删除现有的子弹并新建一群外星人 # 删除现有的子弹并新建一群外星人
self.bullets.empty() self.bullets.empty()
self._create_fleet() self._create_fleet()
self.settings.increase_speed()
# 提高等级
self.stats.level += 1
self.sb.prep_level()
def _check_events(self): def _check_events(self):
"""响应按键和鼠标事件""" """响应按键和鼠标事件"""
@ -112,6 +142,34 @@ class AlienInvasion:
self._check_keydown_events(event) self._check_keydown_events(event)
elif event.type == pygame.KEYUP: elif event.type == pygame.KEYUP:
self._check_keyup_events(event) 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): def _check_keydown_events(self, event):
"""响应按键""" """响应按键"""
@ -145,6 +203,13 @@ class AlienInvasion:
bullet.draw_bullet() bullet.draw_bullet()
self.aliens.draw(self.screen) self.aliens.draw(self.screen)
# 显示得分
self.sb.show_score()
# 如果游戏处于非活动状态就绘制Play按钮
if not self.stats.game_active:
self.play_button.draw_button()
pygame.display.flip() pygame.display.flip()
def _check_fleet_edges(self): def _check_fleet_edges(self):
@ -160,6 +225,46 @@ class AlienInvasion:
alien.rect.y += self.settings.fleet_drop_speed alien.rect.y += self.settings.fleet_drop_speed
self.settings.fleet_direction *= -1 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__': if __name__ == '__main__':
# 创建游戏实例并运行游戏 # 创建游戏实例并运行游戏
ai = AlienInvasion() ai = AlienInvasion()