Книга «Изучаем Python»



Pdf көрінісі
бет169/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   165   166   167   168   169   170   171   172   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 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

Достарыңызбен бөлісу:
1   ...   165   166   167   168   169   170   171   172   ...   266




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет