Подсчет очков
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 пикселов и убе-
дитесь в том, что игра начисляет очки за каждого пришельца, в которого попала эта
большая пуля; затем верните ширину пули к нормальному состоянию.