Глава 20 · Разработка игр с Pygame

Состояния игры

Меню, геймплей, пауза и game over — это разные состояния игры, и код должен явно знать, в каком из них находится прямо сейчас.

Уже сейчас у ваших проектов есть как минимум одно неявное состояние — «игра идёт». На практике почти любая игра проходит через несколько чётко различимых состояний, и в каждом из них ведёт себя по-своему.

Типичные состояния игры
Меню
Показывает заголовок и кнопку "Играть"
Не двигает никаких игровых объектов
Ждёт нажатия клавиши или клика
Игра идёт
Обновляет позиции, проверяет столкновения
Реагирует на управление игрока
Основное состояние геймплея
Пауза
Не обновляет позиции объектов
Продолжает отрисовывать последний кадр
Ждёт команды на возобновление
Game Over
Показывает финальный счёт
Не принимает игровое управление
Предлагает начать заново

Состояние как перечисление

Знакомый по главе 19 приём — хранить текущее состояние как значение enum.Enum (глава 18), а не как несколько независимых булевых флагов вроде na_pauze и igra_okonchena по отдельности. У перечисления невозможно оказаться сразу в двух состояниях одновременно — у отдельных булевых флагов такая ошибка возможна совершенно случайно:

sostoyaniya_enum.py
from enum import Enum, auto

class SostoyanieIgry(Enum):
    MENU = auto()
    IGRA = auto()
    PAUZA = auto()
    GAME_OVER = auto()

tekushee_sostoyanie = SostoyanieIgry.MENU

Переходы между состояниями

Состояния этой мини-игры образуют не прямую линию, а граф: из PAUZA игра возвращается обратно в IGRA, а не идёт дальше вперёд, и то же самое с возвратом из GAME_OVER в MENU. Явный список разрешённых переходов надёжнее рисовать таблицей «откуда → куда», где у каждой строки есть свой, ничем не перепутанный триггер:

Из состоянияВ состояниеКогда
MENUIGRAнажали «Играть»
IGRAPAUZAнажали паузу
IGRAGAME_OVERстолкновение / поражение
PAUZAIGRAнажали паузу ещё раз (снять с паузы)
GAME_OVERMENUнажали «Заново»

Важно, что не каждый переход разрешён: из MENU нельзя напрямую попасть в GAME_OVER, минуя саму игру, и из PAUZA нельзя попасть в GAME_OVER напрямую — сначала игра обязана вернуться в IGRA. Код, который обрабатывает ввод и обновление, должен явно проверять текущее состояние, прежде чем выполнять действия, разрешённые только в нём — это ровно то же самое, зачем в главе 19 понадобился явный GameStatus для змейки.

Четыре реальных окна рядом: экран меню с надписью и подсказкой, игровой процесс с мячом и счётом, мяч с жёлтым оверлеем ПАУЗА по центру и экран GAME OVER с итоговым счётом
Реальное окно: четыре состояния мини-игры — меню, игра, пауза, game over. Это четыре отдельных снимка, а не один непрерывный забег, поэтому счёт на них не продолжает друг друга.
Практика: состояния игры и переходы
Проверяется прямо в браузере — установка Pygame не требуется
Открыть практику →