Personal tools
You are here: Home Members gotcha's Home Personal Items multiply.py

multiply.py

multiply.py — Python Source, 5Kb

File contents

#! /usr/bin/python

from random import randint
import time, sys

class Multiply(object):

    def __init__(self, klass, begin=1, end=10):
        self.questionSet = QuestionSet()
        self.begin = begin
        self.end = end
        self.questionCount = 0
        self.klass = klass

    def setQuestion(self, indexes, value):
        self.questionSet.store(indexes, value)

    def questionAsked(self, indexes):
        return self.questionSet.questionAsked(indexes)

    def getNewQuestion(self):
        indexes = self.getRandomQuestionIndexes()
        while self.questionAsked(indexes):
            indexes = self.getRandomQuestionIndexes()
        question = self.klass(indexes)
        self.setQuestion(indexes, question)
        return question

    def getRandomQuestionIndexes(self):
        first = randint(self.begin, self.end)
        second = randint(self.begin, self.end)
        return (first, second)

    def playAgain(self):
        answer = ''
        while answer not in ('o', 'n'): 
            print
            print
            print 'Veux-tu recommencer ? (o ou n)',
            answer = raw_input()
        return (answer == 'o')

    def initQuestions(self):
        print
        print
        print 'Combien de questions veux-tu ?',
        self.questionCount = input()
        print

    def askQuestions(self):
        self.start = time.time()
        for i in range(self.questionCount):
            question = self.getNewQuestion()
            while not question.answered():
                print question, '?',
                question.ask()
            question.evaluate()
            question.report()
           
    def report(self):
        print
        print '%s questions' % self.questionSet.count()
        print '%s bonnes reponses' % self.questionSet.correctCount()
        print
        seconds = round(time.time() - self.start)
        minutes = int(seconds // 60)
        seconds = int(seconds - minutes * 60)
        print 'Temps ecoule: %s minutes %s secondes' % (minutes, seconds)
        print
        print

class Table(Multiply):
    def __init__(self, klass):
        super(Table, self).__init__(klass)
        self.questionCount = 10

    def getRandomQuestionIndexes(self):
        second = self.index
        first = randint(1, 10)
        return (first, second)

    def initQuestions(self):
        print
        print
        print 'Quelle table veux-tu ?',
        self.index = input()
        print

class Squares(Multiply):
    def __init__(self, klass):
        super(Squares, self).__init__(klass)
        self.questionCount = 10

    def getRandomQuestionIndexes(self):
        first = randint(1, 10)
        return (first, )

class BaseQuestion:
    def __init__(self, indexes):
        first, second = indexes
        self.first = first
        self.second = second
        self.correct =  False
        self.setResult()
        self.answer = None

    def setCorrect(self):
        self.correct = True 

    def ask(self):
        self.answer = None
        try:
           self.answer = input()
        except SyntaxError:
           pass

    def answered(self):
        return self.answer is not None

    def evaluate(self):    
        if self.answer == self.result:
            self.setCorrect()

    def report(self):
        print
        if self.correct:
            print 'Bravo'
        else:
            print 'Non, %s%s' % (self, self.result)
        print
        print

class MultiplyQuestion(BaseQuestion):
    def setResult(self):
        self.result = self.first * self.second
    
    def __repr__(self):
        return '%s x %s = ' % (self.first, self.second)

class DivideQuestion(BaseQuestion):
    def setResult(self):
        self.result = self.first

    def __repr__(self):
        return '%s : %s = ' % (self.first * self.second, self.second)

class SquareQuestion(BaseQuestion):
    def __init__(self, indexes):
        value = indexes[0]
        self.value = value
        self.correct =  False
        self.setResult()
        self.answer = None
    
    def setResult(self):
        self.result = self.value * self.value

    def __repr__(self):
        return 'le carre de %s = ' % self.value

class Training:
    def choice(self):
        print
        print
        print 'Choix possibles :'
        print
        print '1) Tables de multiplication une par une' 
        print
        print '2) Toutes les tables de multiplication'
        print
        print '3) Tables de division une par une'
        print
        print '4) Toutes les tables de division'
        print
        print '5) Les carres'
        print
        print '6) Arreter'
        print
        print
        print 'Que choisis-tu (1-6) ?',
        self.index = input()
        print
        if self.index == 6:
            sys.exit(1)

    def play(self):
        play = True
        while play:
            mult = self.get_training()
            mult.initQuestions()
            mult.askQuestions()
            mult.report()
            play = mult.playAgain()

    def get_training(self):
       if self.index == 1:
           return Table(MultiplyQuestion)
       elif self.index == 2:
           return Multiply(MultiplyQuestion)
       elif self.index == 3:
           return Table(DivideQuestion)
       elif self.index == 4:
           return Multiply(DivideQuestion)
       elif self.index == 5:
           return Squares(SquareQuestion)

class QuestionSet:
    def __init__(self):
        self._questions = {}

    def store(self, indexes, value):
        self._questions[indexes] = value

    def questionAsked(self, indexes):
        return self._questions.has_key(indexes)

    def count(self):
        return len(self._questions.items())

    def correctCount(self):
        result = 0
        for indexes, question in self._questions.items():
            if question.correct:
                result += 1
        return result


if __name__ == '__main__':
    while True:
        tr = Training()
        tr.choice()
        tr.play()
Document Actions