Глава 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 — появятся настоящие спрайты, обработка коллизий на уровне библиотеки и цикл кадров, спроектированный именно для игр реального времени.