У меня проблема в pygame - PullRequest
       1

У меня проблема в pygame

0 голосов
/ 17 июня 2020

Я не могу решить эту проблему. Может ли кто-нибудь помочь. Я полностью новичок. Результат показывает:

  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

Мне нужна помощь. Не стесняйтесь использовать мои навыки программирования. Я пытаюсь построить свою собственную невидимую корову. Это действительно классная игра. Я пытаюсь решить проблему, но не могу ее исправить. Поэтому мне нужна ваша помощь, пожалуйста. прокомментируйте, в чем проблема. спасибо

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 ]

2 голосов
/ 17 июня 2020

Неясно, что делает ваша программа, но вы получаете сообщение об ошибке потому, что вы создаете экземпляр 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

И при создании экземпляра вы можете передать переменную изображения в качестве первого аргумента.

cow = Cow(cow_image, 10, 10)
0 голосов
/ 17 июня 2020

Это проблема определения объема. Вам необходимо использовать ключевое слово global для переменной cow в вашей функции gameloop(). Исправление находится в конце, но сначала я объясню проблему. это заставляет python определять, что вы хотите иметь переменную локальной области внутри этой функции, если она ранее не была указана как global с помощью глобального ключевого слова. Как только он решает, что существует локальная переменная с таким именем, предполагается, что все обращения к этой переменной в функции (даже до присвоения) ссылаются на эту локальную переменную. Это означает, что эта локальная переменная скрывает любую глобальную переменную с тем же именем, а глобальная переменная с более высокой областью видимости с этим именем не видна даже для чтения.

Это означает, что в этой функции, когда вы пытаетесь выполнить cow.cow() он говорит, что локальная переменная коровы еще не инициализирована, потому что это не так.

Если вы хотите иметь возможность изменять глобальную переменную внутри своей функции, вы должны сообщить об этом используя ключевое слово global. Добавьте это вверху своей функции gameloop():

def gameloop():
   global cow
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...