Application Program: Test of ability with arithmetic english demo

From OLPC
Revision as of 00:04, 12 January 2007 by Xavi (talk | contribs) (categorization)
Jump to navigation Jump to search
#!/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()