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



Pdf көрінісі
бет146/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   142   143   144   145   146   147   148   149   ...   238
Байланысты:
2 5343781172763690906

ПРИМЕЧАНИЕ

Обратите внимание: программа никогда не создает более одного корабля . Один экземпляр 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 для завершения игры или 

щелкнул на кнопке закрытия окна. Также экран должен обновляться в то время, 

пока игрок решает, хочет ли он начать новую игру. Остальные вызовы функций 

должны происходить только при активной игре, потому что в то время, когда игра 

не  активна, обновлять позиции игровых элементов не нужно.

В обновленной версии игра должна останавливаться после потери игроком по-

следнего корабля.





Достарыңызбен бөлісу:
1   ...   142   143   144   145   146   147   148   149   ...   238




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

    Басты бет