Глава 13 • Осторожно, пришельцы!
корабля с пришельцем. Внутри
ship_hit()
число оставшихся кораблей уменьша-
ется на 1
, после чего происходит очистка групп
aliens
и
bullets
.
Затем программа создает новый флот и выравнивает корабль по центру нижнего
края
. (Вскоре мы добавим метод
center_ship()
в класс
Ship
.) Наконец, после
внесения изменений во все игровые элементы, но до перерисовки изменений
на экране делается короткая пауза, чтобы игрок увидел, что его корабль столкнул-
ся с пришельцем
. После завершения паузы
sleep()
код переходит к функции
update_screen()
, которая перерисовывает новый флот на экране.
Также необходимо обновить определение
update_aliens()
и добавить параметры
stats
,
screen
и
bullets
, чтобы эти значения можно было передать при вызове
ship_hit()
.
Ниже приведен новый метод
center_ship()
; добавьте его в конец
ship .py
:
ship.py
def center_ship(self):
"""Размещает корабль в центре нижней стороны."""
self.center = self.screen_rect.centerx
Чтобы выровнять корабль по центру, мы задаем атрибуту
center
корабля значение,
соответствующее центру экрана (полученное при помощи атрибута
screen_rect
).
ПРИМЕЧАНИЕ
Обратите внимание: программа никогда не создает более одного корабля . Один экземпляр 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
Достарыңызбен бөлісу: |