import sys from time import sleep import pygame from bullet import Bullet from alien import Alien from game_stats import GameStats as GS def check_keydown_events(event,ai_settings,screen,ship,bullets): """响应按键""" if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = True elif event.key == pygame.K_SPACE: # 创建一颗子弹,并将其加入到编组bullets 中 fire_bullet(ai_settings,screen,ship,bullets) def check_keyup_events(event,ship): """响应松开""" if event.key == pygame.K_RIGHT: ship.moving_right = False elif event.key == pygame.K_LEFT: ship.moving_left = False def check_events(ai_settings,screen,ship,bullets): """响应按键和鼠标事件""" for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: check_keydown_events(event,ai_settings,screen,ship,bullets) elif event.type == pygame.KEYUP: check_keyup_events(event, ship) def update_screen(ai_settings, screen, ship,aliens,bullets): """更新屏幕上的图像,并切换到新屏幕""" screen.fill(ai_settings.bg_color) # 在飞船和外星人后面重绘所有子弹 for bullet in bullets.sprites(): bullet.draw_bullet() ship.blitme() aliens.draw(screen) # 让最近绘制的屏幕可见 pygame.display.flip() def update_bullets(ai_settings,screen,ship,aliens,bullets): # 更新子弹的位置,删除已消失的子弹 check_bullet_alien_collisions(ai_settings, screen, ship, aliens,bullets) for bullet in bullets.copy(): if bullet.rect.bottom <= 0: bullets.remove(bullet) # print(len(bullets)) def check_bullet_alien_collisions(ai_settings, screen, ship, aliens,bullets): #检查是否有子弹击中了外星人,如果是这样,就删除对应的子弹和外星人 collisions = pygame.sprite.groupcollide(bullets, aliens, True, True) if len(aliens) == 0: # 删除现有的子弹并新建一群外星人 bullets.empty() creet_fleet(ai_settings, screen, ship, aliens) def fire_bullet(ai_settings,screen,ship,bullets): if len(bullets) < ai_settings.bullet_allowed: new_bullet = Bullet(ai_settings, screen, ship) bullets.add(new_bullet) def get_number_aliens_x(ai_settings,alien_width): # 计算一行可容纳多少个外星人 avaliable_space_x = ai_settings.screen_width - (2 * alien_width) number_aliens_x = int(avaliable_space_x /(2 * alien_width)) return number_aliens_x def get_number_rows(ai_settings,ship_height,alien_height): """计算屏幕可容纳多少行外星人""" avaliable_space_y = ai_settings.screen_height - 3 * alien_height - ship_height number_rows = int(avaliable_space_y / (2 * alien_height)) return number_rows def create_alien(ai_settings,screen,aliens,alien_number,row_number): """创建一个外星人并将其放在当前行""" alien = Alien(ai_settings, screen) alien_width = alien.rect.width alien.x = alien_width + 2 * alien_width * alien_number alien.rect.x = alien.x alien.y = alien.rect.height + 2 * alien.rect.height * row_number alien.rect.y = alien.y aliens.add(alien) def creet_fleet(ai_settings,screen,ship,aliens): """创建外星人群""" # 创建一个外星人 alien = Alien(ai_settings, screen) alien_width = alien.rect.width number_aliens_x = get_number_aliens_x(ai_settings,alien_width) number_rows = get_number_rows(ai_settings,ship.rect.height,alien.rect.height) # 创建外星人群 for row_number in range(number_rows): for alien_number in range(number_aliens_x): create_alien(ai_settings, screen, aliens, alien_number,row_number) def check_fleet_edges(ai_settings,aliens): for alien in aliens.sprites(): if alien.check_edges(): change_fleet_direction(ai_settings,aliens) break def change_fleet_direction(ai_settings,aliens): """将整群外星人下移,并改变它们的方向""" for alien in aliens.sprites(): alien.rect.y += ai_settings.fleet_drop_speed ai_settings.fleet_direction *= -1 def update_aliens(ai_settings,stats,screen,ship,aliens,bullets): """检查是否有外星人位于屏幕边缘,并更新整群外星人的位置""" check_fleet_edges(ai_settings, aliens) aliens.update() # 检测外星人和飞船之间的碰撞 if pygame.sprite.spritecollideany(ship,aliens): #print("Ship hit!!!") ship_hit(ai_settings, stats, screen, ship, aliens, bullets) def ship_hit(ai_settings,stats,screen,ship,aliens,bullets): """响应被外星人撞到的飞船""" # 创建一个用于存储游戏统计信息的实例 stats = GS(ai_settings) # 将 ships_left 减1 stats.ships_left -= 1 # 清空外星人列表和子弹列表 aliens.empty() bullets.empty() # 创建一群新的外星人,并将飞船放到屏幕底端中央 creet_fleet(ai_settings, screen, ship, aliens) ship.center_ship() #暂停 sleep(1)