当我包含 screen.update() 时,Xcor 跳到 700k

问题描述 投票:0回答:1

我尝试将 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()
python turtle-graphics python-turtle
1个回答
0
投票

一个快速而肮脏的补丁(否则遵循 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)
,因为无需将帧速率更改为更快的帧速率就可以了。

slow

© www.soinside.com 2019 - 2024. All rights reserved.