Search code examples
pythonpygamedrawpgzero

The draw() function in my quiz game is not working properly


Ok, so I'm making a quiz game using python. I have it so that when your mouse hovers over one of the options, it changes color. However, there are two problems that are occurring when I try to do it.

  1. Only answer_box4 actually somewhat changes the color when I hover over it.
  2. When I hover my mouse over answer_box4, it changes the color of all the boxes.

Here is the code:

     try:
        logname = 'c:/temp/pgzrun.log'
        fontname = 'arial.ttf'
    
        import faulthandler
        faulthandler.enable()
        
        import os, sys
        
        script_dir = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
        os.chdir(script_dir)
        
        import pgzrun
        import playsound 
        
        import random 
        from random import randint
    
        WIDTH = 1280
        HEIGHT = 720
    
        def draw():
            screen.fill("purple")
            screen.draw.filled_rect(main_box, "sky blue")
            screen.draw.filled_rect(timer_box, "sky blue")
            screen.draw.text("Score: " + str(score), color="black", topleft=(10, 10), fontname=fontname)
    
            for boxc in answer_boxes:
                screen.draw.filled_rect(box, color)
    
            screen.draw.textbox(str(time_left), timer_box, color=('black'), fontname=fontname)
            screen.draw.textbox(question[0], main_box, color=('black'), fontname=fontname)
    
            index = 1
            for box in answer_boxes:
                screen.draw.textbox(question[index], box, color=('black'), fontname=fontname)
                index = index + 1
    
        def game_over():
            global question, time_left, scoredecreaserps
            scoredecreaserps = 0
            message = 'Game Over. You got %s questions correct' %str(numques)
            question = [message, '-', '-', '-', '-', 5]
            time_left = 0
    
        def correct_answer():
            global question, score, numques, time_left
    
            numques = numques + 1
            score = score + 1000
    
            if questions:
                question = questions.pop()
                time_left = 10
            else:
                print('End of questions')
                game_over()
    
        def on_mouse_down(pos):
            index = 1
    
            for box in answer_boxes:
    
                if box.collidepoint(pos):
                    print('Clicked on answer' + str(index))
    
                    if index == question[5]:
                        print('You got it correct!')
                        correct_answer()
                    else:
                        game_over()
    
                index = index + 1
    
        def update_time_left():
            global time_left
    
            if time_left:
                time_left = time_left - 1
            else:
                game_over()
    
        def score_lower():
            global score
    
            if score:
                score = score - scoredecreaserps
        def on_mouse_move(pos):
            global color 
            for box in answer_boxes:
    
                if box.collidepoint(pos):
                    color = "medium blue"
                    print(color)
    
                else:
                    color = "green yellow"
                    print(color)
        
    
        main_box = Rect(50, 40, 820, 240)
        timer_box = Rect(990, 40, 240, 240)
    
        answer_box1 = Rect(50, 358, 495, 165)
        answer_box2 = Rect(735, 358, 495, 165)
        answer_box3 = Rect(50, 538, 495, 165)
        answer_box4 = Rect(735, 538, 495, 165)
    
        answer_boxes = [answer_box1, answer_box2, answer_box3, answer_box4]
    
        scoredecreaserps = 80
        color = "green yellow"
        numques = 0
        score = 0
        time_left = 10
    
        q1 = ["Who was the third president of the Philippines?",
              'Rodrigo Duterte', 'Ramon Magsaysay', 'Jose P. Laurel',
              'Fidel V. Ramos', 3]
    
        q2 = ['When was the Philippines granted independece from the US?'
              , '1977', '1946', '1935', '1907', 2]
    
        q3 = ['When was the Philippines colonized by Spain', '1898', '1523', '1654',
              '1521', 4]
    
        questions = [q1, q2, q3]
    
        random.shuffle(questions)
    
        question = questions.pop(0)
        clock.schedule_interval(update_time_left, 1.0)
        clock.schedule_interval(score_lower, 1.0)
    
        pgzrun.go()

except:
        import traceback
        with open(logname, 'a', encoding = 'utf-8') as f:
            f.write(''.join(traceback.format_exc()) + '\n')
            

        

**


Solution

  • Each time the mouse goes over the boxes, you iterate all the boxes

    def on_mouse_move(pos):
                global color 
                for box in answer_boxes:
        
                    if box.collidepoint(pos):
                        color = "medium blue"
                        print(color)
        
                    else:
                        color = "green yellow"
                        print(color)
    

    The last box being box4 answer_boxes = [answer_box1, answer_box2, answer_box3, answer_box4]. In the end, if you hover box1, you'll change its color to blue, then move to box2 in the loop, going in the "else" block and changing the color of box1 to green.

    Why? I suspect is the declaration of global color: each box refers to the same color. This is consistent with the fact that box4 is different and when clicked changes color to all of them: being the last in the for loop, once is hovered overrides the color to the desired one, and if clicked updates the color for all boxes.

    You should implement each box as an object having its own color, then change the color for the specific box.