В зависимости от выбранной ширины экрана расположение первого ряда пришельцев в вашей
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 -
Построение флота
265
(3 * alien_height) - ship_height)
number_rows = int(available_space_y / (2 * alien_height))
return number_rows
def create_alien(ai_settings, screen, aliens, alien_number, row_number):
...
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
aliens.add(alien)
def create_fleet(ai_settings, screen, ship, aliens):
...
number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
number_rows = get_number_rows(ai_settings, ship.rect.height,
alien.rect.height)
# Создание флота пришельцев.
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
create_alien(ai_settings, screen, aliens, alien_number,
row_number)
Чтобы вычислить количество рядов, помещающихся на экране, мы включаем вы-
числения
available_space_y
и
number_rows
в функцию
get_number_rows()
, похо-
жую на
get_number_aliens_x()
. Вычисления заключаются в круглые скобки, чтобы
их можно было разбить на две строки длиной 79 символов и менее, как указано
в рекомендациях . Функция
int()
используется для того, чтобы предотвратить
создание неполного ряда пришельцев.
Чтобы создать несколько строк, мы используем два вложенных цикла: внешний
и внутренний . Внутренний цикл создает один ряд пришельцев. Внешний цикл
считает от 0 до количества рядов; Python использует код создания одного ряда
и повторяет его
number_rows
раз.
Чтобы создать вложенный цикл, напишите новый цикл
for
и снабдите повторя-
емый код отступом. (В большинстве текстовых редакторов операции создания
и удаления блоков кода выполняются просто, но, если вам понадобится помощь,
обращайтесь к приложению Б.) Затем при вызове
create_alien()
передается
аргумент с номером ряда, чтобы каждый ряд находился на экране ниже преды-
дущих.
Определению
create_alien()
необходим параметр с номером ряда. В
create_
alien()
мы изменяем координату y пришельца. Сначала прибавляется одна
высота пришельца, чтобы создать пустое место у верхнего края экрана. Каждый
новый ряд начинается на две высоты пришельца ниже последнего ряда, поэтому
мы умножаем высоту пришельца на 2, а затем на номер ряда. Номер первого ряда
равен 0, так что вертикальное расположение первого ряда остается неизменным.
Все последующие ряды размещаются ниже на экране.
Определение
create_fleet()
также содержит новый параметр для объекта
ship
;
следовательно, в вызов
create_fleet()
в
alien_invasion .py
необходимо добавить
аргумент
ship
: