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

Меню, игра, пауза и завершение

Явное перечисление GameStatus и таблица разрешённых переходов вместо одной булевой переменной.

Раздел 21.7 хранил конец игры в одной переменной igra_okonchena без пути назад. Финальная версия использует явное перечисление — тот же приём, что и SostoyanieIgry в разделе 20.25:

fragment_game_status.py
class GameStatus(Enum):
    MENU = auto()
    PLAYING = auto()
    PAUSED = auto()
    GAME_OVER = auto()
Из состоянияВ состояниеКогда
MENUPLAYINGнажали Enter
PLAYINGPAUSEDнажали P
PAUSEDPLAYINGнажали P ещё раз
PLAYINGGAME_OVERжизни закончились
GAME_OVERPLAYINGнажали Enter (перезапуск)

Выход (Esc или закрытие окна) работает из любого состояния — поэтому в таблице выше он не привязан к конкретной строке: это не переход между игровыми состояниями, а завершение самой программы.

Три реальных окна рядом: пустое игровое поле, экран паузы с полупрозрачной накладкой, экран Игра окончена со счётом
Реальные кадры трёх разных состояний одной и той же игры.
Управление кораблём должно знать о состоянии
Если проверку состояния забыть в handle_input(), корабль продолжит двигаться и стрелять даже на экране паузы или Game Over — тот же класс ошибки, что раздел 21.7 уже почти совершил с igra_okonchena.