Глава 21 · Проект: космический шутер

Собираем финальную версию игры

Все разделы 21.9–21.24 — в одном читаемом, готовом к запуску файле.

Все разделы 21.9–21.24 собираются в один файл — projects/pygame/space-shooter/space_shooter.py. Он не разбит на несколько модулей: проект достаточно компактен, чтобы один читаемый файл был понятнее, чем россыпь из десятка мелких.

projects/pygame/space-shooter/space_shooter.py

game : Gamestate = GameStatus.PLAYINGscore = 640lives = 3player.position = (240.…, 612.0)bullets = 3 спрайтаenemies = 4 спрайта
Реальное состояние работающей игры в конкретный момент — то, что на самом деле хранится в памяти между кадрами.

Что изменилось по сравнению с первой рабочей версией (21.8)

Раздел 21.8 (checkpoint)Финальная версия (21.25)
Организация кодаФункции и словари/списки поверх RectКлассы Game/Player/Bullet/Enemy/Explosion поверх pygame.sprite.Group
Движениеpx/s + dt, дробные координаты хранятся отдельно от Rectpx/s + dt через Vector2 внутри классов Player/Bullet/Enemy
ГрафикаЗакрашенные прямоугольникиСобственные PNG-спрайты
ЗвукНетТри оригинальных синтезированных звука
Конец игрыОдно столкновение — мгновенный конецСистема жизней с неуязвимостью
СложностьПостояннаяРастёт плавно вместе со счётом
СостоянияОдна булева переменнаяGameStatus: MENU/PLAYING/PAUSED/GAME_OVER
ПерезапускТолько перезапуск PythonEnter на экране Game Over
ВзрывыНетАнимация из нескольких кадров
Тесты7 регрессионных тестов таймера и движения (раздел 21.3)38 тестов класса Game и вспомогательных функций, включая FPS-независимость
Реальное окно: насыщенный кадр геймплея — синий корабль, несколько врагов и пуль, звёздный фон, читаемый HUD со счётом 640
Реальный кадр финальной версии — тот же корабль, что и в разделе 21.2, но выросший в полноценную игру.
★★★ Задача повышенной сложности
Ещё один тип врага

Добавьте третий EnemySpec — например, "bomber": медленный, но с большим количеством очков и собственным спрайтом (расширьте scripts/generate_chapter_21_assets.py).

★★★ Задача повышенной сложности
Бонусы на игровом поле

Добавьте класс PowerUp: подбираемый объект, временно уменьшающий FIRE_INTERVAL после столкновения с кораблём — используйте тот же приём таймера, что и для неуязвимости.

Практика: собираем и запускаем финальную игру
Pygame открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →