问题描述
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
是为非阻塞延迟而创建的。