Очистить рисунок черепахи через определенное время на экране - PullRequest
0 голосов
/ 05 февраля 2020

Я кодирую основную игру c змея, и я не могу найти способ очистки хвоста через некоторое время на экране. Кто-нибудь может помочь с этим?

1 Ответ

0 голосов
/ 06 февраля 2020

Я пытался сохранить этот пример в чистоте и простоте, но вы можете видеть, что есть несколько вещей, которые нужно отслеживать при исчезновении сегментов змеи, основываясь на таймере. Этот пример запускает змею в одном углу окна, направляясь к противоположному углу, перемещаясь каждые 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()

Другие могут предложить менее неформальные системы блокировки, чтобы не позволять нескольким событиям пытаться манипулировать змеей одновременно.

...