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


    Глава 12  •  Стреляющий корабль Рис. 12.2



Pdf көрінісі
бет124/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   120   121   122   123   124   125   126   127   ...   238
Байланысты:
2 5343781172763690906

238    Глава 12  •  Стреляющий корабль

Рис. 12.2. Корабль в середине нижней стороны экрана

Рефакторинг: модуль game_functions

В больших проектах перед добавлением нового кода часто проводится рефакто-

ринг уже написанного кода. Рефакторинг упрощает структуру существующего 

кода и дальнейшее развитие проекта. В этом разделе мы создадим новый модуль 

game_functions

 для хранения функций, обеспечивающих работу игры. Модуль 

game_functions

 предотвратит чрезмерное разрастание 

alien_invasion .py

 и сделает 

логику 


alien_invasion .py

 более простой и понятной.

Функция check_events()

Начнем с перемещения кода управления событиями в отдельную функцию 

check_

events()


. Тем самым вы упростите 

run_game()

 и изолируете цикл управления 

событиями от остального кода. Изоляция цикла событий позволит организовать 

управление событиями отдельно от других аспектов игры (например, обновления 

экрана).


Поместим 

check_events()

 в отдельный модуль с именем 

game_functions

:

game_functions.py

import sys

import pygame

def check_events():




Рефакторинг: модуль game_functions    239

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

for event in pygame.event.get():

if event.type == pygame.QUIT:

sys.exit()

Этот модуль импортирует модули 

sys

 и 


pygame

, используемые в цикле обработки 

событий. На данный момент эта функция не получает параметров, а ее тело копи-

руется из цикла событий в 

alien_invasion .py

.

Теперь изменим код 



alien_invasion .py

, чтобы он импортировал модуль 

game_

functions



, и мы заменим цикл событий вызовом 

check_events()

:

alien_invasion.py

import pygame

from settings import Settings

from ship import Ship

import game_functions as gf

def run_game():

...

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



while True:

        gf.check_events()

                

# При каждом проходе цикла перерисовывается экран.

...

Импортировать модуль 



sys

 прямо в главный файл в программы уже не нужно, по-

тому что он сейчас используется только в модуле 

game_functions

. Импортируемому 

модулю 


game_functions

 для удобства присваивается псевдоним 

gf

.

Функция update_screen()



Для дальнейшего упрощения 

run_game()

 выделим код обновления экрана в от-

дельную функцию 

update_screen()

 в 


game_functions .py

:

game_functions.py

...

def check_events():



...

def update_screen(ai_settings, screen, ship):

    """Обновляет изображения на экране и отображает новый экран."""

# При каждом проходе цикла перерисовывается экран.

screen.fill(ai_settings.bg_color)

ship.blitme()

# Отображение последнего прорисованного экрана.

pygame.display.flip()

Новая функция 

update_screen()

 получает три параметра: 

ai_settings

screen


 

и 

ship



. Теперь необходимо заменить цикл 

while


 из 

alien_invasion .py

 вызовом 

update_


screen()

:



240    Глава 12  •  Стреляющий корабль

alien_invasion.py

...


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

while True:

gf.check_events()

        gf.update_screen(ai_settings, screen, ship)

run_game()

Эти две функции упрощают цикл 

while

 и процесс дальнейшей разработки. Буль-



шая часть работы будет выполняться не в 

run_game()

, а в модуле 

game_functions

.

Так как мы решили начать работу с кодом c одного файла, мы не стали вводить мо-



дуль 

game_functions

 с самого начала. Эта последовательность дает представление 

о реальном процессе разработки: сначала вы пишете свой код в самом простом виде, 

а потом подвергаете его рефакторингу по мере роста сложности проекта.

Теперь, когда мы изменили структуру кода и упростили его расширение, можно 

переходить к динамическим аспектам игры!



Достарыңызбен бөлісу:
1   ...   120   121   122   123   124   125   126   127   ...   238




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

    Басты бет