Рис. 14.2. Счет отображается в правом верхнем углу экрана
А теперь нужно организовать начисление очков за каждого пришельца!
294 Глава 14 • Ведение счета
Обновление счета при уничтожении пришельцев
Чтобы на экране выводился оперативно обновляемый счет, мы будем обновлять
значение
stats.score
при каждом попадании в пришельца, а затем вызывать
prep_score()
для обновления изображения счета. Но сначала нужно определить,
сколько очков игрок будет получать за каждого пришельца:
settings.py
def initialize_dynamic_settings(self):
...
# Подсчет очков
self.alien_points = 50
Стоимость каждого пришельца в очках будет увеличиваться по ходу игры. Что-
бы значение сбрасывалось в начале каждой новой игры, мы задаем значение
в
initialize_dynamic_settings()
.
Счет будет обновляться за каждого сбитого пришельца в
check_bullet_alien_
collisions()
:
game_functions.py
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
aliens, bullets):
"""Обработка коллизий пуль с пришельцами."""
# Удаление пуль и пришельцев, участвующих в коллизиях.
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
if collisions:
stats.score += ai_settings.alien_points
sb.prep_score()
...
Мы обновляем определение
check_bullet_alien_collisions()
и включаем пара-
метры
stats
и
sb
, чтобы функция могла обновлять счет и рекорд. При попадании
пули в пришельца Pygame возвращает словарь
collisions
. Программа проверяет,
существует ли словарь, и если существует — стоимость пришельца добавляется
к счету . Затем вызов
prep_score()
создает новое изображение для обновлен-
ного счета.
Также необходимо обновить определение
update_bullets()
, чтобы соответствую-
щие аргументы передавались между функциями:
game_functions.py
def update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets):
"""Обновляет позиции пуль и удаляет старые пули."""
...
check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
aliens, bullets)
Определению
update_bullets()
необходимы дополнительные параметры
stats
и
sb
. Кроме того, вызов
check_bullet_alien_collisions()
должен включать аргу-
менты
stats
и
sb
.
Подсчет очков 295
Также необходимо изменить вызов
update_bullets()
в основном цикле
while
:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, stats, play_button, ship,
aliens, bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
bullets)
...
При вызове
update_bullets()
должны передаваться аргументы
stats
и
sb
.
Теперь во время игры вы сможете набирать очки!
Начисление очков за все попадания
В том виде, в котором написан код, некоторые пришельцы будут пропускаться при
подсчете. Например, если две пули попадают в пришельцев во время одного про-
хода цикла или если вы создадите широкую «пулю» для поражения нескольких
пришельцев одновременно, игрок получит очки только за одного подстреленного
пришельца. Чтобы устранить этот недостаток, нужно доработать механизм обна-
ружения коллизий между пулями и пришельцами.
В функции
check_bullet_alien_collisions()
любая пуля, столкнувшаяся с при-
шельцем, становится ключом словаря
collisions
. С каждой пулей связывается
значение — список пришельцев, участвующих в коллизии. Переберем словарь
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()
...
Если словарь
collisions
был определен, программа перебирает все значения
в словаре
collisions
. Вспомните, что каждое значение представляет собой спи-
сок пришельцев, в которых попала одна пуля. Стоимость каждого пришельца
умножается на количество пришельцев в списке, а результат прибавляется к те-
кущему счету.
Чтобы протестировать эту систему, увеличьте ширину пули до 300 пикселов и убе-
дитесь в том, что игра начисляет очки за каждого пришельца, в которого попала эта
большая пуля; затем верните ширину пули к нормальному состоянию.
296 Глава 14 • Ведение счета
Увеличение стоимости пришельцев
Так как с каждым достижением нового уровня игра становится более сложной,
за пришельцев на этих уровнях следует давать больше очков. Чтобы реализовать
эту функциональность, мы добавим код, увеличивающий стоимость пришельцев
при возрастании скорости игры:
settings.py
class Settings():
"""Класс для хранения всех настроек игры Alien Invasion."""
def __init__(self):
...
# Темп ускорения игры
self.speedup_scale = 1.1
# Темп роста стоимости пришельцев
self.score_scale = 1.5
self.initialize_dynamic_settings()
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
self.alien_points = int(self.alien_points * self.score_
scale)
В программе определяется коэффициент прироста начисляемых очков; он на-
зывается
score_scale
. С небольшим увеличением скорости (1,1) игра быстро
усложняется, но, чтобы увидеть заметную разницу в очках, необходимо изменять
стоимость пришельцев в большем темпе (1,5). После увеличения скорости игры
стоимость каждого попадания также увеличивается . Чтобы счет возрастал
на целое количество очков, в программе используется функция
int()
.
Чтобы увидеть стоимость каждого пришельца, добавьте в метод
increase_speed()
в классе
Settings
команду
print
:
settings.py
def increase_speed(self):
...
self.alien_points = int(self.alien_points * self.score_scale)
print(self.alien_points)
Новое значение должно выводиться в терминальном окне каждый раз, когда игрок
переходит на новый уровень.
Достарыңызбен бөлісу: |