升级

在我们目前的游戏中,一旦玩家击落了整个外星舰队,玩家就达到了一个新的级别,但游戏难度并没有改变。让我们来活跃一下气氛,在玩家每次清屏时提高游戏速度,使游戏更具挑战性。

修改速度设置

我们首先要重组设置类,将游戏设置分为静态和动态设置。我们还将确保在游戏过程中更改的设置会在开始新游戏时重置。下面是 settings.py__init__() 方法:

settings.py
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() 方法的代码:

settings.py
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() 的新方法:

settings.py
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(),从而加快游戏节奏:

alien_invasion.py
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()

更改飞船速度、外星人速度和子弹速度的设置值足以加快整个游戏的速度!

重置速度

现在,我们需要在玩家每次开始新游戏时,将任何已更改的设置恢复为初始值;否则,每次新游戏开始时,都会沿用上一次游戏中已提高的速度设置:

alien_invasion.py
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 的值。或者,如果游戏不够有挑战性,就稍微增加数值。在合理的时间内提高难度,找到一个最佳点。最初的几个屏幕应该比较简单,接下来的几个屏幕应该具有挑战性但可以完成,而后面的屏幕则应该几乎难于登天。

亲身体验

14-3. 挑战目标练习:从练习 14-2 开始(第 283 页)。随着游戏的进行,让目标移动得更快,当玩家点击 "播放" 时,以原来的速度重新启动目标。

14-4. 难度级别:为 "外星人入侵" 制作一组按钮,让玩家为游戏选择适当的起始难度级别。每个按钮都应为 "设置" 中的属性分配适当的值,以创建不同的难度级别。