Python贪吃蛇screen.update()致Xcor异常跳至700k问题求助
贪吃蛇游戏turtle库screen.update()导致X坐标异常问题解决
问题描述
开发基于turtle库的贪吃蛇游戏时,加入screen.update()后,蛇身X坐标会异常跳至700k级别。尝试调整screen.update()的位置无法解决问题;移除screen.tracer(0)和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 # 初始化蛇身 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 # 方向控制函数 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) for i in range(1, len(snake_bodies)): 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()
问题根源
screen.tracer()调用错误:未传入参数时,screen.tracer()仅返回当前追踪状态,并未关闭自动刷新,导致手动调用screen.update()时与自动刷新冲突。screen.update()调用时机错误:在tracking_movement的循环内逐段刷新,引发坐标计算混乱;主循环无延迟,导致程序运行过快,加剧坐标异常。- 蛇移动顺序错误:先移动身体再移动蛇头,逻辑颠倒,导致身体段坐标覆盖异常。
修复后的代码
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(0) # 明确关闭自动刷新 x, y = 0, 0 # 初始化蛇身 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 # 方向控制函数 def right(snake): if snake.heading() == 90 or snake.heading() == 270: snake.setheading(0) def left(snake): if snake.heading() == 90 or snake.heading() == 270: snake.setheading(180) 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 = [(body.xcor(), body.ycor()) for body in snake_bodies] # 身体段依次移动到前一段的位置 for i in range(1, len(snake_bodies)): snake_bodies[i].teleport(cor_list[i-1][0], cor_list[i-1][1]) 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: screen.update() # 统一刷新画面 time.sleep(0.1) # 控制移动速度,避免过快 snake_length[0].forward(20) # 先移动蛇头 tracking_movement(snake_length) # 再让身体跟进 screen.exitonclick()
修复说明
- 修正
screen.tracer():传入0明确关闭自动刷新,仅通过screen.update()手动控制画面刷新。 - 调整刷新时机:将
screen.update()移到主循环开头,每次循环统一刷新一次画面,避免多次刷新导致的混乱。 - 修正移动顺序:先移动蛇头,再让身体段跟进到前一段的位置,符合贪吃蛇的移动逻辑。
- 添加延迟:
time.sleep(0.1)控制游戏速度,同时避免程序运行过快引发的坐标异常。
内容的提问来源于stack exchange,提问作者Jerry Chin
相关产品推荐
相关产品推荐

