Search code examples
pythonpygamegame-developmentmu

Game crashing when player2 collides with money. Error message: unboundLocalError: local variable 'score2' referenced before assignment


import random

WIDTH = 800
HEIGHT = 500

background = Actor("background")
player = Actor("player")
enemy = Actor("enemy")
money = Actor("money", pos=(300,300))
player2 = Actor("alien")
score = 0
score2 = 0
player.x = 200
player.y = 200
player2.x= 400
player2.y= 400

def draw():
    screen.clear()
    background.draw()
    player.draw()
    enemy.draw()
    money.draw()
    player2.draw()

def update():
    global score
    if keyboard.right:
        player.x = player.x + 4
    if keyboard.left:
        player.x = player.x - 4
    if keyboard.down:
        player.y = player.y + 4
    if keyboard.up:
        player.y = player.y - 4

    if player.x > WIDTH:
        player.x = WIDTH
    if player.x < 0:
        player.x = 0
    if player.y < 0:
        player.y = 0
    if player.y > HEIGHT:
        player.y = HEIGHT

    if keyboard.d:
        player2.x = player2.x + 4
    if keyboard.a:
        player2.x = player2.x - 4
    if keyboard.s:
        player2.y = player2.y + 4
    if keyboard.w:
        player2.y = player2.y - 4
    if player.colliderect(player2):
        exit()

    if player2.x > WIDTH:
        player2.x = WIDTH
    if player2.x < 0:
        player2.x = 0
    if player2.y < 0:
        player2.y = 0
    if player2.y > HEIGHT:
        player2.y = HEIGHT

    dx1, dy1 = player.x - enemy.x, player.y - enemy.y
    dx2, dy2 = player2.x - enemy.x, player2.y - enemy.y
    dist1sq = dx1*dx1 + dy1*dy1
    dist2sq = dx2*dx2 + dy2*dy2 

    player_near = player if dist1sq < dist2sq else player2

    if enemy.x < player_near.x:
        enemy.x += 1
    if enemy.x > player_near.x:
        enemy.x -= 1
    if enemy.y < player_near.y:
        enemy.y += 1
    if enemy.y > player_near.y:
        enemy.y -= 1
    if player.colliderect(enemy):
        exit()
    if player2.colliderect(enemy):
        exit()

    if money.colliderect(player):
        money.x = random.randint(0, WIDTH)
        money.y = random.randint(0, HEIGHT)
        score = score + 1

    if money.colliderect(player2):
        money.x = random.randint(0, WIDTH)
        money.y = random.randint(0, HEIGHT)
        score2 += 1

    if keyboard.d:
        player2.x = player2.x + 4
    if keyboard.a:
        player2.x = player2.x - 4
    if keyboard.s:
        player2.y = player2.y + 4
    if keyboard.w:
        player2.y = player2.y - 4
    if player.colliderect(player2):
        exit()

    if player2.x > WIDTH:
        player2.x = WIDTH
    if player2.x < 0:
        player2.x = 0
    if player2.y < 0:
        player2.y = 0
    if player2.y > HEIGHT:
        player2.y = HEIGHT

This is a python game made in mu editor. Whenever player2 collides with money, player2 is supposed to collect it and gain score. Whenever player2 is colliding with money, it crashes the game and it gives me an error saying this Error Message: UnboundLocalError: local variable 'score2' referenced before assignment.


Solution

  • You missed to declare gloabl score2:

    def update():
        global score, score2 # <----
    
        # [...]
    
        if money.colliderect(player2):
            money.x = random.randint(0, WIDTH)
            money.y = random.randint(0, HEIGHT)
            score2 += 1
    

    Note, if you don't declare score2 as a global variable, then scope2 is assumed to be a variable in scope of update, because the variable is set in score2 += 1. But, the statement score2 += 1 causes an exception, because it tries to read the variabel before it is defined.