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
相关产品推荐
相关产品推荐

