@ JBernardo абсолютно прав насчет ссылок на функции и вызовов функций (+1).
Но я хочу рассмотреть еще одну проблему в вашем коде: использование while True:
и в меньшей степени wn.update()
и time.sleep(delay)
.В мире, управляемом событиями, как turtle, никогда не должно быть while True:
, поскольку управление должно быть передано обработчику событий через вызов wn.mainloop()
, которого ваш код никогда не достигает.Чтобы получить анимацию с задержкой по времени, которую вы хотите, мы можем использовать событие таймера через wn.ontimer()
.
Ниже ваш код переписан для использования события таймера и упрощает вашу логику поворота:
from turtle import Screen, Turtle
DELAY = 100 # milliseconds
# Screen
wn = Screen()
wn.title("Snake Game By AniPita")
wn.bgcolor('black')
wn.setup(600, 600)
# Snake Head
head = Turtle('square')
head.speed('fastest')
head.color('white')
head.setheading(1) # magic token for no motion
head.penup()
# Functions
def go_up():
head.setheading(90)
def go_down():
head.setheading(270)
def go_left():
head.setheading(180)
def go_right():
head.setheading(0)
def move():
if head.heading() % 90 == 0:
head.forward(10)
wn.ontimer(move, DELAY)
# Keyboard Bindings
wn.onkeypress(go_up, 'w')
wn.onkeypress(go_down, 's')
wn.onkeypress(go_left, 'a')
wn.onkeypress(go_right, 'd')
wn.listen()
# Main Game
move()
wn.mainloop()
Использование while True:
потенциально блокирует некоторые входные события, которые вы хотите получить от вашего плеера.