上传文件至 ''

This commit is contained in:
206530235 2021-06-24 11:37:34 +08:00
parent 81c60ea4dc
commit 4cc3a48c9c
5 changed files with 167 additions and 153 deletions

View File

@ -5,29 +5,32 @@ class Button():
def __init__(self, ai_settings, screen, msg):
"""初始化按钮属性"""
self.screen = screen
self.screen_rect = screen.get_rect()
# 设置按钮的尺寸和其他属性
self.width, self.height = 200, 50
self.button_color = (0, 255, 0)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont(None, 48)
self.screen = screen
self.screen_rect = screen.get_rect()
# 创建按钮的rect对象并使其居中
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.center = self.screen_rect.center
# 设置按钮的尺寸和其他属性
self.width, self.height = 200, 50
self.button_color = (0, 255, 0)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont(None, 48)
# 按钮的标签只需创建一次
self.prep_msg(msg)
# 创建按钮的rect对象并使其居中
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.center = self.screen_rect.center
# 按钮的标签只需创建一次
self.prep_msg(msg)
def prep_msg(self, msg):
"""将msg渲染为图像并使其在按钮上居中"""
self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
def draw_button(self):
# 绘制一个用颜色填充的按钮,再绘制文本
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)
# 绘制一个用颜色填充的按钮,再绘制文本
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)

View File

@ -9,43 +9,43 @@ def check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bull
# 监视键盘和鼠标事件
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)
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y)
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)
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y)
def check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y):
"""在玩家单击Play按钮时开始游戏"""
button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
if button_clicked and not stats.game_active:
# 重置游戏设置
ai_settings.initialize_dynamic_settings()
# 重置游戏设置
ai_settings.initialize_dynamic_settings()
# 隐藏光标
pygame.mouse.set_visible(False)
# 重置游戏统计信息
stats.reset_stats()
stats.game_active = True
# 隐藏光标
pygame.mouse.set_visible(False)
# 重置游戏统计信息
stats.reset_stats()
stats.game_active = True
# 重置计分牌图像
sb.prep_score()
sb.prep_high_score()
sb.prep_level()
sb.prep_ships()
# 重置计分牌图像
sb.prep_score()
sb.prep_high_score()
sb.prep_level()
sb.prep_ships()
# 清空外星人列表和子弹列表
aliens.empty()
bullets.empty()
# 清空外星人列表和子弹列表
aliens.empty()
bullets.empty()
# 创建一群新的外星人,并让飞船居中
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
# 创建一群新的外星人,并让飞船居中
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button):
@ -72,9 +72,9 @@ def check_keydown_events(event, ai_settings, screen, ship, bullets):
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
fire_bullet(ai_settings, screen, ship, bullets)
fire_bullet(ai_settings, screen, ship, bullets)
elif event.key == pygame.K_q:
sys.exit()
sys.exit()
def check_keyup_events(event, ship):
@ -102,18 +102,18 @@ def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens,
for aliens in collisions.values():
stats.score += ai_settings.alien_points * len(aliens)
sb.prep_score()
check_high_score(stats, sb)
check_high_score(stats, sb)
if len(aliens) == 0:
# 删除现有的子弹并新建一群外星人,加快游戏进度节奏
bullets.empty()
ai_settings.increase_speed()
# 删除现有的子弹并新建一群外星人,加快游戏进度节奏
bullets.empty()
ai_settings.increase_speed()
# 提高等级
stats.level += 1
sb.prep_level()
# 提高等级
stats.level += 1
sb.prep_level()
create_fleet(ai_settings, screen, ship, aliens)
create_fleet(ai_settings, screen, ship, aliens)
def update_ship(ship):
@ -124,7 +124,7 @@ 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)
bullets.add(new_bullet)
def get_number_aliens_x(ai_settings, alien_width):
@ -184,23 +184,23 @@ def change_fleet_direction(ai_settings, aliens):
def ship_hit(ai_settings, stats, screen, sb, ship, aliens, bullets):
"""响应被外星人撞到的飞船"""
if stats.ships_left > 0:
# 将ship_left减1
stats.ships_left -= 1
# 将ship_left减1
stats.ships_left -= 1
# 更新记分牌
sb.prep_ships()
# 更新记分牌
sb.prep_ships()
# 清空外星人列表和子弹列表
aliens.empty()
bullets.empty()
# 创建一群新的外星人,并将飞船放到屏幕低端中央
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
# 暂停
sleep(0.5)
# 清空外星人列表和子弹列表
aliens.empty()
bullets.empty()
# 创建一群新的外星人,并将飞船放到屏幕低端中央
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
# 暂停
sleep(0.5)
else:
stats.game_active = False
pygame.mouse.set_visible(True)
stats.game_active = False
pygame.mouse.set_visible(True)
def check_aliens_bottom(ai_settings, stats, screen, sb, ship, aliens, bullets):
@ -228,4 +228,4 @@ def check_high_score(stats, sb):
"""检查是否诞生了新的最高纪录"""
if stats.score > stats.high_score:
stats.high_score = stats.score
sb.prep_high_score()
sb.prep_high_score()

View File

@ -3,15 +3,17 @@ class GameStats():
def __init__(self, ai_settings):
"""初始化统计信息"""
self.ai_settings = ai_settings
self.reset_stats()
# 游戏刚启动时处于非活动状态
self.game_active = False
# 在任何情况下不应该重置最高分
self.high_score = 0
self.level = 1
self.ai_settings = ai_settings
self.reset_stats()
# 游戏刚启动时处于非活动状态
self.game_active = False
# 在任何情况下不应该重置最高分
self.high_score = 0
self.level = 1
def reset_stats(self):
"""初始化在游戏运行期间可能变化的统计信息"""
self.ships_left = self.ai_settings.ship_limit
self.score = 0
self.ships_left = self.ai_settings.ship_limit
self.score = 0

View File

@ -9,65 +9,71 @@ class Scoreboard():
def __init__(self, ai_settings, screen, stats):
"""初始化显示得分涉及的属性"""
self.screen = screen
self.screen_rect = screen.get_rect()
self.ai_settings = ai_settings
self.stats = stats
# 显示得分信息时使用的字体设置
self.text_color = (30, 30, 30)
self.font = pygame.font.SysFont(None, 48)
self.screen = screen
self.screen_rect = screen.get_rect()
self.ai_settings = ai_settings
self.stats = stats
# 准备初始化得分图像和当前最高分数
self.prep_score()
self.prep_high_score()
self.prep_level()
self.prep_ships()
# 显示得分信息时使用的字体设置
self.text_color = (30, 30, 30)
self.font = pygame.font.SysFont(None, 48)
# 准备初始化得分图像和当前最高分数
self.prep_score()
self.prep_high_score()
self.prep_level()
self.prep_ships()
def prep_score(self):
"""将得分转换为一幅渲染的图像"""
rounded_score = int(round(self.stats.score, -1))
score_str = "{:,}".format(rounded_score)
self.score_image = self.font.render(score_str, True, self.text_color, self.ai_settings.bg_color)
# 将得分放在右上角
self.score_rect = self.score_image.get_rect()
self.score_rect.right = self.screen_rect.right - 20
self.score_rect.top = 5
rounded_score = int(round(self.stats.score, -1))
score_str = "{:,}".format(rounded_score)
self.score_image = self.font.render(score_str, True, self.text_color, self.ai_settings.bg_color)
# 将得分放在右上角
self.score_rect = self.score_image.get_rect()
self.score_rect.right = self.screen_rect.right - 20
self.score_rect.top = 5
def prep_high_score(self):
"""将最高得分转换为渲染图像"""
high_score = int(round(self.stats.high_score, -1))
high_score_str = "{:,}".format(high_score)
self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color)
# 将最高分放在屏幕最中央
self.high_score_rect = self.high_score_image.get_rect()
self.high_score_rect.centerx = self.screen_rect.centerx
self.high_score_rect.top = 5
high_score = int(round(self.stats.high_score, -1))
high_score_str = "{:,}".format(high_score)
self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color)
# 将最高分放在屏幕最中央
self.high_score_rect = self.high_score_image.get_rect()
self.high_score_rect.centerx = self.screen_rect.centerx
self.high_score_rect.top = 5
def prep_level(self):
"""将等级转换为渲染图像"""
self.level_image = self.font.render(str(self.stats.level), True, self.text_color, self.ai_settings.bg_color)
# 将得分放在右上角
self.level_rect = self.score_image.get_rect()
self.level_rect.right = self.screen_rect.right
self.level_rect.top = self.score_rect.bottom
self.level_image = self.font.render(str(self.stats.level), True, self.text_color, self.ai_settings.bg_color)
# 将得分放在右上角
self.level_rect = self.score_image.get_rect()
self.level_rect.right = self.screen_rect.right
self.level_rect.top = self.score_rect.bottom
def prep_ships(self):
"""显示还剩下多少艘飞船"""
self.ships = Group()
for ship_number in range(self.stats.ships_left):
ship = Ship(self.ai_settings, self.screen)
ship.rect.x = 10 + ship_number * ship.rect.width
ship.rect.y = 10
self.ships.add(ship)
self.ships = Group()
for ship_number in range(self.stats.ships_left):
ship = Ship(self.ai_settings, self.screen)
ship.rect.x = 10 + ship_number * ship.rect.width
ship.rect.y = 10
self.ships.add(ship)
def show_score(self):
"""在屏幕上显示得分和等级"""
self.screen.blit(self.score_image, self.score_rect)
self.screen.blit(self.high_score_image, self.high_score_rect)
self.screen.blit(self.level_image, self.level_rect)
# 绘制飞船
self.ships.draw(self.screen)
self.screen.blit(self.score_image, self.score_rect)
self.screen.blit(self.high_score_image, self.high_score_rect)
self.screen.blit(self.level_image, self.level_rect)
# 绘制飞船
self.ships.draw(self.screen)

View File

@ -3,48 +3,51 @@ class Settings():
def __init__(self):
'''初始化设置'''
# 屏幕设置
self.screen_width = 1200
self.screen_height = 600
self.bg_color = (230, 230, 230) # 设置背景色 灰色
# 飞船设置
self.ship_limit = 3
self.ship_image_path = 'images/ship.bmp' # 飞船图片路径
# 屏幕设置
self.screen_width = 1200
self.screen_height = 600
self.bg_color = (230, 230, 230) # 设置背景色 灰色
# 子弹设置
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60, 60, 60
self.bullets_allowed = 3 # 允许屏幕中出现子弹的数量
# 飞船设置
self.ship_limit = 3
self.ship_image_path = 'images/ship.bmp' # 飞船图片路径
# 外星人设置
self.fleet_drop_speed = 10
# 子弹设置
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60, 60, 60
self.bullets_allowed = 3 # 允许屏幕中出现子弹的数量
# 以什么样的速度加快游戏节奏
self.speedup_scale = 1.1
# 外星人点数提高速度
self.score_scale = 1.5
# 外星人设置
self.fleet_drop_speed = 10
self.initialize_dynamic_settings()
# 以什么样的速度加快游戏节奏
self.speedup_scale = 1.1
# 外星人点数提高速度
self.score_scale = 1.5
self.initialize_dynamic_settings()
def initialize_dynamic_settings(self):
"""初始化随游戏进行而变化的设置"""
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 3
self.alien_speed_factor = 1
# fleet_direction为1表示向右移为-1表示向左移
self.fleet_direction = 1
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 3
self.alien_speed_factor = 1
# 计分
self.alien_points = 50
# fleet_direction为1表示向右移为-1表示向左移
self.fleet_direction = 1
# 计分
self.alien_points = 50
def increase_speed(self):
"""提高速度设置,外星人点数"""
self.ship_speed_factor *= self.speedup_scale
self.bullet_speed_factor *= self.speedup_scale
self.alien_speed_factor *= self.speedup_scale
self.alien_points = int(self.alien_points * self.score_scale)
print(self.alien_points)
self.ship_speed_factor *= self.speedup_scale
self.bullet_speed_factor *= self.speedup_scale
self.alien_speed_factor *= self.speedup_scale
self.alien_points = int(self.alien_points * self.score_scale)
print(self.alien_points)