You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

问题根源

  1. screen.tracer()调用错误:未传入参数时,screen.tracer()仅返回当前追踪状态,并未关闭自动刷新,导致手动调用screen.update()时与自动刷新冲突。
  2. screen.update()调用时机错误:在tracking_movement的循环内逐段刷新,引发坐标计算混乱;主循环无延迟,导致程序运行过快,加剧坐标异常。
  3. 蛇移动顺序错误:先移动身体再移动蛇头,逻辑颠倒,导致身体段坐标覆盖异常。

修复后的代码

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()

修复说明

  1. 修正screen.tracer():传入0明确关闭自动刷新,仅通过screen.update()手动控制画面刷新。
  2. 调整刷新时机:将screen.update()移到主循环开头,每次循环统一刷新一次画面,避免多次刷新导致的混乱。
  3. 修正移动顺序:先移动蛇头,再让身体段跟进到前一段的位置,符合贪吃蛇的移动逻辑。
  4. 添加延迟:time.sleep(0.1)控制游戏速度,同时避免程序运行过快引发的坐标异常。

内容的提问来源于stack exchange,提问作者Jerry Chin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:25:08