我在pygame中遇到问题

时间:2020-06-17 13:15:48

标签: python python-3.x pygame

我无法解决此问题。任何人都可以帮忙。我完全是个初学者。结果显示

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

2 个答案:

答案 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
   ...