我尝试将 screen.update() 转移到代码的不同部分,但问题仍然存在。但是,删除 screen.tracer(0) 和 screen.update() 可以解决该问题。但随着蛇的长度变长,如果没有 screen.update(),动画就会变得笨拙。
from turtle import Screen, Turtle
import time
screen = Screen()
screen.setup(width=600, height = 600)
screen.bgcolor("black")
screen.title("Snake Game")
snake_length = []
screen.tracer()
x, y = 0, 0
# TODO Setup initial snake body. Length = range(x)
for i in range(3):
snake_body = Turtle(shape="square")
snake_body.color("white")
snake_body.penup()
snake_body.teleport(x=x, y=y)
snake_body.speed("fastest")
snake_length.append(snake_body)
x -= 20
# TODO Moving the snake
def right(snake):
if snake.heading() == 90 or snake.heading() == 270:
snake.setheading(0)
print(snake.heading())
def left(snake):
if snake.heading() == 90 or snake.heading() == 270:
snake.setheading(180)
print(snake.heading())
def down(snake):
if snake.heading() == 0 or snake.heading() == 180:
snake.setheading(270)
def up(snake):
if snake.heading() == 0 or snake.heading() == 180:
snake.setheading(90)
蛇的移动功能。
def tracking_movement(snake_bodies):
cor_list = []
for i in snake_bodies:
x = i.xcor()
y = i.ycor()
temp_cor = [x, y]
cor_list.append(temp_cor)
# has 0, 1, 2
for i in range(1, len(snake_bodies)):
# 1 goes to 0, 2 goes to 1
snake_bodies[i].teleport(cor_list[i-1][0], cor_list[i-1][1])
screen.update()
print(i, snake_bodies[i].pos())
screen.listen()
screen.onkey(lambda: left(snake_length[0]), key="Left")
screen.onkey(lambda: right(snake_length[0]), key="Right")
screen.onkey(lambda: down(snake_length[0]), key="Down")
screen.onkey(lambda: up(snake_length[0]), key="Up")
game_is_on = True
while game_is_on:
tracking_movement(snake_length)
snake_length[0].forward(20)
screen.exitonclick()
一个快速而肮脏的补丁(否则遵循 ggorlen 给出的说明)将是:
from time import sleep
framesPerSecond=4
while game_is_on:
tracking_movement(Snake_segements)
Snake_segements[0].forward(20)
sleep(1/framesPerSecond)
下面是经过一些调整的完整代码,显示了代码的工作原理。它与蛇游戏的通常编程方式不同,因为它移动蛇身体的每个部分,从而产生良好的部分移动效果。通常,您只将尾部部分移到前面的位置,将所有其他部分保留在原处,因为所有部分都是白色的,所以这样做是可以的,但如果是彩色蛇,则不会这样做,因为这样做会改变颜色的顺序蛇的身体。您的代码保留该顺序。
from turtle import Screen, Turtle
import time
screen = Screen()
screen.setup(width=600, height = 600)
screen.bgcolor("black")
screen.title("Snake Game")
Snake_segements = []
screen.title("screen.tracer()")
screen.tracer()
x, y = 0, 0
Snake_segement_colors = ['#FFAAAA','#FFAAAA','#FFAAAA','lightgreen','yellow','yellow',
'white','lightgray', 'lightgreen','lightgray', 'yellow', 'white','lightgray', 'pink','lightgray',
'cyan','cyan', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue']
# TODO Setup initial snake body. Length = range(x)
for i in range(17):
snake_segment = Turtle(shape="square")
snake_segment.color(Snake_segement_colors[i])
snake_segment.penup()
#snake_segment.teleport(x=x, y=y)
snake_segment.goto(x=x, y=y)
snake_segment.speed("fastest")
Snake_segements.append(snake_segment)
x -= 20
# TODO Moving the snake
def right(snake):
if snake.heading() == 90 or snake.heading() == 270:
snake.setheading(0)
print(snake.heading())
def left(snake):
if snake.heading() == 90 or snake.heading() == 270:
snake.setheading(180)
print(snake.heading())
def down(snake):
if snake.heading() == 0 or snake.heading() == 180:
snake.setheading(270)
def up(snake):
if snake.heading() == 0 or snake.heading() == 180:
snake.setheading(90)
#Function for the movement of the snake.
def tracking_movement(Snake_segements):
cor_list = []
for segment in Snake_segements:
x = segment.xcor() if segment.xcor()<=300 else segment.xcor()-620
y = segment.ycor()
temp_cor = [x, y]
cor_list.append(temp_cor)
# has 0, 1, 2
for segment_index in range(1, len(Snake_segements)):
# 1 goes to 0, 2 goes to 1
#Snake_segements[i].teleport(cor_list[i-1][0], cor_list[i-1][1])
if cor_list[0][0] <=-300: Snake_segements[0].goto(cor_list[0][0],cor_list[0][1] )
Snake_segements[segment_index].goto(cor_list[segment_index-1][0], cor_list[segment_index-1][1])
screen.update()
print(segment_index, Snake_segements[segment_index].pos())
screen.listen()
screen.onkey(lambda: left(Snake_segements[0]), key="Left")
screen.onkey(lambda: right(Snake_segements[0]), key="Right")
screen.onkey(lambda: down(Snake_segements[0]), key="Down")
screen.onkey(lambda: up(Snake_segements[0]), key="Up")
game_is_on = True
from time import sleep
framesPerSecond=4
while game_is_on:
tracking_movement(Snake_segements)
Snake_segements[0].forward(20)
sleep(1/framesPerSecond)
screen.exitonclick()
为了加快代码的运行速度,并避免跳过分段移动的“动画”,请设置
tracer(0)
,因为无需将帧速率更改为更快的帧速率就可以了。