David David - 6 months ago 20
Python Question

Error with global variable

Whenever I start my game and it loads my menu I get the error "SyntaxWarning: name 'finishes' is assigned to before global declaration". How do I fix this? I doesn't disrupt my game but any error should be fixed. I have cut down the below code to just show the essential code.

def load_level(level):
walls = []
players = []
finishes = []
x = y = 0
for row in levels[level]:
for col in row:
if col == "W":
walls.append(Wall((x, y)))
if col == "P":
players.append(Player((x, y)))
if col == "F":
finishes.append(Finish1((x, y)))
if col == "G":
finishes.append(Finish2((x, y)))
if col == "H":
finishes.append(Finish3((x, y)))
if col == "I":
finishes.append(Finish4((x, y)))
x += 40.96
y += 30.72
x = 0
return walls, players, finishes

walls, players, finishes = load_level(currentLevel)

def Menu():
runnin = True
while runnin:
clock.tick(60)
screen.fill(BLACK)
mouseclick = pygame.mouse.get_pressed()
for e in pygame.event.get():
if e.type == pygame.QUIT:
pygame.quit()
sys.exit(0)
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit(0)
for option in options:
if option.rect.collidepoint(pygame.mouse.get_pos()):
option.hovered = True
if mouseclick[0] == 1:
if option.text == "Easy":
global currentlevel, walls, players, finishes
walls, players, finishes = load_level(0)
currentlevel = 0
main()
elif option.text == "Medium":
global currentlevel, walls, players, finishes
walls, players, finishes = load_level(1)
currentlevel = 1
main()
elif option.text == "Hard":
global currentlevel, walls, players, finishes
walls, players, finishes = load_level(2)
currentlevel = 2
main()
elif option.text == "Help":
Help()
else:
runnin = False
else:
option.hovered = False
option.draw()
screen.blit(title_font.render("Amazeing Race", True, GREY), (130, 50))
pygame.display.update()
pygame.quit()
sys.exit(0)

Answer

The problem here is that you are declaring global on variables more than once. Globals should be declared at the start of the function. Read more here. To solve this, simply move global currentlevel, walls, players, finishes to the top of your function like so:

def Menu():
    global currentlevel, walls, players, finishes
    runnin = True
    # more code...