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



Pdf көрінісі
бет138/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   134   135   136   137   138   139   140   141   ...   238
Байланысты:
2 5343781172763690906

ПРИМЕЧАНИЕ

В  зависимости  от  выбранной  ширины  экрана  расположение  первого  ряда  пришельцев  в  вашей 

системе может выглядеть немного иначе .

Рефакторинг 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   ...   134   135   136   137   138   139   140   141   ...   238




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

    Басты бет