Завершение игры
279
# Проверка пришельцев, добравшихся до нижнего края экрана.
check_aliens_bottom(ai_settings, stats, screen, ship, aliens,
bullets)
Функция
check_aliens_bottom()
проверяет, есть ли хотя бы один пришелец, до-
бравшийся до нижнего края экрана. Условие выполняется, когда атрибут
rect.
bottom
пришельца больше или равен атрибуту
rect.bottom
экрана
. Если при-
шелец добрался до низа, вызывается функция
ship_hit()
. Если хотя бы один
пришелец добрался до нижнего края, проверять остальных уже не нужно, поэтому
после
вызова
ship_hit()
цикл прерывается.
Функция
check_aliens_bottom()
вызывается после обновления позиций всех
пришельцев и после проверки столкновений «пришелец-корабль»
. Теперь
новый флот будет появляться как при столкновении корабля с пришельцем,
так и в том случае, если кто-то из пришельцев смог добраться до нижнего края
экрана.
Конец игры
Программа Alien Invasion уже на что-то похожа, но игра длится бесконечно. Зна-
чение
ships_left
просто продолжает уходить в отрицательную бесконечность.
Добавим в
GameStats
новый атрибут — флаг
game_active
, который завершает игру
после потери последнего корабля:
game_stats.py
def __init__(self, settings):
....
# Игра Alien Invasion запускается в активном состоянии.
self.game_active = True
Добавим в
ship_hit()
код, который сбрасывает флаг
game_active
в состояние
False
при потере игроком последнего корабля:
game_functions.py
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):
"""Обрабатывает столкновение корабля с пришельцем."""
if stats.ships_left > 0:
# Уменьшение ships_left.
stats.ships_left -= 1
...
# Пауза.
sleep(0.5)
else:
stats.game_active = False
Б
у
льшая часть кода
ship_hit()
осталась неизменной. Весь существующий код
был перемещен в блок
if
, который проверяет, что у игрока остался хотя бы один
корабль. Если корабли не кончились, программа создает новый флот, делает паузу
и продолжает игру. Если же игрок потерял последний корабль, флаг
game_active
переводится в состояние
False
.