🏠 Главная 🐍 Змейка
1 2 3 4 5 6 7 8
Урок 5

Управляем стрелками

Что ты увидишь Уже настоящую змейку (пока без еды), которая поворачивает по стрелкам. Файл: step5_keys.py
⬇️ Скачать код урока

📝 Код урока (новое — внутри цикла событий)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        if event.type == pygame.KEYDOWN:
            # Меняем направление, но НЕ даём развернуться на 180°
            if event.key == pygame.K_UP and direction != (0, 1):
                direction = (0, -1)
            elif event.key == pygame.K_DOWN and direction != (0, -1):
                direction = (0, 1)
            elif event.key == pygame.K_LEFT and direction != (1, 0):
                direction = (-1, 0)
            elif event.key == pygame.K_RIGHT and direction != (-1, 0):
                direction = (1, 0)

🔍 Что тут происходит

KEYDOWN — «клавишу нажали»

event.type == pygame.KEYDOWN срабатывает в момент, когда нажали любую клавишу. А event.key говорит, какую именно: K_UP, K_DOWN, K_LEFT, K_RIGHT — это стрелки.

if / elif — «или то, или другое»

if проверяет первое условие. Если оно не подошло — elif (это «else if», иначе если) проверяет следующее. Сработает только один из них.

⭐ Защита от разворота на 180°

Зачем рядом стоит and direction != (0, 1)? Представь: змейка едет вниз, и ты нажал вверх. Новая голова окажется прямо на месте первого сегмента тела — змейка сразу врежется сама в себя!

едем вниз: [.][Г] [#] ← тело прямо под головой нажали вверх → новая голова попадёт В тело = смерть

Поэтому мы запрещаем поворот, если он противоположен текущему направлению. direction != (0, 1) читается как «если сейчас НЕ едем вниз».

⚠️ Это был баг в самой первой версии Если поставить цикл событий вне while True, клавиши вообще не будут работать. Весь for event ... должен быть внутри главного цикла.
🐞 Сломалось! Почини Скачай bug3_keys_dead.py и запусти. Змейка едет вправо, но стрелки её не поворачивают! Окно закрывается крестиком — значит события читаются. Прочитай строчку, которая должна ловить «клавишу нажали». С чем она сравнивает event.type? Застрял? → словарь ошибок.
🎮 Попробуй сам Добавь управление на буквах WASD (для второй руки):
elif event.key == pygame.K_w and direction != (0, 1): → вверх, и так далее для K_s, K_a, K_d.

🧠 Проверь себя

Выбери ответ. Ошибёшься — 30 секунд на то, чтобы вернуться в урок и перечитать.

Когда срабатывает pygame.KEYDOWN?

✅ KEYDOWN — это «клавишу нажали». А event.key говорит, какую именно (K_UP, K_LEFT…).

Зачем условие direction != (0, 1) при повороте вверх?

✅ Если едешь вниз и жмёшь вверх — голова попадёт в своё же тело. Поэтому разворот запрещаем.
← НазадУрок 4 — Движение