Глава 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(): округление координат в клетки с отрицательными числами