#!/bin/python
# mathsQuiz.py
# date: 09/08/2006 version 1.0
# author: Mesar Hameed <olpcmathsquiz.20.nospamthx@xoxy.net>
# Licance: Attribution-ShareAlike 2.5 or later
# a quick mockup program to illustrate/bounce ideas for starters to
# Application Program: Test of ability with arithmetic - OLPC
# http://wiki.laptop.org/go/Application_Program:_Test_of_ability_with_arithmetic
# what needs doing:
# level 9 is missing
# think about possible ways of creating translations in a plugable fassion
# either as command line argument or as compile time option
# tk gui, make it all pretty and sugary
# test on sugar platform
import sys
import random
import timing
nq=10 #number of questions per round
def addition(lvl,nq,minval,maxval):
curr=0
result = []
while curr < nq:
a,b = random.randrange(minval,maxval,1),random.randrange(minval,maxval,1)
c=a+b
result.append(a), result.append('+')
result.append(b), result.append(c)
curr = curr +1
result.insert(0,lvl)
return result
def subtraction(lvl,nq,minval,maxval,simplified=0):
curr=0
result = []
while curr < nq:
a,b = random.randrange(minval,maxval,1),random.randrange(minval,maxval,1)
if simplified and b>a:
a,b=b,a
c=a-b
result.append(a), result.append('-')
result.append(b), result.append(c)
curr = curr +1
result.insert(0,lvl)
return result
def multiplicationTable(lvl,nq,maxval,division=0):
curr=0
result = []
while curr < nq:
a,b = random.randrange(0,maxval,1),random.randrange(0,maxval,1)
c=a*b
if division:
if c==0 and a==0:
a,b,c=c,b,a
if c==0 and b==0:
a,b,c=b,a,c
result.append(c), result.append('/')
result.append(b), result.append(a)
else:
result.append(a), result.append('*')
result.append(b), result.append(c)
curr = curr +1
result.insert(0,lvl)
return result
def playround(questions):
name=questions.pop(0)
print "playing the maths quiz, level ", name
nq=len(questions)/4
timing.start()
while len(questions) != 0:
qid="("+str(1+nq-len(questions)/4)+"/"+str(nq)+") "
q =qid + str(questions[0])+ " " + str(questions[1]) + " " + str(questions[2]) + " = "
inputhandler(q,questions[3])
questions[:4] = []
#end loop
timing.finish()
print "Well done!, you completed the level in ",round((timing.milli()/1000.0),2), "seconds"
def inputhandler (prompt,expectedAnswer="",attempts=3):
counter = ans=0
while counter < attempts:
try:
ans=raw_input(prompt)
if ans == "exit" :
verifyExit()
ans="0"
counter=counter-1
if str(ans) in str(expectedAnswer) and str(ans) != "":
return ans
except ValueError:
counter=counter+1
continue
counter=counter+1
print "the correct answer is ",expectedAnswer
return 0
def verifyExit():
try:
quit=raw_input("Are you sure you wish to exit? [y/n]: ")
if quit == "y":
print "thankyou for playing the maths quiz."
sys.exit()
except:
print "goodbye"
sys.exit()
def welcome():
print "Welcome to OLPC maths quiz!\thttp://www.laptop.org"
print "Have a play, and see how far you can get.\n\n"
print "1, level 1: basic addition (to 20)"
print "2, level 2: basic subtraction (from 20)"
print "3, level 3: intermediate addition (to 200)"
print "4, level 4: intermediate subtraction (from 100)"
print "5, level 5: addition of negative numbers"
print "6, level 6: mixture of negative and posative numbers"
print "7, level 7: multiplication table. ( to 12*12)"
print "8, level 8: basic division"
print "Type exit at any point to quit."
while 1:
print "there are 8 levels, which level do you want to play?"
lvl=inputhandler("1 -- 8? ",range(1,9))
if lvl == "1":
questions=addition(1,nq,0,10)
elif lvl == "2":
questions=subtraction(2,nq,0,20,1)
elif lvl == "3":
questions=addition(3,nq,0,50)
elif lvl == "4":
questions=subtraction(4,nq,0,100,1)
elif lvl == "5":
questions=addition(5,nq,-100,0)
elif lvl == "6":
questions=subtraction(6,nq,0,100,0)
elif lvl == "7":
questions=multiplicationTable(7,nq,12)
elif lvl == "8":
questions=multiplicationTable(8,nq,12,1) #this actually does divisions within the multiplication table.
playround(questions)
welcome()