[英]The draw() function in my quiz game is not working properly
Ok, so I'm making a quiz game using python.好的,所以我正在使用 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.
但是,当我尝试这样做时会出现两个问题。
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')
** **
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]
.最后一个框是 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.最后,如果您将鼠标悬停在 box1 上,您会将其颜色更改为蓝色,然后在循环中移动到 box2,进入“else”块并将 box1 的颜色更改为绿色。
Why?为什么? I suspect is the declaration of
global color
: each box refers to the same color.我怀疑是
global 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.这与 box4 不同的事实是一致的,当单击时,所有框的颜色都会改变:作为 for 循环中的最后一个,悬停后将颜色覆盖为所需的颜色,如果单击,则更新所有框的颜色。
You should implement each box as an object having its own color, then change the color for the specific box.您应该将每个框实现为具有自己颜色的对象,然后更改特定框的颜色。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.