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

Координаты клетки и пиксели Turtle

Отдельный перевод «клетка → пиксель» не нужен — координаты и так всегда кратны шагу.

Клетка сетки против пикселя Turtle

У Turtle нет отдельного понятия «клетка» — есть только пиксельные координаты (x, y), те же самые, что и в главах 6–7. Можно было бы завести отдельную систему координат клеток — col = x // STEP, row = y // STEP — и переводить одно в другое при каждом обращении к экрану.

pixel_to_cell.py
def cell_to_pixel(col, row, step=20):
    return col * step, row * step

def pixel_to_cell(x, y, step=20):
    return x // step, y // step
Целочисленное деление отрицательных чисел — не то же самое, что округление к нулю
-10 // 20 в Python равно -1, а не 0 — Python округляет деление вниз (к минус бесконечности), а не к нулю. Формула перевода пикселей в клетки, написанная без учёта этого, будет неверна ровно в половине поля — той, что с отрицательными координатами.

Для этой главы выбрано более простое решение: логическая позиция змейки и яблока — это сразу пиксельные координаты Turtle, уже кратные STEP. Отдельной системы «клетка (col, row)» нет вообще — (x, y) одновременно и то, что мы храним в модели, и то, что понимает turtle.goto().

logicheskaya_poziciya.py
STEP = 20
head = (0, 0)          # уже пиксели Turtle — и уже позиция клетки
head = (head[0] + STEP, head[1])   # шаг вправо — сразу в пикселях
Меньше кода — меньше мест для ошибки
Перевод «клетка ↔ пиксель» — лишний шаг, который пришлось бы делать в обе стороны на каждом тике: один раз при движении, второй — при отрисовке. Раз координаты и так всегда кратны STEP, этот перевод не добавляет никакой новой информации — только риск обратной ошибки округления из примера выше.
Практика: клетка и пиксели
Автоматическая проверка — функция pixel_to_cell(): округление координат в клетки с отрицательными числами
Открыть практику →