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



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

ПРИМЕЧАНИЕ

У  вычислений  в  программировании  есть  одна  замечательная  особенность:  не  обязательно  быть 

полностью  уверенным  в  правильности  формулы,  когда  вы  ее  пишете .  Вы  можете  опробовать 

формулу  на  практике  и  посмотреть,  что  из  этого  получится .  В  худшем  случае  получится  экран, 

до  отказа забитый пришельцами, — или наоборот, пустой . В этом случае вы пересмотрите формулу 

на основании полученных результатов .




Построение флота    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

.



Построение флота    263



Достарыңызбен бөлісу:
1   ...   132   133   134   135   136   137   138   139   ...   238




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

    Басты бет