Глава 19 · Модель игры
Направление как вектор
Направление — это не строка, которую сравнивают в if/elif, а данные: пара чисел (dx, dy).
От четырёх if/elif к одному словарю
Первый прототип определял движение головы четырьмя ветками if/elif
(раздел 19.4) — читаемо, но при добавлении новой логики (например, диагонального движения в
другой игре) пришлось бы дублировать структуру снова. Направление можно представить иначе —
как вектор смещения:
↑
UP
(0, +STEP)
↓
DOWN
(0, −STEP)
←
LEFT
(−STEP, 0)
→
RIGHT
(+STEP, 0)
direction_vectors.py
DIRECTION_VECTORS = {
Direction.UP: (0, STEP),
Direction.DOWN: (0, -STEP),
Direction.LEFT: (-STEP, 0),
Direction.RIGHT: (STEP, 0),
}
def next_head(head, direction):
dx, dy = DIRECTION_VECTORS[direction]
return (head[0] + dx, head[1] + dy)
if/elif против словаря векторов
Явно, но растёт с числом направлений
if napravlenie == "up":
golova.sety(golova.ycor() + RAZMER_SHAGA)
elif napravlenie == "down":
golova.sety(golova.ycor() - RAZMER_SHAGA)
# ...и так для left, right
Один словарь, одна формула
dx, dy = DIRECTION_VECTORS[direction]
new_x, new_y = x + dx, y + dy
Что использовать сегодня: Оба варианта дают одинаковый результат для четырёх направлений. Разница появляется в том, как код растёт: словарь — это данные, а не ветвление, поэтому тестировать и расширять его проще, не трогая саму формулу движения.
Практика: направление как вектор
Автоматическая проверка — функция next_head() для всех четырёх направлений