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



Pdf көрінісі
бет178/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   174   175   176   177   178   179   180   181   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 14 • Ведение счета
Обновление счета при уничтожении пришельцев
Чтобы на экране выводился оперативно обновляемый счет, мы будем обновлять 
значение 
stats.score
при каждом попадании в пришельца, а затем вызывать 
prep_score()
для обновления изображения счета. Но сначала нужно определить, 
сколько очков игрок будет получать за каждого пришельца:
settings.py
def initialize_dynamic_settings(self):
...
# Подсчет очков
self.alien_points = 50
Стоимость каждого пришельца в очках будет увеличиваться по ходу игры. Что-
бы значение сбрасывалось в начале каждой новой игры, мы задаем значение 
в 
initialize_dynamic_settings()
.
Счет будет обновляться за каждого сбитого пришельца в 
check_bullet_alien_
collisions()
:
game_functions.py
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
aliens, bullets):
"""Обработка коллизий пуль с пришельцами."""
# Удаление пуль и пришельцев, участвующих в коллизиях.
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
if collisions:
 
stats.score += ai_settings.alien_points
sb.prep_score()
...
Мы обновляем определение 
check_bullet_alien_collisions()
и включаем пара-
метры 
stats
и 
sb
, чтобы функция могла обновлять счет и рекорд. При попадании 
пули в пришельца Pygame возвращает словарь 
collisions
. Программа проверяет, 
существует ли словарь, и если существует — стоимость пришельца добавляется 
к счету 

. Затем вызов 
prep_score()
создает новое изображение для обновлен-
ного счета.
Также необходимо обновить определение 
update_bullets()
, чтобы соответствую-
щие аргументы передавались между функциями:
game_functions.py
def update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets):
"""Обновляет позиции пуль и удаляет старые пули."""
...
check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
aliens, bullets)
Определению 
update_bullets()
необходимы дополнительные параметры 
stats
и 
sb
. Кроме того, вызов 
check_bullet_alien_collisions()
должен включать аргу-
менты 
stats
и 
sb
.


Подсчет очков
295
Также необходимо изменить вызов 
update_bullets()
в основном цикле 
while
:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, stats, play_button, ship,
aliens, bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
bullets)
...
При вызове 
update_bullets()
должны передаваться аргументы 
stats
и 
sb
.
Теперь во время игры вы сможете набирать очки!
Начисление очков за все попадания
В том виде, в котором написан код, некоторые пришельцы будут пропускаться при 
подсчете. Например, если две пули попадают в пришельцев во время одного про-
хода цикла или если вы создадите широкую «пулю» для поражения нескольких 
пришельцев одновременно, игрок получит очки только за одного подстреленного 
пришельца. Чтобы устранить этот недостаток, нужно доработать механизм обна-
ружения коллизий между пулями и пришельцами.
В функции 
check_bullet_alien_collisions()
любая пуля, столкнувшаяся с при-
шельцем, становится ключом словаря 
collisions
. С каждой пулей связывается 
значение — список пришельцев, участвующих в коллизии. Переберем словарь 
collisions
и убедимся в том, что очки начисляются за каждого подбитого при-
шельца:
game_functions.py
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
aliens, bullets):
...
if collisions:
 
for aliens in collisions.values():
stats.score += ai_settings.alien_points * len(aliens)
sb.prep_score()
...
Если словарь 
collisions
был определен, программа перебирает все значения 
в словаре 
collisions
. Вспомните, что каждое значение представляет собой спи-
сок пришельцев, в которых попала одна пуля. Стоимость каждого пришельца 
умножается на количество пришельцев в списке, а результат прибавляется к те-
кущему счету.
Чтобы протестировать эту систему, увеличьте ширину пули до 300 пикселов и убе-
дитесь в том, что игра начисляет очки за каждого пришельца, в которого попала эта 
большая пуля; затем верните ширину пули к нормальному состоянию.


296

Достарыңызбен бөлісу:
1   ...   174   175   176   177   178   179   180   181   ...   266




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

    Басты бет