Глава 19 · Модель игры

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

Не просто «игра идёт или закончилась» — четыре чётких состояния с ясными переходами между ними.

Игра — это не только «идёт» или «не идёт»

Первый прототип знал только igra_okonchena — булево да/нет. Финальная версия различает четыре состояния обычной партии, и переходы между ними — это не случайность, а чёткие правила:

READY
ждём первое направление
request_direction() — первое нажатие
RUNNING
тики идут
toggle_pause() ⇄ toggle_pause()
PAUSED
тики остановлены
столкновение со стеной/собой
GAME_OVER
столкновение
restart()
READY
ждём первое направление
СостояниеЧто происходит
READYзмейка на месте, ждём первое нажатие направления — тики ещё не идут
RUNNINGтики планируются друг за другом через ontimer()
PAUSEDтики остановлены, модель не меняется, экран показывает «ПАУЗА»
GAME_OVERстолкновение произошло; ждём restart()
WONполе заполнено целиком, свободной клетки для еды не осталось — раздел 19.18
Пятое состояние — редкое, но настоящее
В GameStatus финальной программы пять членов, а не четыре: кроме четырёх состояний обычной партии есть WON — змейка заняла буквально каждую клетку поля. Оно почти недостижимо в реальной игре, но это полноценное терминальное состояние, а не «почти GAME_OVER»: раздел 19.18 показывает, откуда оно берётся, а раздел 19.21 — чем терминальные состояния похожи друг на друга.
GameStatus как Enum — та же идея, что и Tool в главе 18
Четыре состояния — конечный известный список, поэтому Enum здесь так же оправдан, как Tool для инструментов рисовалки: опечатку в имени состояния поймает редактор, а не тихий баг посреди игры.
Практика: переходы состояния игры
Автоматическая проверка — функция can_transition(): какие переходы между READY/RUNNING/PAUSED/GAME_OVER допустимы
Открыть практику →