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



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

УПРАЖНЕНИЯ

13-5 . Ловец: создайте игру с персонажем, который может двигаться влево и вправо у ниж-

него  края  экрана .  Мяч  появляется  в  случайной  позиции  у  верхнего  края  и  падает  вниз 

с  постоянной  скоростью .  Если  персонаж  «ловит»  мяч,  сталкиваясь  с  ним,  мяч  исчезает . 

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

у нижнего края экрана .

Завершение игры

Какое удовольствие от игры, в которой невозможно проиграть? Если игрок 

не  успеет сбить флот достаточно быстро, пришельцы уничтожат корабль при 

столкновении. При этом количество кораблей, используемых игроком, ограничено, 

и корабль уничтожается, когда пришелец достигает нижнего края экрана. Игра 

 завершается в тот момент, когда у игрока кончатся все корабли.




Завершение игры    275

Обнаружение коллизий с кораблем

Начнем с проверки коллизий между пришельцами и кораблем, чтобы мы 

могли правильно обработать столкновения с пришельцами. Коллизии «при-

шелец-корабль» проверяются немедленно после обновления позиции каждого 

пришельца:



game_functions.py

def update_aliens(ai_settings, ship, aliens):

"""

Проверяет, достиг ли флот края экрана,



после чего обновляет позиции всех пришельцев во флоте.

"""


check_fleet_edges(ai_settings, aliens)

aliens.update()

    

    # Проверка коллизий "пришелец-корабль".



    if pygame.sprite.spritecollideany(ship, aliens):

        print("Ship hit!!!")



Метод 

spritecollideany()

 получает два аргумента: спрайт и группу. Метод пыта-

ется найти любой элемент группы, вступивший в коллизию со спрайтом, и оста-

навливает цикл по группе сразу же после обнаружения столкнувшегося элемента. 

В данном случае он перебирает группу 

aliens

 и возвращает первого пришельца, 



столкнувшегося с кораблем.

Если ни одна коллизия не обнаружена, 

spritecollideany()

 возвращает 

None

, и блок 



if

 в точке  не выполняется. Если же будет обнаружен пришелец, столкнувшийся 

с кораблем, метод возвращает этого пришельца, и выполняется блок 

if

: выводится 



сообщение 

Ship


 

hit!!!


 . (При столкновении пришельца с кораблем необходимо 

выполнить ряд операций: удалить всех оставшихся пришельцев и пули, вернуть 

корабль в центр и создать новый флот. Прежде чем писать код всех этих операций, 

необходимо убедиться в том, что решение с обнаружением коллизий с кораблем 

работает правильно. Команда 

print


 всего лишь позволяет легко проверить правиль-

ность обнаружения коллизий.)

Далее необходимо передать 

ship


 функции 

update_aliens()

:

alien_invasion.py

# Запуск основного цикла игры.

while True:

gf.check_events(ai_settings, screen, ship, bullets)

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)

Если вы запустите Alien Invasion, при столкновении пришельца с кораблем в тер-

минальном окне появляется сообщение 

Ship

 

hit!!!



. В ходе тестирования этого 

аспекта присвойте 

alien_drop_speed

 более высокое значение (например, 50 или 

100), чтобы пришельцы быстрее добирались до вашего корабля.



276    Глава 13  •  Осторожно, пришельцы!

Обработка столкновений с кораблем

Теперь нужно разобраться, что же происходит при столкновении пришельца 

с кораблем. Вместо того чтобы уничтожать экземпляр 

ship

 и создавать новый, 



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

организовать сбор статистики по игре. (Статистика также пригодится для под-

счета очков.)

Напишем новый класс 

GameStats

 для ведения статистики и сохраним его в файле 

game_stats .py

:



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




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

    Басты бет