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.
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]
. 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.