为什么我需要这段代码中的 time.sleep(x) 函数才能工作?

问题描述

from turtle import Screen,Turtle
import time
import snake

MOVE_disTANCE = 20


UP = 90
DOWN = 270
LEFT = 180
RIGHT = 0


class InitialSnake:

    def __init__(self):
        self.number_x = 0
        self.snake_first = []
        self.create_snake()
        self.actual_snake = self.snake_first[0]

    def create_snake(self):
        for number in range(3):
            snake = Turtle(shape="square")
            snake.penup()
            snake.color("white")
            snake.goto(self.number_x,0)
            self.number_x -= 20
            self.snake_first.append(snake)

    def move(self):
        for segments_num in range(len(self.snake_first) - 1,-1):
            self.snake_first[segments_num].goto(self.snake_first[segments_num - 1].xcor(),self.snake_first[segments_num - 1].ycor())
        self.snake_first[0].forward(MOVE_disTANCE)

    def up(self):
        if self.actual_snake.heading() != DOWN:
            self.snake_first[0].setheading(UP)
    def down(self):
        if self.actual_snake.heading() != UP:
            self.snake_first[0].setheading(DOWN)
    def left(self):
        if self.actual_snake.heading() != RIGHT:
            self.snake_first[0].setheading(LEFT)
    def right(self):
        if self.actual_snake.heading() != LEFT:
            self.snake_first[0].setheading(RIGHT)


my_screen = Screen()
my_screen.setup(width=600,height=600)
my_screen.bgcolor("black")
my_screen.title("Snake Game")
my_screen.tracer(0)
snake_1 = snake.InitialSnake()

#snake_here.create_snake()

game_is_on = True

my_screen.listen()
my_screen.onkey(snake_1.up,"Up")
my_screen.onkey(snake_1.down,"Down")
my_screen.onkey(snake_1.left,"Left")
my_screen.onkey(snake_1.right,"Right")

while game_is_on:
    my_screen.update()
    time.sleep(0.1)

    snake_1.move()


my_screen.exitonclick()

我并没有真正理解跟踪器和更新的概念以及它如何与睡眠功能相关联。我知道当跟踪器被调用关闭时,它不会刷新屏幕,直到您调用 update() 函数。但是它不应该在没有 time.sleep(0.1) 的情况下仍然工作,因为这只是在调用一个函数之前创建一个短暂的延迟。有人可以帮我理解这一点吗?提前致谢 (:

解决方法

如果使用 print() 查看蛇的位置

while game_is_on:
    my_screen.update()
    snake_1.move()

    print(snake_1.snake_first[0].ycor(),snake_1.snake_first[0].xcor())

然后你会看到它移动得非常非常快并且离开了屏幕——而你根本看不到它。

几毫秒后,在我非常旧的计算机上,它的位置是 (0,125700)。可能在最新的计算机上它会更有价值。

所以这段代码使用 sleep() 来减慢 snake 并在所有计算机上以相同的速度移动它。


顺便说一句:

我会使用 turtle 方法来重复代码

def game_loop():
    snake_1.move()
    my_screen.update()
    my_screen.ontimer(game_loop,100)  # repeate after 100ms (0.1s)

# start loop       
game_loop()

因为 sleep 可能会阻塞一些代码,而 ontimer 是为非阻塞延迟而创建的。