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



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

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
:




Достарыңызбен бөлісу:
1   ...   158   159   160   161   162   163   164   165   ...   266




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

    Басты бет