У вычислений в программировании есть одна замечательная особенность: не обязательно быть
полностью уверенным в правильности формулы, когда вы ее пишете . Вы можете опробовать
формулу на практике и посмотреть, что из этого получится . В худшем случае получится экран,
до отказа забитый пришельцами, — или наоборот, пустой . В этом случае вы пересмотрите формулу
на основании полученных результатов .
Построение флота
261
Создание ряда
Чтобы создать один ряд пришельцев, сначала создадим в
alien_invasion .py
пустую
группу с именем
aliens
для хранения всех пришельцев, а затем вызовем функцию
в
game_functions .py
для создания флота:
alien_invasion.py
import pygame
from pygame.sprite import Group
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
...
#
Создание корабля, группы пуль и группы пришельцев.
ship = Ship(ai_settings, screen)
bullets = Group()
aliens = Group()
# Создание флота пришельцев.
gf.create_fleet(ai_settings, screen, aliens)
# Запуск основного цикла игры.
while True:
...
gf.update_screen(ai_settings, screen, ship, aliens,
bullets)
run_game()
Так как пришельцы уже не создаются напрямую в
alien_invasion .py
, импортировать
класс
Alien
в этот файл не обязательно.
Создайте пустую группу для хранения всех пришельцев в игре . Затем создайте
новую функцию
create_fleet()
, которую мы вскоре вызовем, и передайте ей
ai_settings
, объект
screen
и пустую группу
aliens
. Затем измените вызов
update_
screen()
, чтобы предоставить
функции доступ к группе пришельцев .
Также необходимо внести изменения в
update_screen()
:
game_functions.py
def update_screen(ai_settings, screen, ship, aliens, bullets):
...
ship.blitme()
aliens.draw(screen)
# Отображение последнего прорисованного экрана.
pygame.display.flip()
Когда вы вызываете метод
draw()
для группы, Pygame автоматически выводит
каждый элемент группы в позиции, определяемой его атрибутом
rect
. В дан-
ном случае вызов
aliens.draw(screen)
рисует каждого пришельца в группе
на экране.
262 Глава 13 • Осторожно, пришельцы!
Создание флота
Теперь можно перейти к созданию флота. Ниже приведена новая функция
create_
fleet(),
которую мы поместим в конец
game_functions .py
. Также необходимо
импортировать класс
Alien
, не забудьте добавить команду
import
в начало файла:
game_functions.py
...
from
bullet import Bullet
from alien import Alien
...
def create_fleet(ai_settings, screen, aliens):
"""Создает флот пришельцев."""
# Создание пришельца и вычисление количества пришельцев в ряду.
# Интервал между соседними пришельцами равен одной ширине пришельца.
alien = Alien(ai_settings, screen)
alien_width = alien.rect.width
available_space_x = ai_settings.screen_width - 2 * alien_width
number_aliens_x = int(available_space_x / (2 * alien_width))
# Создание первого ряда пришельцев.
for alien_number in range(number_aliens_x):
# Создание пришельца и размещение его в ряду.
alien = Alien(ai_settings, screen)
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
aliens.add(alien)
Бульшая часть этого кода уже была описана ранее. Для размещения пришельцев
необходимо знать ширину и высоту одного пришельца, и мы создаем его в точке
перед выполнением вычислений. Этот пришелец не войдет во флот, поэтому он не
включается в группу
aliens
. В точке ширина пришельца определяется по его
атрибуту
rect
, а полученное значение сохраняется в
alien_width
, чтобы избежать
лишних обращений к атрибуту
rect
. В точке вычисляется горизонтальное про-
странство и количество пришельцев, которые в нем поместятся.
По сравнению с исходными формулами всего одно изменение: мы используем
int()
, чтобы вычисленное количество пришельцев было целым, — во-первых,
неясно, что делать с неполным пришельцем, а во-вторых, функция
range()
должна
получать целое число. Функция
int()
отсекает дробную часть числа, фактически
выполняя округление в меньшую сторону. (И это правильно: лучше оставить лиш-
нее свободное место в каждом ряду, чем забивать ряды до отказа.)
Затем создается цикл от 0 до количества создаваемых пришельцев . В теле цикла
создается новый пришелец, после чего задается его координата x для размещения
его в ряду
. Каждый пришелец сдвигается вправо на одну ширину от левого поля.
Затем ширина пришельца умножается на 2, чтобы учесть полное пространство,
выделенное для одного пришельца, включая пустой интервал справа, а получен-
ная величина умножается на позицию пришельца в ряду. Затем новый пришелец
добавляется в группу
aliens
.