Глава 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 допустимы