Я пытался сохранить этот пример в чистоте и простоте, но вы можете видеть, что есть несколько вещей, которые нужно отслеживать при исчезновении сегментов змеи, основываясь на таймере. Этот пример запускает змею в одном углу окна, направляясь к противоположному углу, перемещаясь каждые 1/4 секунды. Каждый раз, когда вы нажимаете на экран, он получает сегмент тела. Но каждые 1,5 секунды он теряет сегмент тела:
from turtle import Screen, Turtle
CURSOR_SIZE = 20
def add_segment(x, y):
global locked
screen.onclick(None) # disable handler inside handler
if not locked:
locked = True
head = segments[0]
if spares:
segment = spares.pop()
segment.setposition(head.position())
segment.showturtle()
else:
segment = head.clone()
segment.forward(CURSOR_SIZE)
segments.insert(0, segment)
locked = False
screen.update()
head = segments[0]
if head.distance(target) > CURSOR_SIZE:
screen.onclick(add_segment) # reenable handler
def remove_segment():
global locked
if not locked:
locked = True
if len(segments) > 1:
segment = segments.pop()
segment.hideturtle()
spares.append(segment)
locked = False
screen.update()
head = segments[0]
if head.distance(target) > CURSOR_SIZE:
screen.ontimer(remove_segment, 1500)
else:
screen.onclick(None)
def move_snake():
global locked
if not locked:
locked = True
for segment in segments:
segment.forward(CURSOR_SIZE)
locked = False
screen.update()
head = segments[0]
if head.distance(target) > CURSOR_SIZE:
screen.ontimer(move_snake, 250)
else:
screen.onclick(None)
screen = Screen()
screen.tracer(False)
width, height = screen.window_width(), screen.window_height()
start = CURSOR_SIZE - width/2, CURSOR_SIZE - height/2
target = width/2 - CURSOR_SIZE, height/2 - CURSOR_SIZE
snake = Turtle('circle', visible=False)
snake.penup()
snake.goto(start)
snake.setheading(snake.towards(target))
snake.showturtle()
segments = [snake]
spares = []
locked = False
move_snake()
remove_segment()
screen.onclick(add_segment)
screen.mainloop()
Другие могут предложить менее неформальные системы блокировки, чтобы не позволять нескольким событиям пытаться манипулировать змеей одновременно.