Для увеличения скорости корабля, пуль и пришельцев каждый раз, когда игрок достигает нового уровня, в программе используется функция increase_speed():
settings.py
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
Чтобы увеличить скорость этих игровых элементов, мы умножаем каждую настройку скорости на значение speedup_scale.
Темп игры повышается вызовом increase_speed() в check_bullet_alien_collisions() при уничтожении последнего пришельца во флоте, но перед созданием нового флота:
game_functions.py
def check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets):
...
if len(aliens) == 0:
. . . .# Уничтожение пуль, повышение скорости и создание нового флота.
bullets.empty()
. . . .ai_settings.increase_speed()
create_fleet(ai_settings, screen, ship, aliens)
Изменения значений настроек скорости ship_speed_factor, alien_speed_factor и bullet_speed_factor достаточно для того, чтобы ускорить всю игру!
Сброс скорости
Каждый раз, когда игрок начинает новую игру, все измененные настройки должны вернуться к исходным значениям, иначе каждая новая игра будет начинаться с повышенными настройками скорости предыдущей игры:
game_functions.py
def check_play_button(ai_settings, screen, stats, 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()
# Указатель мыши скрывается.
pygame.mouse.set_visible(False)
...
Игра Alien Invasion стала достаточно сложной и интересной. Каждый раз, когда игрок очищает экран, игра должна слегка ускориться, а ее сложность должна слегка возрасти. Если сложность игры возрастает слишком быстро, уменьшите значение settings.speedup_scale, а если наоборот, сложность недостаточна, — слегка увеличьте это значение. Найдите оптимальное значение, оценивая сложность игры за разумный промежуток времени. Первая пара флотов должна быть простой, несколько следующих — сложными, но возможными, а при последующих попытках сложность должна становиться практически безнадежной.
Упражнения
14-3. Учебная стрельба с нарастающей сложностью: начните с кода упражнения 14-2 (с. 288). Скорость мишени должна увеличиваться по ходу игры, а при нажатии игроком кнопки Play мишень должна возвращаться к исходной скорости.
Подсчет очков
Система подсчета очков позволит отслеживать счет игры в реальном времени; также на экране будет выводиться текущий рекорд, уровень и количество оставшихся кораблей. Счет игры также относится к игровой статистике, поэтому мы добавим атрибут score в класс GameStats:
game_stats.py
class GameStats():
...
def reset_stats(self):
"""Инициализирует статистику, изменяющуюся в ходе игры."""
self.ships_left = self.ai_settings.ship_limit
. . . .self.score = 0
Чтобы счет сбрасывался при запуске новой игры, мы инициализируем score в reset_stats() вместо __init__().
Вывод счета
Чтобы вывести счет на экран, мы сначала создаем новый класс Scoreboard. Пока этот класс ограничивается выводом текущего счета, но мы используем его для вывода рекордного счета, уровня и количества оставшихся кораблей. Ниже приведена первая часть класса; сохраните ее под именем scoreboard.py:
scoreboard.py
import pygame.font
class Scoreboard():
. ."""Класс для вывода игровой информации."""
(1) . .def __init__(self, ai_settings, screen, stats):
. . . ."""Инициализирует атрибуты подсчета очков."""
. . . .self.screen = screen
. . . .self.screen_rect = screen.get_rect()
. . . .self.ai_settings = ai_settings
. . . .self.stats = stats
. . . .
. . . .# Настройки шрифта для вывода счета.
(2) . . . .self.text_color = (30, 30, 30)
(3) . . . .self.font = pygame.font.SysFont(None, 48)
. . . .# Подготовка исходного изображения.
(4) . . . .self.prep_score()
Так как Scoreboard выводит текст на экран, код начинается с импортирования модуля pygame.font. Затем __init__() передаются параметры ai_settings, screen и stats, чтобы класс мог выводить информацию об отслеживаемых показателях (1) . Далее назначается цвет текста (2) и создается экземпляр объекта шрифта (3).
Чтобы преобразовать выводимый текст в изображение, мы вызываем метод prep_score() (4), который определяется следующим образом:
scoreboard.py
. .def prep_score(self):
. . . ."""Преобразует текущий счет в графическое изображение."""
(1) . . . .score_str = str(self.stats.score)
(2) . . . .self.score_image = self.font.render(score_str, True, self. text_color,
. . . . . .self.ai_settings.bg_color)
. . . .
. . . .# Вывод счета в правой верхней части экрана.
(3) . . . .self.score_rect = self.score_image.get_rect()
(4) . . . .self.score_rect.right = self.screen_rect.right - 20
(5) . . . .self.score_rect.top = 20