Python pygame中定义的变量抛出错误

Python pygame中定义的变量抛出错误,python,pygame,Python,Pygame,我正在做我的第一个pygame项目,这是一个迷宫项目。当精灵触到蓝色时,它应该打印出“赢”。但当它触及蓝色时,它会打印出许多胜利。所以,我添加了一个WIN变量来记录玩家已经赢了。但这是说韩元没有定义!请帮忙。我在下面给出我的代码 import pygame import keyboard pygame.init() img = pygame.image.load('maze.jpg') spr=pygame.image.load('C:/Users/abhijato chatterjee.LAP

我正在做我的第一个pygame项目,这是一个迷宫项目。当精灵触到蓝色时,它应该打印出“赢”。但当它触及蓝色时,它会打印出许多胜利。所以,我添加了一个WIN变量来记录玩家已经赢了。但这是说韩元没有定义!请帮忙。我在下面给出我的代码

import pygame
import keyboard
pygame.init()
img = pygame.image.load('maze.jpg')
spr=pygame.image.load('C:/Users/abhijato chatterjee.LAPTOP-F4VMRK00/Desktop/my 
folder/programs/python/pygame/Mushroom expansion/PNG/tallShroom_red.png')
screen = pygame.display.set_mode((640, 480))
screen.fill((255,255,255))
pygame.mixer.init()
q=False
won=False
class Players(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image=spr
        self.image.set_colorkey((255,255,255))
        self.rect=self.image.get_rect()
        self.rect.bottomleft=(30,460)
    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 2
        if keys[pygame.K_RIGHT]:
            self.rect.x += 2
        if keys[pygame.K_UP]:
            self.rect.y -= 2
        if keys[pygame.K_DOWN]:
            self.rect.y += 2
        r,g,b = screen.get_at((self.rect.bottomright[0], self.rect.bottomright[1]))[:3]
        listz=[r,g,b]
        r,g,b = screen.get_at((self.rect.bottomleft[0], self.rect.bottomleft[1]))[:3]
        listy=[r,g,b]
        r,g,b = screen.get_at((self.rect.center[0], self.rect.center[1]))[:3]
        listx=[r,g,b]
        r,g,b = screen.get_at((self.rect.right, self.rect.y))[:3]
        listw=[r,g,b]
        r,g,b = screen.get_at((self.rect.topleft[0], self.rect.topleft[1]))[:3]
        listv=[r,g,b]
        r,g,b = screen.get_at((self.rect.topright[0], self.rect.topright[1]))[:3]
        listu=[r,g,b]
    if listz==[0,0,0] or listy==[0,0,0] or listx==[0,0,0] or listw==[0,0,0] or listv==[0,0,0] or 
listu==[0,0,0]:
            self.rect.bottomleft=(30,460)
        if won==False:
            if listz[0]<21 and listz[1]>142 and listz[1]<184 and listz[2]>212 and listz[2]<254:
                print("you win!!!")
            elif listx[0]<21 and listx[1]>142 and listx[1]<184 and listx[2]>212 and listx[2]<254:
                print("you win!!!")
            elif listw[0]<21 and listw[1]>142 and listw[1]<184 and listw[2]>212 and listw[2]<254:
                print("you win!!!")
            elif listv[0]<21 and listv[1]>142 and listv[1]<184 and listv[2]>212 and listv[2]<254:
                print("you win!!!")
            elif listy[0]<21 and listy[1]>142 and listy[1]<184 and listy[2]>212 and listy[2]<254:
                print("you win!!!")
            elif listu[0]<21 and listu[1]>142 and listu[1]<184 and listu[2]>212 and listu[2]<254:
                print("you win!!!")
            won=True
player=Players()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)
clock = pygame.time.Clock()
while q==False:
    screen.blit(img,(0, 0))
    pygame.display.update() 
    all_sprites.update()
    all_sprites.draw(screen)
    pygame.display.flip()
    clock.tick(30)
    for event in pygame.event.get() :
        if event.type == pygame.QUIT : 
            q=True
            pygame.quit()
导入pygame
输入键盘
pygame.init()
img=pygame.image.load('maze.jpg')
spr=pygame.image.load('C:/Users/abhijato chatterjee.LAPTOP-F4VMRK00/Desktop/my
文件夹/programs/python/pygame/蘑菇扩展/PNG/tallShroom\u red.PNG')
screen=pygame.display.set_模式((640480))
屏幕填充((255255))
pygame.mixer.init()
q=错误
韩元=假
职业玩家(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=spr
self.image.set_colorkey((255255))
self.rect=self.image.get_rect()
self.rect.bottomleft=(30460)
def更新(自我):
keys=pygame.key.get_pressed()
如果键[pygame.K_左]:
自校正x-=2
如果键[pygame.K_RIGHT]:
self.rect.x+=2
如果键[pygame.K_UP]:
自校正y-=2
如果键[pygame.K_DOWN]:
自校正y+=2
r、 g,b=screen.get_at((self.rect.bottomright[0],self.rect.bottomright[1])[:3]
listz=[r,g,b]
r、 g,b=screen.get_at((self.rect.bottomleft[0],self.rect.bottomleft[1])[:3]
listy=[r,g,b]
r、 g,b=screen.get_at((self.rect.center[0],self.rect.center[1])[:3]
listx=[r,g,b]
r、 g,b=screen.get_at((self.rect.right,self.rect.y))[:3]
listw=[r,g,b]
r、 g,b=screen.get_at((self.rect.topleft[0],self.rect.topleft[1])[:3]
listv=[r,g,b]
r、 g,b=screen.get_at((self.rect.topright[0],self.rect.topright[1])[:3]
listu=[r,g,b]
如果listz=[0,0,0]或listy=[0,0,0]或listx=[0,0,0]或listw=[0,0,0]或listv=[0,0,0]或
listu==[0,0,0]:
self.rect.bottomleft=(30460)
如果赢==假:

如果listz[0]142和listz[1]212以及listz[2]
wow
是一个全局变量。必须使用访问全局命名空间中的变量:

won=False
职业玩家(pygame.sprite.sprite):
# [...]
def更新(自我):
环球赢
# [...]
如果赢==假:
# [...]
韩元=真

实际上,
global
关键字不是用来读取全局范围变量的值的。没有它,它会读得很好。只有当您试图编写它时,您才会遇到范围问题。如果尝试写入全局范围变量,它将创建一个局部范围变量,该变量将隐藏更高范围的变量,并且不会对全局变量进行更改。
global
告诉它不要这样做,并更新全局变量。

实际上
global
关键字不是用来读取全局范围变量的值的。没有它,它会读得很好。只有当您试图编写它时,您才会遇到范围问题。如果尝试写入全局范围变量,它将创建一个局部范围变量,该变量将隐藏更高范围的变量,并且不会对全局变量进行更改。
global
告诉它不要这样做,并更新全局变量。作为对OP的提示,pylint捕捉到并抱怨了这种意外隐藏。@GlennMackintosh是的,但当函数的代码中有对同一变量名的赋值时,默认情况下全局变量是不可读的,以避免在第一次迭代读取全局变量时和在写入局部变量后的下一次迭代中混淆,“全局”不再可用。@PavelShishmarev您是对的。我很肯定拉比76也了解这些事情。我的目的是防止其他对作用域层次结构了解较少的人被他的回答中的原始语句所迷惑:“您必须使用全局语句来读取全局命名空间中的变量”。他更新了他的答案,这很好。我会删除我的评论,因为它是不必要的,但这将使您的评论没有上下文挂起。也许我们应该把这三个都删除,因为答案现在是独立的了?我不太清楚这方面的协议。
Traceback (most recent call last):

  File "C:\Users\abhijato chatterjee.LAPTOP-F4VMRK00\Desktop\my folder\programs\python\pygame\maze.py", line 68, in <module>
    all_sprites.update()

  File "C:\Users\abhijato chatterjee.LAPTOP-F4VMRK00\anaconda3\lib\site-packages\pygame\sprite.py", line 463, in update
    s.update(*args)

  File "C:\Users\abhijato chatterjee.LAPTOP-F4VMRK00\Desktop\my folder\programs\python\pygame\maze.py", line 42, in update
    if won==False:

UnboundLocalError: local variable 'won' referenced before assignment