Рис. 14.4. Рекордный счет выводится в середине экрана
Функция
check_high_score()
получает два параметра,
stats
и
sb
. Параметр
stats
используется для проверки текущего счета и рекорда, а параметр
sb
необходим
для изменения изображения рекорда при необходимости. В точке программа
сравнивает текущий счет с рекордом. Если текущий счет выше, мы обновляем
значение
high_score
и вызываем
prep_high_score()
для обновления изображения
рекорда.
Функция
check_high_score()
должна вызываться при каждом попадании в при-
шельца после обновления счета в
check_bullet_alien_collisions()
:
300 Глава 14 • Ведение счета
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.
Вывод уровня
Чтобы в игре выводился текущий уровень, сначала в класс
GameStats
следует вклю-
чить атрибут для его представления. Чтобы уровень сбрасывался в начале каждой
игры, инициализируйте его в
reset_stats()
:
game_stats.py
def reset_stats(self):
"""Инициализирует статистику, изменяющуюся в ходе игры."""
self.ships_left = self.ai_settings.ship_limit
self.score = 0
self.level = 1
Чтобы класс
Scoreboard
выводил текущий уровень (сразу же под текущим счетом),
мы вызываем новый метод
prep_level()
из
__init__()
:
scoreboard.py
def __init__(self, ai_settings, screen, stats):
...
# Подготовка изображений счетов.
self.prep_score()
self.prep_high_score()
self.prep_level()
Метод
prep_level()
выглядит так:
scoreboard.py
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.level_image.get_rect()
Подсчет очков 301
self.level_rect.right = self.score_rect.right
self.level_rect.top = self.score_rect.bottom + 10
Метод
prep_level()
создает изображение на базе значения, хранящегося в
stats.
level
, и приводит атрибут
right
изображения в соответствие с атрибутом
right
счета . Затем атрибут
top
сдвигается на 10 пикселов ниже нижнего края
изображения текущего счета, чтобы между счетом и уровнем оставался пустой
интервал .
В метод
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)
self.screen.blit(self.level_image, self.level_rect)
Добавленная строка выводит на экран изображение, представляющее уровень.
Увеличение
stats.level
и обновление изображения уровня выполняются в
check_
bullet_alien_collisions()
:
game_functions.py
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
aliens, bullets):
...
if len(aliens) == 0:
# Если весь флот уничтожен, начинается следующий уровень.
bullets.empty()
ai_settings.increase_speed()
# Увеличение уровня.
stats.level += 1
sb.prep_level()
create_fleet(ai_settings, screen, ship, aliens)
Если все пришельцы уничтожены, программа увеличивает значение
stats.level
и вызывает
prep_level()
для обновления уровня .
Чтобы убедиться в том, что изображения текущего счета и уровня правильно
обновляются в начале новой игры, инициируйте сброс при нажатии кнопки
Play
:
game_functions.py
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:
...
# Сброс игровой статистики.
stats.reset_stats()
stats.game_active = True
# Сброс изображений счетов и уровня.
302 Глава 14 • Ведение счета
sb.prep_score()
sb.prep_high_score()
sb.prep_level()
# Очистка списков пришельцев и пуль.
aliens.empty()
bullets.empty()
...
Определению
check_play_button()
необходим объект
sb
. Чтобы сбросить изобра-
жения на экране, после сброса игровых настроек следуют вызовы
prep_score()
,
prep_high_score()
и
prep_level()
.
Затем объект
sb
передается
check_events()
, чтобы объект
Scoreboard
был доступен
для
check_play_button()
:
game_functions.py
def check_events(ai_settings, screen, stats, sb, play_button, ship, aliens,
bullets):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
...
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)
Определение
check_events()
должно получать
sb
в параметре, чтобы при вызове
check_play_button()
можно было передать
sb
в аргументе .
Остается обновить вызов
check_events()
в
alien_invasion .py
, чтобы в нем также
передавался объект
sb
:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
aliens, bullets)
...
Теперь количество пройденных уровней отображается на экране (рис. 14.5).
Достарыңызбен бөлісу: |