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

Python贪吃蛇游戏报错UnboundLocalError: pos未赋值即引用求解

帮你排查贪吃蛇游戏的错误

嘿,我来帮你解决这个问题!首先看你遇到的UnboundLocalError: local variable 'pos' referenced before assignment,不过你贴的代码里虽然定义了全局pos,但完全没用到它——会不会是你之前的代码版本里用到了pos,但更新代码的时候漏了相关部分?不过先处理当前代码里明显的错误,这些问题也可能引发异常,导致后续奇怪的报错:

1. 先修复ball_move里的两个致命错误

  • 第一个错误:head.distance("food"):你这里传了字符串"food",但turtle的distance()方法需要传入一个turtle.Turtle对象,应该改成head.distance(food)(直接用你定义的food变量)
  • 第二个错误:random.randit拼写错了:正确的函数名是random.randint(最后一个字母是t,不是i),这个拼写错误会直接触发AttributeError,导致程序崩溃

2. 关于pos变量的错误排查

如果确实是pos引发的UnboundLocalError,那大概率是你在某个函数内部使用pos时,没有声明它是全局变量。举个例子:
如果你的函数里是这么写的:

def some_func():
    print(pos)  # Python会把pos当成局部变量,但这里还没赋值,直接报错
    pos = (100, 200)

解决方法很简单:在函数开头加一句global pos,告诉Python这个变量是全局的,不是局部的:

def some_func():
    global pos
    print(pos)
    pos = (100, 200)

这样Python就不会把它当成局部变量,也就不会报“引用前未赋值”的错误了。

3. 修复后的完整代码

我把你代码里的错误都修正了,还加了个小优化(重复的wn.listen()只需要调用一次),你可以直接运行试试:

import turtle
import time
import random
# 全局pos如果后续要使用,记得在操作它的函数里加global声明
global pos
delay = 0.1
wn = turtle.Screen()
wn.title("Snake")
wn.bgcolor("purple")
wn.setup(width=600, height=600)
head=turtle.Turtle()
head.speed(0)
head.shape("square")
head.color("orange")
head.penup()
head.goto(0, 0)
head.direction = "stop"
def move():
    if head.direction == "up":
        y = head.ycor()
        head.sety(y + 20)
    if head.direction == "down":
        y = head.ycor()
        head.sety(y - 20)
    if head.direction == "left":
        x = head.xcor()
        head.setx(x - 20)
    if head.direction == "right":
        x = head.xcor()
        head.setx(x + 20)
food = turtle.Turtle()
food.speed(0)
food.shape("circle")
food.color("green")
food.penup()
food.goto(-110, 70)
def ball_move():
    # 修复:传入food对象而非字符串
    if head.distance(food) < 20:
        # 修复:randit改为randint
        x = random.randint(-290, 290)
        y = random.randint(-290, 290)
        food.goto(x, y)
def go_up():
    head.direction = "up"
def go_down():
    head.direction = "down"
def go_left():
    head.direction = "left"
def go_right():
    head.direction = "right"
# 只需要调用一次listen即可,不用重复调用
wn.listen()
wn.onkey(go_up, "Up")
wn.onkey(go_down, "Down")
wn.onkey(go_left, "Left")
wn.onkey(go_right, "Right")
while True:
    wn.update()
    move()
    ball_move()
    time.sleep(delay)
turtle.mainloop()

如果之后还是遇到pos相关的错误,记得检查所有用到pos的函数,只要在函数里对pos进行赋值操作,就必须先声明global pos,如果只是读取的话,不需要声明,但赋值一定要加哦!

内容的提问来源于stack exchange,提问作者Bogdan Cosmin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:05