python - 我的问答游戏中的draw()函数无法正常工作

标签 python pygame draw pgzero

好的,我正在使用 python 制作一个问答游戏。我有它,当你的鼠标悬停在其中一个选项上时,它会改变颜色。但是,当我尝试这样做时出现了两个问题。

  1. 当我将鼠标悬停在answer_box4 上时,只有answer_box4 实际上会稍微改变颜色。
  2. 当我将鼠标悬停在answer_box4 上时,所有框的颜色都会改变。

这是代码:

     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')
            

        

**

最佳答案

每次鼠标移过框时,都会迭代所有框

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)

最后一个框是 box4 answer_boxes = [answer_box1,answer_box2,answer_box3,answer_box4]。最后,如果您将鼠标悬停在 box1 上,则会将其颜色更改为蓝色,然后在循环中移动到 box2,进入“else” block 并将 box1 的颜色更改为绿色。

为什么?我怀疑是全局颜色的声明:每个框引用相同的颜色。这与 box4 不同的事实是一致的,当单击时,所有框的颜色都会改变:作为 for 循环中的最后一个,一旦悬停,就会将颜色覆盖为所需的颜色,如果单击,则会更新所有框的颜色。

您应该将每个框实现为具有自己颜色的对象,然后更改特定框的颜色。

关于python - 我的问答游戏中的draw()函数无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64858957/

相关文章:

java - android 绘制曲线

python - 从列表中的某个范围内选择一个随机元素 - python

python - 使用 boto3 和 python 列出 s3 存储桶

C#填充多边形(三角形)

python - 如何使用特定的解释器运行 python 脚本?

python-3.x - Kivy :[CRITICAL] [App ] Unable to get a Window, 中止

python - 余弦绘图

python - 如果发生错误,nosetests 重新启动测试

python: 高级 python 调度程序 - cron 样式调度 - 传递函数参数

python - Pygame 无法加载背景图像?