Глава 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 · клавиши и движение головы