263
Рис. 13.3.
Первый ряд пришельцев
Запустив программу Alien Invasion, вы увидите, что на экране появился первый
ряд пришельцев (рис. 13.3).
Первый ряд сдвинут влево, и это хорошо, потому что флот пришельцев должен дви-
гаться вправо, пока не дойдет до края экрана, затем немного опуститься вниз, затем
двигаться влево и т. д. Как и в классической игре Space Invaders, такое перемещение
интереснее, чем постепенное снижение по прямой. Движение будет продолжаться
до тех пор, пока все пришельцы не будут сбиты или пока пришелец не столкнется
с кораблем или нижним краем экрана.
ПРИМЕЧАНИЕ
В зависимости от выбранной ширины экрана расположение первого ряда пришельцев в вашей
системе может выглядеть немного иначе .
Рефакторинг create_fleet()
Если бы создание флота на этом было завершено, то функцию
create_fleet()
,
пожалуй, можно было бы оставить в таком виде, но работа еще не закончена, по-
этому мы немного подчистим код функции. Ниже приведена версия
create_fleet()
с двумя новыми функциями:
get_number_aliens_x()
и
create_alien()
:
game_functions.py
def get_number_aliens_x(ai_settings, alien_width):
"""Вычисляет количество пришельцев в ряду."""
available_space_x = ai_settings.screen_width - 2 * alien_width
number_aliens_x = int(available_space_x / (2 * alien_width))
return number_aliens_x
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
:
|