264
Глава 13 •
Осторожно, пришельцы!
def create_alien(ai_settings, screen, aliens, alien_number):
"""Создает пришельца и размещает его в ряду."""
alien = Alien(ai_settings, screen)
alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
aliens.add(alien)
def create_fleet(ai_settings, screen, aliens):
"""Создает флот пришельцев."""
# Создание пришельца и вычисление количества пришельцев в ряду.
alien = Alien(ai_settings, screen)
number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
# Создание первого ряда пришельцев.
for alien_number in range(number_aliens_x):
create_alien(ai_settings, screen, aliens, alien_number)
Код
get_number_aliens_x()
нисколько не изменился по сравнению с
create_
fleet()
. Код
create_alien()
почти не изменился, разве что для определения ши-
рины используется только что созданный пришелец
. В точке
код вычисления
горизонтальных интервалов заменяется вызовом
get_number_aliens_x()
, а строка
с
alien_width
удалена, потому что теперь задача решается в
create_alien()
. В точ-
ке
вызывается функция
create_alien()
. Рефакторинг упрощает добавление
новых строк и создание всего флота.
Добавление рядов
Чтобы завершить построение флота, определите количество рядов на экране
и повторите цикл (создания пришельцев одного ряда) полученное количество
раз. Чтобы определить количество рядов, мы вычисляем доступное вертикаль-
ное пространство, вычитая высоту пришельца (сверху), высоту корабля (снизу)
и удвоенную высоту пришельца (снизу):
available_space_y = ai_settings.screen_height — 3 * alien_height — ship_height
В результате вокруг корабля образуется пустое пространство, чтобы у игрока было
время начать стрельбу по пришельцам в начале каждого уровня. Под каждым рядом
должно быть пустое место, равное высоте пришельца. Чтобы вычислить количество
строк, мы делим свободное пространство на удвоенную высоту пришельца (как
и прежде, если формула содержит ошибку, мы это немедленно увидим и внесем
изменения, пока не получим нужные интервалы):
number_rows = available_height_y / (2 * alien_height)
Зная
количество рядов во флоте, мы можем повторить код создания ряда:
game_functions.py
def get_number_rows(ai_settings, ship_height, alien_height):
"""Определяет
количество рядов, помещающихся на экране."""
available_space_y = (ai_settings.screen_height -