ПРИМЕЧАНИЕ
Обратите внимание: программа никогда не создает более одного корабля . Один экземпляр ship ис-
пользуется на протяжении всей игры, а при столкновении с пришельцем он просто возвращается
к центру экрана . О том, что у игрока не осталось ни одного корабля, программа узнаёт из атрибута
ships_left .
Запустите игру, подстрелите нескольких пришельцев, а затем позвольте пришельцу
столкнуться с кораблем. Происходит небольшая пауза, на экране появляется новый
флот вторжения, а корабль возвращается в центр нижней части экрана.
Достижение нижнего края экрана
Если пришелец добирается до нижнего края экрана, программа будет реагировать
так же, как при столкновении с кораблем. Добавьте для проверки этого условия
новую функцию, которая будет называться
update_aliens()
:
game_functions.py
def check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets):
"""Проверяет, добрались ли пришельцы до нижнего края экрана."""
screen_rect = screen.get_rect()
for alien in aliens.sprites():
if alien.rect.bottom >= screen_rect.bottom:
# Происходит то же, что при столкновении с кораблем.
ship_hit(ai_settings, stats, screen, ship, aliens, bullets)
break
def update_aliens(ai_settings, stats, screen, ship, aliens, bullets):
...
Завершение игры 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
.
280 Глава 13 • Осторожно, пришельцы!
Определение исполняемых частей игры
В файле
alien_invasion .py
необходимо определить части игры, которые должны вы-
полняться всегда, и те части, которые должны выполняться только при активной
игре:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, ship, bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
gf.update_aliens(ai_settings, ship, aliens)
gf.update_screen(ai_settings, screen, ship, aliens, bullets)
В основном цикле всегда должна вызываться функция
check_events()
, даже если
игра находится в неактивном состоянии. Например, программа все равно долж-
на узнать о том, что пользователь нажал клавишу Q для завершения игры или
щелкнул на кнопке закрытия окна. Также экран должен обновляться в то время,
пока игрок решает, хочет ли он начать новую игру. Остальные вызовы функций
должны происходить только при активной игре, потому что в то время, когда игра
не активна, обновлять позиции игровых элементов не нужно.
В обновленной версии игра должна останавливаться после потери игроком по-
следнего корабля.
Достарыңызбен бөлісу: |