user3000345
user3000345

Reputation: 43

Losing a "life" won't go down after an error? pygame

And I don't know why??? Everything else seems to be working just fine.. but when you click the wrong "button" in the game the error sounds works and it resets the pattern, but the lives that I have put up (which is 3) doesn't go down at all. Wondering if anyone could help me out with this please? (I won't be pasting my entire code, but this is where the command happens and all). Also if you couldn't tell, I'm creating a memory game. If anyone could lead me into the right direction then that could be a big help for me. Thanks in advance!

def main():
    global FPSCLOCK, DISPLAYSURF, BASICFONT, BEEP1, BEEP2, BEEP3, BEEP4

    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    DISPLAYSURF = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption('Simulate')

    # font 
    BASICFONT = pygame.font.Font(None, 30)

    # load the sound files
    BEEP1 = pygame.mixer.Sound('beep1.wav')
    BEEP2 = pygame.mixer.Sound('beep2.wav')
    BEEP3 = pygame.mixer.Sound('beep3.wav')
    BEEP4 = pygame.mixer.Sound('beep4.wav')
    SOUNDTRACK = pygame.mixer.Sound('soundtrack.wav')
    ERROR = pygame.mixer.Sound('error.wav')

    # initialize some variables for a new game
    pattern = [] # stores the pattern of colors
    currentStep = 0 # the color the player must push next
    lastClickTime = 0 # timestamp of the player's last button push
    score = 0

    # plays the soundtrack music 
    SOUNDTRACK.play(-1, 0, 1000)

    # start-up screen
    text = BASICFONT.render('Press enter to play!', 1, WHITE)
    textRect = text.get_rect()
    textRect.centerx = DISPLAYSURF.get_rect().centerx
    textRect.y = 150
    DISPLAYSURF.blit(text, textRect)

    # update the screen
    pygame.display.update()

    # the "press enter" command
    waiting = True
    while waiting:      
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    waiting = False

    # when False, the pattern is playing. when True, waiting for the player to click a colored button:
    waitingForInput = False

    while True: # main game loop
        clickedButton = None # button that was clicked (set to YELLOW, RED, GREEN, or BLUE)
        DISPLAYSURF.fill(bgColor)
        drawButtons()

        # amount of lives
        lives = 3
        img = BASICFONT.render('I'*lives, 1, WHITE)
        livesRect = img.get_rect()
        livesRect.topleft = (10, 10)
        DISPLAYSURF.blit(img, livesRect)

        scoreSurf = BASICFONT.render('Score: ' + str(score), 1, WHITE)
        scoreRect = scoreSurf.get_rect()
        scoreRect.topleft = (WIDTH - 100, 10)
        DISPLAYSURF.blit(scoreSurf, scoreRect)      

        checkForQuit()
        for event in pygame.event.get(): # event handling loop
            if event.type == MOUSEBUTTONUP:
                mousex, mousey = event.pos
                clickedButton = getButtonClicked(mousex, mousey)

        if not waitingForInput:
            # play the pattern
            pygame.display.update()
            pygame.time.wait(1000)
            pattern.append(random.choice((YELLOW, BLUE, RED, GREEN)))
            for button in pattern:
                flashButtonAnimation(button)
                pygame.time.wait(FLASHDELAY)
            waitingForInput = True
        else:
            # wait for the player to enter buttons
            if clickedButton and clickedButton == pattern[currentStep]:
                # pushed the correct button
                flashButtonAnimation(clickedButton)
                currentStep += 1
                lastClickTime = time.time()

                if currentStep == len(pattern):
                    # pushed the last button in the pattern
                    score += 1
                    waitingForInput = False
                    currentStep = 0 # reset back to first step

            elif (clickedButton and clickedButton != pattern[currentStep]) or (currentStep != 0 and time.time() - TIMEOUT > lastClickTime):
                # pushed the incorrect button, or has timed out
                pattern = []
                currentStep = 0
                waitingForInput = False
                lives = lives - 1
                SOUNDTRACK.stop()
                ERROR.play()
                pygame.time.wait(1000)
                SOUNDTRACK.play(-1, 0, 1000)
                pygame.display.update()
                if lives < 1:               
                    gameOverAnimation()
                    # reset the variables for a new game:
                    pattern = []
                    currentStep = 0
                    waitingForInput = False
                    score = 0
                    pygame.time.wait(1000)

        pygame.display.update()
        FPSCLOCK.tick(FPS)    

Upvotes: 0

Views: 153

Answers (1)

svk
svk

Reputation: 5919

You set lives = 3 inside your main loop, instead of before it.

This means that you reset it to 3 on every iteration of the loop.

Upvotes: 2

Related Questions