УПРАЖНЕНИЯ
14-1 . Запуск игры клавишей P: так как в Alien Invasion игрок управляет кораблем с клави-
атуры, для запуска игры также лучше использовать клавиатуру . Добавьте код, с которым
игрок сможет запустить игру нажатием клавиши P . Возможно, часть кода из check_play_
button() стоит переместить в функцию start_game(), которая будет вызываться из check_
play_button() и check_keydown_events() .
14-2 . Учебная стрельба: создайте у правого края экрана прямоугольник, который двига-
ется вверх и вниз с постоянной скоростью . У левого края располагается корабль, кото-
рый перемещается вверх и вниз игроком и стреляет по движущейся прямоугольной ми-
шени . Добавьте кнопку Play для запуска игры . После трех промахов игра заканчивается,
а на экране снова появляется кнопка Play . Нажатие этой кнопки перезапускает игру .
Повышение сложности
В текущей версии после того, как весь флот пришельцев будет уничтожен, игрок
переходит на новый уровень, но сложность игры остается неизменной. Давайте
немного оживим игру и повысим ее сложность; для этого скорость игры будет по-
вышаться каждый раз, когда игрок уничтожает весь флот.
Изменение настроек скорости
Начнем с реорганизации класса
Settings
и разделения настроек игры на две кате-
гории: постоянные и изменяющиеся. Также необходимо проследить за тем, чтобы
настройки, изменяющиеся в ходе игры, сбрасывались в исходное состояние в на-
чале новой игры. Метод
__init__()
из файла
settings .py
выглядит так:
settings.py
def __init__(self):
"""Инициализирует статические настройки игры."""
# Настройки экрана
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230, 230, 230)
# Настройки корабля
self.ship_limit = 3
# Настройки пуль
Повышение сложности 289
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60, 60, 60
self.bullets_allowed = 3
# Настройки пришельцев
self.fleet_drop_speed = 10
# Темп ускорения игры
self.speedup_scale = 1.1
self.initialize_dynamic_settings()
Значения, которые остаются неизменными, по-прежнему инициализируются в ме-
тоде
__init__()
. В точке добавляется настройка
speedup_scale
, управляющая
быстротой нарастания скорости; со значением 2 скорость удваивается каждый раз,
когда игрок переходит на следующий уровень, а со значением 1 скорость остается
постоянной. С таким значением, как 1,1, скорость будет увеличиваться в достаточ-
ной степени, чтобы игра усложнилась, но не стала невозможной. Наконец, вызов
initialize_dynamic_settings()
инициализирует значения атрибутов, которые
должны изменяться в ходе игры .
Код
initialize_dynamic_settings()
выглядит так:
settings.py
def initialize_dynamic_settings(self):
"""Инициализирует настройки, изменяющиеся в ходе игры."""
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 3
self.alien_speed_factor = 1
# fleet_direction = 1 обозначает движение вправо; а -1 - влево.
self.fleet_direction = 1
Метод задает исходные значения скоростей корабля, пуль и пришельцев. Эти ско-
рости будут увеличиваться по ходу игры и будут сбрасываться каждый раз, когда
игрок запускает новую игру. Мы включаем в этот метод
fleet_direction
, чтобы
пришельцы в начале новой игры всегда двигались вправо.
Для увеличения скорости корабля, пуль и пришельцев каждый раз, когда
игрок достигает нового уровня, в программе используется функция
increase_
speed()
:
settings.py
def increase_speed(self):
"""Увеличивает настройки скорости."""
self.ship_speed_factor *= self.speedup_scale
self.bullet_speed_factor *= self.speedup_scale
self.alien_speed_factor *= self.speedup_scale
Чтобы увеличить скорость этих игровых элементов, мы умножаем каждую на-
стройку скорости на значение
speedup_scale
.
290 Глава 14 • Ведение счета
Темп игры повышается вызовом
increase_speed()
в
check_bullet_alien_
collisions()
при уничтожении последнего пришельца во флоте, но перед созда-
нием нового флота:
game_functions.py
def check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets):
...
if len(aliens) == 0:
# Уничтожение пуль, повышение скорости и создание нового флота.
bullets.empty()
ai_settings.increase_speed()
create_fleet(ai_settings, screen, ship, aliens)
Изменения значений настроек скорости
ship_speed_factor
,
alien_speed_factor
и
bullet_speed_factor
достаточно для того, чтобы ускорить всю игру!
Сброс скорости
Каждый раз, когда игрок начинает новую игру, все измененные настройки должны
вернуться к исходным значениям, иначе каждая новая игра будет начинаться с по-
вышенными настройками скорости предыдущей игры:
game_functions.py
def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,
bullets, mouse_x, mouse_y):
"""Запускает новую игру при нажатии кнопки Play."""
button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
if button_clicked and not stats.game_active:
# Сброс игровых настроек.
ai_settings.initialize_dynamic_settings()
# Указатель мыши скрывается.
pygame.mouse.set_visible(False)
...
Игра Alien Invasion стала достаточно сложной и интересной. Каждый раз, когда
игрок очищает экран, игра должна слегка ускориться, а ее сложность должна слегка
возрасти. Если сложность игры возрастает слишком быстро, уменьшите значение
settings.speedup_scale
, а если наоборот, сложность недостаточна, — слегка уве-
личьте это значение. Найдите оптимальное значение, оценивая сложность игры
за разумный промежуток времени. Первая пара флотов должна быть простой, не-
сколько следующих — сложными, но возможными, а при последующих попытках
сложность должна становиться практически безнадежной.
Достарыңызбен бөлісу: |