Глава 19 · Финал
Итоги главы
От блокирующего цикла с глобальными переменными до модели состояния с игровым тиком, паузой, рестартом и проверяемыми правилами.
Итоги главы 19
Что мы построили и чему научились
- Игровой мир — дискретная решётка с шагом STEP; легальные позиции всегда кратны шагу, а не произвольны.
- Направление — не строка для сравнения в if/elif, а вектор смещения (DIRECTION_VECTORS), и запрет разворота на 180° проверяется против ТЕКУЩЕГО направления, а не уже запрошенного следующего.
- Игровой тик — вся цепочка правил целиком (направление → движение → еда → столкновения → рендер), а отрисовка — концептуально отдельный шаг.
- screen.ontimer() планирует следующий тик и сразу возвращает управление — вместо того чтобы блокировать программу в цикле while с time.sleep().
- Модель змейки — список логических позиций; новая голова плюс старое тело строит движение за один проход, без цикла с риском перепутать порядок.
- Столкновение с собой проверяется против тела ПОСЛЕ хода — иначе легальный заезд в клетку освободившегося хвоста ошибочно считается проигрышем.
- Явные состояния READY/RUNNING/PAUSED/GAME_OVER — пауза и рестарт не просто меняют картинку, а переключают состояние, от которого зависит, тикает ли игра вообще.
- Поколение (generation) защищает restart() от параллельных цепочек ontimer() — тот же класс проблемы, что и повторное нажатие кнопки в главе 16.
- GameState не хранит ни одного объекта Turtle — правила игры протестированы обычным assert, без единого настоящего окна.
Мост к главе 20
Дальше: полноценный игровой движок вместо Turtle
«Змейка» построена на том же Tkinter-цикле событий, что и рисовалка из главы 18 — удобно для учебных целей, но Turtle никогда не проектировался как игровой движок. В следующей главе — Pygame — появятся настоящие спрайты, обработка коллизий на уровне библиотеки и цикл кадров, спроектированный именно для игр реального времени.