Бесконечно перемещать черепаху Python, разрешая ввод

Я только начал работать над версией Snake, использующей Turtle, и столкнулся с проблемой. Я хочу, чтобы змея двигалась бесконечно, но также чтобы пользователь мог двигать змею с помощью клавиатуры. Я заставил змею двигаться от пользовательского ввода, но я не могу понять, как заставить змею двигаться в том же направлении, пока нет ввода, не позволяя ей игнорировать ввод пользователя:

while True:
  win.onkey(up,"Up")
  win.onkey(right,"Right")
  win.onkey(down,"Down")
  win.onkey(left,"Left")
  win.listen()
#moves the snake one unit in the same direction it is currently facing
  movesnake()

Я новичок в Turtle, и это мое предположение о том, как решить эту проблему, которая, очевидно, не работает. Любая помощь будет оценена. Я понимаю, что Pygame может упростить эту задачу, но, поскольку я уже начал работать с Turtle, я бы предпочел получить решение Turtle, если это возможно.


person acousticewe    schedule 11.10.2018    source источник


Ответы (1)


Среда, управляемая событиями, такая как черепаха, никогда не должна иметь while True:, поскольку она потенциально блокирует события (например, клавиатуру). Вместо этого используйте событие ontimer().

Как правило, onkey() и listen() не входят в цикл - для большинства программ их нужно вызывать только один раз.

Вот скелетный пример автономной черепахи, которую перенаправляет пользовательский ввод:

from turtle import Screen, Turtle

def right():
    snake.setheading(0)

def up():
    snake.setheading(90)

def left():
    snake.setheading(180)

def down():
    snake.setheading(270)

def movesnake():

    snake.forward(1)

    screen.ontimer(movesnake, 100)

snake = Turtle("turtle")

screen = Screen()

screen.onkey(right, "Right")
screen.onkey(up, "Up")
screen.onkey(left, "Left")
screen.onkey(down, "Down")

screen.listen()

movesnake()

screen.mainloop()
person cdlane    schedule 11.10.2018
comment
Да, большое спасибо, это сработало отлично :) тем более, что вы знаете - person acousticewe; 11.10.2018