import sys
from time import sleep
import pygame
from bullet import Bullet
from alien import Alien
total_numbers = 0
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)
ai_settings.bullet_firing = True
# 热键,关闭游戏
elif event.key == pygame.K_q:
sys.exit()
def check_keyup_events(event, ai_setting, ship):
""" 响应松开"""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
elif event.key == pygame.K_SPACE:
ai_setting.bullet_firing = False
def check_events(ai_settings, stats, screen, ship, bullets,
aliens, play_button, sb):
# 响应鼠标和按键事件
for event in pygame.event.get():
# 鼠标关闭
if event.type == pygame.QUIT:
sys.exit()
# 按快捷键Q关闭游戏
elif event.type == pygame.MOUSEBUTTONDOWN:
""" 响应鼠标事件 """
mouse_x, mouse_y = pygame.mouse.get_pos()
check_play_button(ai_settings, stats, screen, ship,
aliens, bullets, play_button, sb, mouse_x, mouse_y)
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ai_settings, ship)
def check_play_button(ai_settings, stats, screen, ship, aliens,
bullets, play_button, sb, mouse_x, mouse_y):
""" 再玩家单击play按钮时开始新游戏 """
if play_button.rect.collidepoint(mouse_x, mouse_y) and not stats.game_active:
# 隐藏光标
pygame.mouse.set_visible(False)
""" 重置游戏统计信息 """
stats.reset_stats()
stats.game_active = True
# 重置记分牌图像、等级、记录、飞船数量
sb.prep_high_score()
sb.prep_level()
sb.prep_score()
sb.prep_ships()
# 重置游戏节奏
ai_settings.initialize_dynamic_settings()
# 清空外星人列表和子弹列表
aliens.empty()
bullets.empty()
# 创建一群新的外星人并让飞船剧中显示
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
def update_screen(ai_settings, stats, screen, ship, aliens, bullets,
play_button, sb):
""" 更新屏幕上的图像,并切换到新的屏幕 """
# 每次循环都要重绘屏幕
screen.fill(ai_settings.bg_color)
# 在飞船和外星人后面重绘制所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
# for alien in aliens.sprites():
# alien.blitme()
aliens.draw(screen)
# 如果游戏处于非活动状态时,绘制按钮
if not stats.game_active:
play_button.draw_button()
# 创建记分牌
sb.show_score()
# 让绘制的屏幕可见
pygame.display.flip()
def update_bullets(ai_settings, stats, screen, ship, aliens, bullets, sb):
""" 更新子弹的位置, 并删除已消失子弹 """
# 更新子弹位置
bullets.update()
# 检查开火标志位,开火
if ai_settings.bullet_firing:
fire_bullet(ai_settings, screen, ship, bullets)
# 删除已经消失的子弹
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
# 检查外星人与子弹碰撞
check_alien_collisions(ai_settings, stats, screen, ship, bullets, aliens,sb)
def check_alien_collisions(ai_settings, stats, screen, ship, bullets, aliens, sb):
""" 检查外星人与子弹碰撞 """
# 删除发生碰撞的子弹和外星人
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
# 计分
if collisions:
for aliens in collisions.values():
stats.score += ai_settings.alien_points * len(aliens)
sb.prep_score()
# 刷新最高分纪录
check_high_score(stats, sb)
# 检查外星人是否被消灭干净
if len(aliens) == 0:
# 加快游戏节奏
ai_settings.increase_speed()
# 删除现有子弹并新建一群外星人
bullets.empty()
sleep(2)
create_fleet(ai_settings, screen, ship, aliens)
# 提高玩家等级
stats.level += 1
sb.prep_level()
def fire_bullet(ai_settings, screen, ship, bullets):
""" 发射子弹 """
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def get_number_aliens(ai_settings, alien_width):
""" 获取每行可容纳的外星人数"""
avaliable_space_x = ai_settings.screen_width - 2 * alien_width
number_aliens_x = int(avaliable_space_x / (1.5 * alien_width))
return number_aliens_x
def get_number_rows(ai_settings, ship_height, alien_height):
""" 计算整个屏幕能够容纳多少行外星人 """
available_space_y = ai_settings.screen_height - 3*alien_height-ship_height
number_rows = int(available_space_y/(1.5 * alien_height))
return number_rows
def creat_alien(ai_settings, screen, aliens, alien_number, row_number):
""" 创建一个外星人放在当前行 """
alien = Alien(ai_settings, screen)
alien_width = alien.rect.width
# 外星人的横坐标位置
alien.x = alien_width + 1.5*alien_width*alien_number
alien.rect.x = alien.x
# 绘制外星人纵坐标位置
alien.rect.y = alien.rect.height + 20 + 1.5*alien.rect.height*row_number
aliens.add(alien)
def create_fleet(ai_settings, screen, ship, aliens):
""" 创建外星人群 """
global total_numbers
alien = Alien(ai_settings, screen)
number_aliens_x = get_number_aliens(ai_settings, alien_width=alien.rect.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):
# 创建一个外星人并加入当前行
creat_alien(ai_settings, screen, aliens, alien_number, row_number)
# 计算屏幕中共有外星人数量
total_numbers = number_rows * number_aliens_x
def check_fleet_edges(ai_settings, aliens):
""" 当有外星人到达边缘时采取相应的措施 """
global total_numbers
for i in range(len(aliens), total_numbers+1):
pass
for alien in aliens.sprites():
if alien.check_edges():
change_fleet_direction(ai_settings, aliens)
break
def change_fleet_direction(ai_settings, aliens):
""" 将外星人整体下移,并改变移动方向 """
global total_numbers
for i in range(len(aliens), total_numbers+1):
pass
for alien in aliens.sprites():
alien.rect.y += ai_settings.fleet_drop_speed
ai_settings.fleet_direction *= -1
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets, sb):
""" 响应被外星人撞到的飞船 """
# 将ships_left 减一
if stats.ships_left > 0:
stats.ships_left -= 1
# 清空外星人列表和子弹列表
aliens.empty()
bullets.empty()
sb.prep_ships()
# 创建一群新的外星人,并将飞船放置到中央屏幕
create_fleet(ai_setting
《外星人入侵》Python
5星 · 超过95%的资源 需积分: 49 26 浏览量
2018-05-24
00:30:07
上传
评论 3
收藏 21KB RAR 举报
Mr.Wang-USTC
- 粉丝: 10
- 资源: 14
最新资源
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)
- 粒子群算法优化BP神经网络PSO-BP的MATLAB代码(数值预测)
- 基于Springboot的一起看书平台.zip
- 无头单向非循环链表的实现(SList.h)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈