我无法解决此问题。任何人都可以帮忙。我完全是个初学者。结果显示
File "C:/Users/y/PycharmProjects/learn1/haha.py", line 72, in <module>
gameloop()
File "C:/Users/y/PycharmProjects/learn1/haha.py", line 58, in gameloop
cow.cow()
UnboundLocalError: local variable 'cow' referenced before assignment
我需要帮助。请随意评估我的代码技能。 我正在尝试建造自己的隐形牛,那真是太酷了。 我已经尝试解决此问题,但无法解决。因此,我需要您的帮助plz.please告诉我问题出在哪里。谢谢
import pygame
pygame.init()
screen = pygame.display.set_mode((960, 600))
white = (255, 255, 255)
pygame.display.set_caption('Invisible Cow')
cow_image = pygame.image.load(r'C:\Users\y\Pictures\cow5.jpg')
class Cow(object):
def __init__(self, x=0, y=0):
dist = 0
self.image = pygame.image.load(r'C:\Users\y\Pictures\cow5.jpg')
self.x = x
self.y = y
self.dist = dist
def cow(self):
self.x = x
def cow_draw(self, surface):
surface.blit(self.image, (self.x, self.y))
import random
y = random.randint(0, 600)
x = random.randint(0, 960)
cow = Cow(x, y)
cow.cow()
clock = pygame.time.Clock()
def gameloop():
game_over = False
game_close = False
while not game_over :
screen.fill(white)
while game_close == True:
dis.fill(blue)
message("You Lost! Press C-Play Again or Q-Quit", red)
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameloop()
if event.type == pygame.QUIT:
pygame.quit()
quit()
cow.cow()
if cow.x < 0:
y = random.randint(0, 600)
x = random.randint(0, 960)
cow = Cow(x, y)
screen.fill((255, 255, 255))
cow.cow_draw(screen)
if pygame.mouse.get_pressed()[0]:
game_close
pygame.display.update()
clock.tick(40)
gameloop()
'''
答案 0 :(得分:2)
目前尚不清楚您的程序做什么,但是收到错误消息的原因是因为您在cow = Cow(x, y)
块中实例化了if
,但是您正在调用cow.cow_draw(screen)
,这是if
块运行之前if语句之外的该实例的方法。如此有效,发生的事情是您尝试不首先实例化就调用该方法。要解决此问题,您可以简单地将cow.cow_draw(screen)
移动到if块内。
我要指出的是,由于您正在创建Cow
的其他实例,因此使用与第一个名字不同的名称(也许是cow1
)更有意义吗?
if cow.x < 0:
y = random.randint(0, 600)
x = random.randint(0, 960)
cow1 = Cow(x, y)
screen.fill((255, 255, 255))
cow1.cow_draw(screen)
这将消除错误。另外,我注意到了其他一些事情。首先,通常在顶部定义所有import
。其次,您两次致电pygame.image.load(r'C:\Users\y\Pictures\cow5.jpg')
。取而代之的是,您只需定义一次并多次使用即可。所以您的课程可能像这样:
class Cow(object):
def __init__(self, img, x=0, y=0):
dist = 0
self.image = img
self.x = x
self.y = y
self.dist = dist
在创建实例时,您可以将image变量作为第一个参数传递。
cow = Cow(cow_image, 10, 10)
答案 1 :(得分:0)
这是一个范围问题。您需要在global
函数中的变量cow
上使用gameloop()
关键字。修复已结束,但首先我将解释问题。
在您的gameloop()
函数中,有以下行:
cow = Cow(x, y)
只要在函数中有赋值,就会导致python确定您要在该函数内使用局部作用域变量,除非先前已使用global关键字将其表示为global
。一旦确定存在具有该名称的局部变量,就假定该函数中所有对该变量的访问(甚至在赋值之前)都引用了该局部变量。这意味着该局部变量将隐藏任何具有相同名称的全局变量,并且即使从中读取该名称的作用域更高的全局变量也不可见。
这意味着在该函数中,当您尝试执行cow.cow()
时,它表示尚未初始化本地cow变量,因为它尚未初始化。
如果您希望能够在函数内更改全局范围的变量,则必须使用global
关键字来告诉它。将此添加到gameloop()
函数的顶部:
def gameloop():
global cow
...