Reputation: 23
I have this task for uni. I've changed my code around over 3 times now and even adapted it to a working one. We have two modes: one where ghosts bounce off Pac-Man and the other where Pac-Man bounces off them. I know I could use lists to shorten this code but I'm still learning how to make them work right.
I get this error every time without fail and I really have no clue why so any advice would be great.
Traceback (most recent call last):
File "C:/", line 111, in <module>
mode_switch()
File "C:/", line 21, in mode_switch
blue_right, orange_right, pink_right,\
UnboundLocalError: local variable 'blue_right' referenced before assignment
import pygame
import pygame
from random import *
pygame.init()
def ghost_collision():
SCREAM.play()
pacman_velocity[0] = randint(-1,1)
pacman_velocity[1] = randint(-1,1)
if pacman_velocity[0] < 0:
pacman = pygame.image.load(PACMAN_LEFT).convert()
elif pacman_velocity[0] > 0:
pacman = pygame.image.load(PACMAN_RIGHT).convert()
return pacman_velocity
def mode_switch():
global mode
blue_right, orange_right, pink_right,\
red_right, blue, orange, pink, red
if mode == False:
mode = True
blue = pygame.image.load(GHOST_SCARED).convert()
orange = pygame.image.load(GHOST_SCARED).convert()
pink = pygame.image.load(GHOST_SCARED).convert()
red = pygame.image.load(GHOST_SCARED).convert()
else:
mode = False
if blue_right == True:
blue = pygame.image.load(BLUE_LEFT).convert()
blue_right = False
else:
blue = pygame.image.load(BLUE_RIGHT).convert()
blue_right = True
if orange_right == True:
orange = pygame.image.load(ORANGE_LEFT).convert()
orange_right = False
else:
orange = pygame.image.load(ORANGE_RIGHT).convert()
orange_right = True
if pink_right == True:
pink = pygame.image.load(PINK_LEFT).convert()
pink_right = False
else:
pink = pygame.image.load(PINK_RIGHT).convert()
pink_right = True
if red_right == True:
red = pygame.image.load(RED_LEFT).convert()
red_right = False
else:
red = pygame.image.load(RED_RIGHT).convert()
red_right = True
PACMAN_LEFT = 'pacman-left.png'
PACMAN_RIGHT = 'pacman-right.png'
BLUE_LEFT = 'blue-left.png'
BLUE_RIGHT = 'blue-right.png'
ORANGE_LEFT = 'orange-left.png'
ORANGE_RIGHT = 'orange-right.png'
PINK_LEFT = 'pink-left.png'
PINK_RIGHT = 'pink-right.png'
RED_LEFT = 'red-left.png'
RED_RIGHT = 'red-right.png'
GHOST_SCARED = 'vulnerable.png'
BOUNCE_SOUND = 'Thump.wav'
SOUND = pygame.mixer.Sound(BOUNCE_SOUND)
WIDTH = 800
HEIGHT = 600
BACKGROUND_COLOUR = 0, 0, 0
CAPTION = 'Random Pacman'
pacman_up = True#define image direction controlling variables
pacman_right = True
blue_right = False
orange_right = True
pink_right = False
red_right = True
mode = False
frame = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption(CAPTION)
pacman = pygame.image.load(PACMAN_RIGHT).convert()#create sprites and define boundaries
pacman_boundary = pacman.get_rect(center = (300,300))
pacman_velocity = [1, 1]
blue = pygame.image.load(BLUE_LEFT).convert()
blue_boundary = pacman.get_rect(center = (300,300))
blue_velocity = [-1, -1]
orange = pygame.image.load(ORANGE_RIGHT).convert()
orange_boundary = pacman.get_rect(center = (300,300))
orange_velocity = [1, -1]
pink = pygame.image.load(PINK_LEFT).convert()
pink_boundary = pacman.get_rect(center = (300,300))
pink_velocity = [-1, 1]
red = pygame.image.load(RED_RIGHT).convert()
red_boundary = pacman.get_rect(center = (300,300))
red_velocity = [1, 1]
finished = False
while not finished:
pygame.event.pump()
for event in pygame.event.get():
if event.type == pygame.QUIT:
finished = True
if event.type == pygame.MOUSEBUTTONUP:
mode_switch()
#####################################################
if pacman_boundary.left < 0 or pacman_boundary.right > WIDTH:
SOUND.play()
pacman_velocity[0] = -1 * pacman_velocity[0]
if pacman_velocity[0] < 0:
pacman = pygame.image.load(PACMAN_LEFT).convert()
elif pacman_velocity[0] > 0:
pacman = pygame.image.load(PACMAN_RIGHT).convert()
pacman_velocity[1] = randint(-1,1)
if pacman_boundary.top < 0 or pacman_boundary.bottom > HEIGHT:
SOUND.play()
pacman_velocity[1] = -1 * pacman_velocity[1]
if mode == False:
if pacman_boundary.colliderect(blue_boundary)\
or pacman_boundary.colliderect(orange_boundary)\
or pacman_boundary.colliderect(pink_boundary)\
or pacman_boundary.colliderect(red_boundary):
ghost_collision()
#####################################################
if blue_boundary.left < 0 or blue_boundary.right > WIDTH:
blue_velocity[0] = -1 * blue_velocity[0]
if mode == False:
if blue_right == True:
blue = pygame.image.load(BLUE_LEFT).convert()
blue_right = False
else:
blue = pygame.image.load(BLUE_RIGHT).convert()
blue_right = True
if blue_boundary.top < 0 or blue_boundary.bottom > HEIGHT:
SOUND.play()
blue_velocity[1] = -1 * blue_velocity[1]
if mode == True:
if pacman_boundary.colliderect(blue_boundary):
blue_velocity[0] = randint(-1,1)
blue_velocity[1] = randint(-1,1)
#####################################################
if orange_boundary.left < 0 or orange_boundary.right > WIDTH:
orange_velocity[0] = -1 * orange_velocity[0]
if mode == False:
if orange_right == True:
orange = pygame.image.load(ORANGE_LEFT).convert()
orange_right = False
else:
orange = pygame.image.load(ORANGE_RIGHT).convert()
orange_right = True
if orange_boundary.top < 0 or orange_boundary.bottom > HEIGHT:
SOUND.play()
orange_velocity[1] = -1 * orange_velocity[1]
if mode == True:
if pacman_boundary.colliderect(orange_boundary):
orange_velocity[0] = randint(-1,1)
orange_velocity[1] = randint(-1,1)
#####################################################
if pink_boundary.left < 0 or pink_boundary.right > WIDTH:#
pink_velocity[0] = -1 * pink_velocity[0]
if mode == False:
if pink_right == True:
pink = pygame.image.load(PINK_LEFT).convert()
pink_right = False
else:
pink = pygame.image.load(PINK_RIGHT).convert()
pink_right = True
if pink_boundary.top < 0 or pink_boundary.bottom > HEIGHT:
SOUND.play()
pink_velocity[1] = -1 * pink_velocity[1]
if mode == True:
if pacman_boundary.colliderect(pink_boundary):
pink_velocity[0] = randint(-1,1)
pink_velocity[1] = randint(-1,1)
#####################################################
if red_boundary.left < 0 or red_boundary.right > WIDTH:
red_velocity[0] = -1 * red_velocity[0]
if mode == False:
if red_right == True:
red = pygame.image.load(RED_LEFT).convert()
red_right = False
else:
red = pygame.image.load(RED_RIGHT).convert()
red_right = True
if red_boundary.top < 0 or red_boundary.bottom > HEIGHT:
SOUND.play()
red_velocity[1] = -1 * red_velocity[1]
if mode == True:
if pacman_boundary.colliderect(red_boundary):
red_velocity[0] = randint(-1,1)
red_velocity[1] = randint(-1,1)
#####################################################
pacman_boundary = pacman_boundary.move(pacman_velocity)
blue_boundary = blue_boundary.move(blue_velocity)
orange_boundary = orange_boundary.move(orange_velocity)
pink_boundary = pink_boundary.move(pink_velocity)
red_boundary = red_boundary.move(red_velocity)
frame.fill(BACKGROUND_COLOUR)
frame.blit(pacman, pacman_boundary)
frame.blit(blue, blue_boundary)
frame.blit(orange, orange_boundary)
frame.blit(pink, pink_boundary)
frame.blit(red, red_boundary)
pygame.display.flip()
pygame.quit()
Upvotes: 2
Views: 845
Reputation:
blue_right, orange_right, pink_right,\
red_right, blue, orange, pink, red
This line is clearly broken. At least the 'global' statement of the former line has no effect here. Likely you are missing the trailing '\' in the line with the global statement or the corresponding line needs its own global statement.
Upvotes: 1
Reputation: 29121
Think that the problem is in the following lines:
def mode_switch():
global mode
blue_right, orange_right, pink_right,\
red_right, blue, orange, pink, red
You defined mode as a global, but not the rest of variables that looks to be global at your program, e.g you need to update them to be global too - since you are modifying them inside your mode_switch function
Upvotes: 3