Глава 13 • Осторожно, пришельцы!
Метод
check_aliens_bottom()
проверяет, есть ли хотя бы один пришелец, добрав-
шийся до нижнего края экрана. Условие выполняется, когда атрибут
rect.bottom
пришельца больше или равен атрибуту
rect.bottom
экрана
. Если пришелец
добрался до низа, вызывается функция
_ship_hit()
. Если хотя бы один пришелец
добрался до нижнего края, проверять остальных уже не нужно, поэтому после вы-
зова
_ship_hit()
цикл прерывается.
Этот метод вызывается из
_update_aliens()
:
alien_invasion.py def _update_aliens(self):
...
# Проверка коллизий "пришелец — корабль".
if pygame.sprite.spritecollideany(self.ship, self.aliens):
self._ship_hit()
# Проверить, добрались ли пришельцы до нижнего края экрана.
self._check_aliens_bottom()
Метод
_check_aliens_bottom()
вызывается после обновления позиций всех при-
шельцев и после проверки столкновений «пришелец — корабль»
. Теперь новый
флот будет появляться как при столкновении корабля с пришельцем, так и в том
случае, если кто-то из пришельцев смог добраться до нижнего края экрана.
Конец игры
Программа Alien Invasion уже на что-то похожа, но игра длится бесконечно. Значе-
ние
ships_left
просто продолжает уходить в отрицательную бесконечность. Доба-
вим в
GameStats
новый атрибут — флаг
game_active
, который завершает игру после
потери последнего корабля. Этот флаг устанавливается в конце метода
__init__()
в GameStats:
game_stats.py def __init__(self, ai_game):
...
# Игра Alien Invasion запускается в активном состоянии.
self.game_active = True
Добавим в
ship_hit()
код, который сбрасывает флаг
game_active
в состояние
False
при потере игроком последнего корабля: