From 4cc3a48c9c6323162be3b7d2ced15650f347a648 Mon Sep 17 00:00:00 2001 From: 206530235 <1828358204@qq.com> Date: Thu, 24 Jun 2021 11:37:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20''?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- button.py | 39 +++++++++-------- game_functions.py | 106 +++++++++++++++++++++++----------------------- game_stats.py | 20 +++++---- scoreboard.py | 90 +++++++++++++++++++++------------------ settings.py | 65 ++++++++++++++-------------- 5 files changed, 167 insertions(+), 153 deletions(-) diff --git a/button.py b/button.py index 9a35e72..8937070 100644 --- a/button.py +++ b/button.py @@ -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) \ No newline at end of file + + # 绘制一个用颜色填充的按钮,再绘制文本 + self.screen.fill(self.button_color, self.rect) + self.screen.blit(self.msg_image, self.msg_image_rect) diff --git a/game_functions.py b/game_functions.py index f33626c..23c6c5a 100644 --- a/game_functions.py +++ b/game_functions.py @@ -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() \ No newline at end of file + sb.prep_high_score() \ No newline at end of file diff --git a/game_stats.py b/game_stats.py index cf599d8..091dfd3 100644 --- a/game_stats.py +++ b/game_stats.py @@ -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 \ No newline at end of file + + self.ships_left = self.ai_settings.ship_limit + self.score = 0 \ No newline at end of file diff --git a/scoreboard.py b/scoreboard.py index 66c5b6a..9beb627 100644 --- a/scoreboard.py +++ b/scoreboard.py @@ -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) \ No newline at end of file + + 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) \ No newline at end of file diff --git a/settings.py b/settings.py index 0ba35ee..77683d1 100644 --- a/settings.py +++ b/settings.py @@ -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) \ No newline at end of file + 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)