Рекорды

We use cookies. Read the Privacy and Cookie Policy

Каждый игрок желает превзойти предыдущий рекорд игры, поэтому мы будем отслеживать и выводить рекорды, чтобы у игрока была ясная цель. Рекорды будут храниться в классе GameStats:

game_stats.py

def __init__(self, ai_settings):

...

. .# Рекорд не должен сбрасываться.

. .self.high_score = 0

Так как рекорд не должен сбрасываться при повторном запуске, значение high_score инициализируется в __init__(), а не в reset_stats().

Теперь изменим класс Scoreboard для отображения рекорда. Начнем с метода __init__():

scoreboard.py

def __init__(self, ai_settings, screen, stats):

...

. . . .# Подготовка изображений счетов.

self.prep_score()

(1) . . . .self.prep_high_score()

Рекорд должен отображаться отдельно от текущего счета, поэтому для подготовки его изображения понадобится новый метод prep_high_score():

scoreboard.py

def prep_high_score(self):

. ."""Преобразует рекордный счет в графическое изображение."""

(1) . .high_score = int(round(self.stats.high_score, -1))

(2) . . . .high_score_str = "{:,}".format(high_score)

(3) . . . .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()

(4) . . . .self.high_score_rect.centerx = self.screen_rect.centerx

(5) . . self.high_score_rect.top = self.score_rect.top

Рекорд округляется до десятков (1) и форматируется с запятыми (2). Затем для рекорда строится графическое изображение (3), выполняется горизонтальное выравнивание прямоугольника по центру экрана (4), а атрибут top прямоугольника приводится в соответствие с верхней стороной изображения счета (5).

Теперь метод show_score() выводит текущий счет в правом верхнем углу, а рекорд — в центре верхней стороны:

scoreboard.py

def show_score(self):

"""Выводит счет на экран."""

self.screen.blit(self.score_image, self.score_rect)

. .self.screen.blit(self.high_score_image, self.high_score_rect)

Для обновления рекорда в файл game_functions.py добавляется новая функция check_high_score():

game_functions.py

def check_high_score(stats, sb):

. ."""Проверяет, появился ли новый рекорд."""

(1) . .if stats.score > stats.high_score:

. . . .stats.high_score = stats.score

. . . .sb.prep_high_score()

Рис. 14.4. Рекордный счет выводится в середине экрана

Функция check_high_score() получает два параметра, stats и sb. Параметр stats используется для проверки текущего счета и рекорда, а параметр sb необходим для изменения изображения рекорда при необходимости. В точке (1) программа сравнивает текущий счет с рекордом. Если текущий счет выше, мы обновляем значение high_score и вызываем prep_high_score() для обновления изображения рекорда.

Функция check_high_score() должна вызываться при каждом попадании в пришельца после обновления счета в check_bullet_alien_collisions():

game_functions.py

def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,

aliens, bullets):

...

if collisions:

for aliens in collisions.values():

stats.score += ai_settings.alien_points * len(aliens)

sb.prep_score()

. . . .check_high_score(stats, sb)

...

Когда вы впервые играете в Alien Invasion, текущий счет одновременно будет наивысшим, поэтому он будет отображаться и как текущий счет, и как рекорд. Но в начале второй игры ваш предыдущий рекорд должен отображаться в середине, а текущий счет справа, как показано на рис. 14.4.