Глава 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() для всех четырёх направлений
Открыть практику →