the-honk/school/gcse/year 11/Maths Quiz.py
2022-01-11 18:14:41 +00:00

101 lines
2.7 KiB
Python

import random
import operator
import os
# Constants
ANSWER_COUNT = 4
ops = {
'+': operator.add,
'-': operator.sub,
'*': operator.mul,
'/': operator.truediv
}
score = 0
'''Clears the console.'''
def cls():
os.system('cls' if os.name == 'nt' else 'clear')
'''Formats a number.'''
def formatNumber(num):
if num % 1 == 0:
return str(int(num))
else:
return '%.2f' % num
'''Generates a question to be used'''
def generateQuestion():
while True:
x = random.randint(0, 11)
y = random.randint(1, 11)
op = random.choice(list(ops.keys()))
if op == '/' and y > x:
continue
else:
answer = ops.get(op)(x, y)
return (x, y, op, answer)
'''Generates a fake answer based on the real answer.'''
def generateFakeAnswer(answer):
r = random.randint(-11, 11)
return answer + r
'''Asks a question.'''
def askQuestion():
global score
x, y, op, answer = generateQuestion()
# Generate a list of potential fake answers
answerList = {}
answerLocation = random.randint(1, ANSWER_COUNT)
for i in range(1, 5):
if i == answerLocation:
answerList[i] = answer
else:
while True:
generated = generateFakeAnswer(answer)
if generated != answer and generated not in answerList:
answerList[i] = generated
break
# Format that list of potential fake answers into a string
answers = ''
for key in answerList:
value = answerList.get(key)
answers += '\n%i) %s' % (key, formatNumber(value))
# Ask the question
print("""
What is the correct answer to the following expression? %i %s %i
%s
""" % (x, op, y, answers))
# Recieve input and mark the user based on it
while True:
try:
userAnswer = float(input('Which is the correct answer? '))
if userAnswer == answerLocation:
print('You got it right!')
score = score + 1
else:
print('You got it wrong!')
break
except ValueError:
print('Your input must be a number!')
# Ask the user how many questions they would like to be asked
while True:
try:
howMany = int(input('How many questions would you like to answer? '))
cls()
for i in range(howMany):
askQuestion()
cls()
print('Your final score is %i/%i!' % (score, howMany))
break
except ValueError:
print('Your input must be a number!')