这是我的基本随机运动程序,立方体每次向下和向右,都会沿着不同的距离向下和向右运行。你知道吗
在编写程序时,我收到了以下错误消息: UnboundLocalError:赋值前引用了局部变量“wantedcordx” 和 UnboundLocalError:赋值前引用了局部变量“wantedcordy”
我通过使函数中的两个变量都是全局变量解决了这个问题,但不知道为什么必须这样做,也不知道为什么这样做:
程序如下:(写得不太好,我是个乞丐)
import pygame,sys,random
from pygame.locals import *
#colours
red =(255,0,0)
white=(255,255,255)
#variables/objects
x = 50
y = 50
FPS = 60
clock =pygame.time.Clock()
screen = pygame.display.set_mode((800,600))
xcord = random.randint(1,100)
ycord = random.randint(1,100)
newcords_needed = False
run_once = False
def get_newcords():
global x,y
global run_once
global newcords_needed
wantedcordx
global wantedcordy
if run_once == False:
xcord = random.randint(1, 100)
ycord = random.randint(1, 100)
wantedcordy = (y + ycord)
wantedcordx = (x + xcord)
run_once = True
print(wantedcordx)
if newcords_needed == True:
xcord = random.randint(1,100)
ycord = random.randint(1,100)
wantedcordy = (y + ycord)
wantedcordx = (x + xcord)
newcords_needed = False
if x != wantedcordx:
x_done = False
x +=1
elif x == wantedcordx:
x_done = True
if x_done == True:
if y != wantedcordy:
y +=1
elif y == wantedcordy:
y_done = True
newcords_needed = True
return (x,y)
while True:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
get_newcords()
screen.fill(white)
pygame.draw.rect(screen, red, [x,y,20,20])
pygame.display.update()
它从来没有复制和粘贴正确,但我尽我所能重新格式化它。你知道吗
查看Python的官方编程文档FAQ,特别是关于“当变量有值时为什么会出现UnboundLocalError?”:https://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value
紧接着的问题涉及到为什么以及在哪里需要“全球”,这可能对你也有帮助。你知道吗
简而言之,在Python语言中,允许“隐式”访问全局定义是一种选择(这意味着在大多数情况下这是一种安全的假设),但是更改它们的能力需要显式使用“global”关键字。限制是提醒您,您正在修改可能共享的内容(即全局),如果您不注意,可能会在代码的其他部分引入意外的副作用。他们不需要“全球”来获取价值的唯一原因是,由此产生的“混乱将破坏全球宣言在确定副作用方面的有用性”
应该注意的是,在许多场景中使用globals被认为是不好的做法,而不仅仅是在Python中,Python中的理想解决方案通常是使用模块提供的名称空间系统。这在我链接到您的常见问题部分中有更详细的介绍。然而,当开发一个简单的游戏时,它通常是有用的(实用的?)在任何给定的时刻,将一组globals作为“一个真正的真理之源”代表世界的状态,代码的大部分都可以访问。你知道吗
在
def get_newcords()
中,如果run_once == True
和newcords_needed == False
,则第一次访问变量wantedcordx
的时间如下:因为在这种情况下,第一次访问它是通过读访问,所以会得到“undefined variable”,除非像以前一样定义它为全局变量。你知道吗
(同样适用于
wantedcordy
)定义它们
global
具有以下效果:因为在函数的第一次调用时,您将wantedcordx
赋值给某个对象,所以它在下一次函数调用中仍然有效。你知道吗相关问题 更多 >
编程相关推荐