Глава 19 · Проект: «Змейка»

Регистрирует ли экран нажатия клавиш со стрелками?

Подключаем клавиатуру и заставляем голову двигаться — с защитой от мгновенного разворота на 180°.

Регистрирует ли экран нажатия клавиш со стрелками?

Чтобы Turtle реагировал на клавиатуру, ему нужно явно разрешить «слушать» события (screen.listen()) и связать конкретные клавиши с функциями через onkeypress() — идея та же, что и .bind() у Tkinter в главе 17, только с более простым, специализированным интерфейсом:

klavishi.py
def idti_vverh():
    global napravlenie
    if napravlenie != "down":   # нельзя развернуться на 180° мгновенно
        napravlenie = "up"

def idti_vniz():
    global napravlenie
    if napravlenie != "up":
        napravlenie = "down"

# idti_vlevo() и idti_vpravo() устроены аналогично

screen.listen()
screen.onkeypress(idti_vverh, "Up")
screen.onkeypress(idti_vniz, "Down")
screen.onkeypress(idti_vlevo, "Left")
screen.onkeypress(idti_vpravo, "Right")
Почему нельзя просто развернуться на 180°?
Если змейка двигалась вправо, а игрок нажмёт «влево», голова мгновенно «наедет» на первый сегмент собственного тела — это выглядело бы как мгновенный проигрыш без видимой причины. Проверка if napravlenie != "down": запрещает разворот на месте, разрешая только повороты на 90°.

Заставляем голову змейки двигаться

dvizhenie_golovy.py
def dvigat_golovu():
    if napravlenie == "up":
        golova.sety(golova.ycor() + RAZMER_SHAGA)
    elif napravlenie == "down":
        golova.sety(golova.ycor() - RAZMER_SHAGA)
    elif napravlenie == "left":
        golova.setx(golova.xcor() - RAZMER_SHAGA)
    elif napravlenie == "right":
        golova.setx(golova.xcor() + RAZMER_SHAGA)
sety()/setx() — половина от goto()
sety(y) меняет только координату Y, оставляя X прежним — удобнее, чем вычислять обе координаты через goto() каждый раз.
Практика в Jupyter Notebook
19-04-dvizhenie.ipynb · клавиши и движение головы
Открыть ноутбук →