为什么我需要此代码中的 time.sleep(x) 函数才能工作?
Why do I need the time.sleep(x) function in this code for it to work?
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, 0, -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
是为非阻塞延迟而创建的。
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, 0, -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
是为非阻塞延迟而创建的。