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



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


Глава 13 • Осторожно, пришельцы!
Обработка столкновений с кораблем
Теперь нужно разобраться, что же происходит при столкновении пришельца 
с кораблем. Вместо того чтобы уничтожать экземпляр 
ship
и создавать новый, 
мы будем подсчитывать количество уничтоженных кораблей; для этого следует 
организовать сбор статистики по игре. (Статистика также пригодится для под-
счета очков.)
Напишем новый класс 
GameStats
для ведения статистики и сохраним его в файле 
game_stats .py
:
game_stats.py
class GameStats():
"""Отслеживание статистики для игры Alien Invasion."""
def __init__(self, ai_settings):
"""Инициализирует статистику."""
self.ai_settings = ai_settings
 
self.reset_stats()
def reset_stats(self):
"""Инициализирует статистику, изменяющуюся в ходе игры."""
self.ships_left = self.ai_settings.ship_limit
На все время работы Alien Invasion будет создаваться один экземпляр 
GameStats

но часть статистики должна сбрасываться в начале каждой новой игры. Для этого 
б
у
льшая часть статистики будет инициализироваться в методе 
reset_stats()
вместо 
__init__()
. Этот метод будет вызываться из 
__init__()
, чтобы статистика 
правильно инициализировалась при первом создании экземпляра 
GameStats


а метод 
reset_stats()
будет вызываться в начале каждой новой игры.
Пока в игре используется всего один вид статистики — значение 
ships_left
, из-
меняющееся в ходе игры. Количество кораблей в начале игры хранится в 
settings .py
под именем 
ship_limit
:
settings.py
# Настройки корабля
self.ship_speed_factor = 1.5
self.ship_limit = 3
Также необходимо внести ряд изменений в 
alien_invasion .py
для создания экзем-
пляра 
GameStats
:
alien_invasion.py
...
from settings import Settings
 
from game_stats import GameStats
...
def run_game():
...
pygame.display.set_caption("Alien Invasion")


Завершение игры
277
# Создание экземпляра для хранения игровой статистики.
 
stats = GameStats(ai_settings)
...
# Запуск основного цикла игры.
while True:
...
gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
 
gf.update_aliens(ai_settings, stats, screen, ship, aliens, 
bullets)
...
Мы импортируем новый класс 
GameStats

, создаем экземпляр 
stats

, а затем 
добавляем аргументы 
stats

screen
и 
ship
в вызов 
update_aliens()

. Эти аргу-
менты будут использоваться для отслеживания количества кораблей, оставшихся 
у игрока, и построения нового флота при столкновении пришельца с кораблем.
Когда пришелец сталкивается с кораблем, программа уменьшает количество 
оставшихся кораблей на 1, уничтожает всех существующих пришельцев и пули, 
создает новый флот и возвращает корабль в середину экрана. (Также игра нена-
долго приостанавливается, чтобы игрок заметил столкновение и перестроился 
перед появлением нового флота.)
Б
у
льшая часть этого кода будет включена в функцию 
ship_hit()
:
game_functions.py
import sys
 
from time import sleep
import pygame
...
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):
"""Обрабатывает столкновение корабля с пришельцем."""
# Уменьшение ships_left.
 
stats.ships_left -= 1
# Очистка списков пришельцев и пуль.
 
aliens.empty()
bullets.empty()
# Создание нового флота и размещение корабля в центре.
 
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
# Пауза.
 
sleep(0.5)
 
def update_aliens(ai_settings, stats, screen, ship, aliens,
bullets):
...
# Проверка коллизий "пришелец-корабль".
if pygame.sprite.spritecollideany(ship, aliens):
ship_hit(ai_settings, stats, screen, ship, aliens, bullets)
Сначала мы импортируем функцию 
sleep()
из модуля 
time
, чтобы приостановить 
игру 

. Новая функция 
ship_hit()
управляет реакцией игры на столкновение 


278

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




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

    Басты бет