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



Pdf көрінісі
бет145/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   141   142   143   144   145   146   147   148   ...   238
Байланысты:
2 5343781172763690906

game_stats.py

class GameStats():

    """Отслеживание статистики для игры Alien Invasion."""

    

    def __init__(self, ai_settings):



        """Инициализирует статистику."""

        self.ai_settings = ai_settings

        self.reset_stats()



        

    def reset_stats(self):

        """Инициализирует статистику, изменяющуюся в ходе игры."""

        self.ships_left = self.ai_settings.ship_limit

На все время работы Alien Invasion будет создаваться один экземпляр 

GameStats

но часть статистики должна сбрасываться в начале каждой новой игры. Для этого 



бульшая часть статистики будет инициализироваться в методе 

reset_stats()

 

вместо 


__init__()

. Этот метод будет вызываться из 

__init__()

, чтобы статистика 

правильно инициализировалась при первом создании экземпляра 

GameStats

 , 

а метод 


reset_stats()

 будет вызываться в начале каждой новой игры.

Пока в игре используется всего один вид статистики — значение 

ships_left

, из-

меняющееся в ходе игры. Количество кораблей в начале игры хранится в 



settings .py

 

под именем 



ship_limit

:

settings.py

# Настройки корабля

self.ship_speed_factor = 1.5

self.ship_limit = 3

Также необходимо внести ряд изменений в 

alien_invasion .py

 для создания экзем-

пляра 

GameStats



:

alien_invasion.py

...


from settings import Settings

from game_stats import GameStats



...

def run_game():

...

pygame.display.set_caption("Alien Invasion")




Завершение игры    277

    # Создание экземпляра для хранения игровой статистики.

    stats = GameStats(ai_settings)



...

# Запуск основного цикла игры.

while True:

...


gf.update_bullets(ai_settings, screen, ship, aliens, bullets)

        gf.update_aliens(ai_settings, stats, screen, ship, aliens, 



                           bullets)

...


Мы импортируем новый класс 

GameStats

 , создаем экземпляр 

stats


 , а затем 

добавляем аргументы 

stats



screen



 и 

ship


 в вызов 

update_aliens()

 . Эти аргу-

менты будут использоваться для отслеживания количества кораблей, оставшихся 

у игрока, и построения нового флота при столкновении пришельца с кораблем.

Когда пришелец сталкивается с кораблем, программа уменьшает количество 

оставшихся кораблей на 1, уничтожает всех существующих пришельцев и пули, 

создает новый флот и возвращает корабль в середину экрана. (Также игра нена-

долго приостанавливается, чтобы игрок заметил столкновение и перестроился 

перед появлением нового флота.)

Бульшая часть этого кода будет включена в функцию 

ship_hit()

:

game_functions.py

import sys

from time import sleep



import pygame

...


def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):

    """Обрабатывает столкновение корабля с пришельцем."""

    # Уменьшение ships_left.

    stats.ships_left -= 1



    

    # Очистка списков пришельцев и пуль.

    aliens.empty()



    bullets.empty()

    


    # Создание нового флота и размещение корабля в центре.

    create_fleet(ai_settings, screen, ship, aliens)



    ship.center_ship()

    


    # Пауза.

    sleep(0.5)



def update_aliens(ai_settings, stats, screen, ship, aliens,  

                    bullets):

...


# Проверка коллизий "пришелец-корабль".

if pygame.sprite.spritecollideany(ship, aliens):

        ship_hit(ai_settings, stats, screen, ship, aliens, bullets)

Сначала мы импортируем функцию 

sleep()

 из модуля 

time

, чтобы приостановить 



игру . Новая функция 

ship_hit()

 управляет реакцией игры на столкновение 



278    Глава 13  •  Осторожно, пришельцы!

 корабля с пришельцем. Внутри 

ship_hit()

 число оставшихся кораблей уменьша-

ется на 1 , после чего происходит очистка групп 

aliens


 и 

bullets


 .

Затем программа создает новый флот и выравнивает корабль по центру нижнего 

края . (Вскоре мы добавим метод 

center_ship()

 в класс 

Ship


.) Наконец, после 

внесения изменений во все игровые элементы, но до перерисовки изменений 

на экране делается короткая пауза, чтобы игрок увидел, что его корабль столкнул-

ся с пришельцем . После завершения паузы 

sleep()

 код переходит к функции 

update_screen()

, которая перерисовывает новый флот на экране.

Также необходимо обновить определение 

update_aliens()

 и добавить параметры 

stats


screen


 и 

bullets


 

, чтобы эти значения можно было передать при вызове 



ship_hit()

.

Ниже приведен новый метод 



center_ship()

; добавьте его в конец 

ship .py

:

ship.py

def center_ship(self):

    """Размещает корабль в центре нижней стороны."""

    self.center = self.screen_rect.centerx

Чтобы выровнять корабль по центру, мы задаем атрибуту 

center

 корабля значение, 



соответствующее центру экрана (полученное при помощи атрибута 

screen_rect

).



Достарыңызбен бөлісу:
1   ...   141   142   143   144   145   146   147   148   ...   238




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

    Басты бет