升级
在我们目前的游戏中,一旦玩家击落了整个外星舰队,玩家就达到了一个新的级别,但游戏难度并没有改变。让我们来活跃一下气氛,在玩家每次清屏时提高游戏速度,使游戏更具挑战性。
修改速度设置
我们首先要重组设置类,将游戏设置分为静态和动态设置。我们还将确保在游戏过程中更改的设置会在开始新游戏时重置。下面是 settings.py 的 __init__()
方法:
def __init__(self):
"""Initialize the game's static settings."""
# Screen settings
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230, 230, 230)
# Ship settings
self.ship_limit = 3
# Bullet settings
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60, 60, 60
self.bullets_allowed = 3
# Alien settings
self.fleet_drop_speed = 10
# How quickly the game speeds up
self.speedup_scale = 1.1 (1)
self.initialize_dynamic_settings() (2)
我们继续在 __init__()
方法中初始化保持不变的设置。我们添加了一个 speedup_scale
设置❶,用于控制游戏速度的快慢:值为 2 时,玩家每达到一个新关卡,游戏速度就会加倍;值为 1 时,游戏速度就会保持不变。1.1 这样的值可以提高游戏速度,使游戏具有挑战性,但并非不可能。最后,我们调用 initialize_dynamic_settings()
方法来初始化在整个游戏过程中需要改变的属性值❷。
下面是 initialize_dynamic_settings()
方法的代码:
def initialize_dynamic_settings(self):
"""Initialize settings that change throughout the game."""
self.ship_speed = 1.5
self.bullet_speed = 2.5
self.alien_speed = 1.0
# fleet_direction of 1 represents right; -1 represents left.
self.fleet_direction = 1
本方法设置飞船、子弹和外星人速度的初始值。我们会随着玩家在游戏中的进程增加这些速度,并在玩家每次开始新游戏时重置它们。我们在此方法中加入了舰队方向(fleet_direction
),这样在新游戏开始时,外星人总是会向右移动。我们不需要增加舰队下降速度(fleet_drop_speed
)的值,因为当异形在屏幕上移动得更快时,它们下降的速度也会更快。
为了在玩家每次进入新关卡时提高飞船、子弹和外星人的速度,我们将编写一个名为 increase_speed()
的新方法:
def increase_speed(self):
"""Increase speed settings."""
self.ship_speed *= self.speedup_scale
self.bullet_speed *= self.speedup_scale
self.alien_speed *= self.speedup_scale
为了提高这些游戏元素的速度,我们将每个速度设置乘以 speedup_scale
的值。
当舰队中最后一个外星人被击落时,我们会在 _check_bullet_alien_collisions()
中调用 increase_speed()
,从而加快游戏节奏:
def _check_bullet_alien_collisions(self):
--snip--
if not self.aliens:
# Destroy existing bullets and create new fleet.
self.bullets.empty()
self._create_fleet()
self.settings.increase_speed()
更改飞船速度、外星人速度和子弹速度的设置值足以加快整个游戏的速度!
重置速度
现在,我们需要在玩家每次开始新游戏时,将任何已更改的设置恢复为初始值;否则,每次新游戏开始时,都会沿用上一次游戏中已提高的速度设置:
def _check_play_button(self, mouse_pos):
"""Start a new game when the player clicks Play."""
button_clicked = self.play_button.rect.collidepoint(mouse_pos)
if button_clicked and not self.game_active:
# Reset the game settings.
self.settings.initialize_dynamic_settings()
--snip--
现在,玩 "外星人入侵" 应该更有趣、更具挑战性了。每次清屏后,游戏速度都会加快,难度也会略有增加。如果游戏太快变得太难,请降低 settings.speedup_scale
的值。或者,如果游戏不够有挑战性,就稍微增加数值。在合理的时间内提高难度,找到一个最佳点。最初的几个屏幕应该比较简单,接下来的几个屏幕应该具有挑战性但可以完成,而后面的屏幕则应该几乎难于登天。