commit 29de3039f7fa684607b07c229cf3e4ea8226c90e Author: Djalim Simaila Date: Fri Oct 20 16:18:07 2023 +0200 initial commit diff --git a/.spyproject/config/codestyle.ini b/.spyproject/config/codestyle.ini new file mode 100755 index 0000000..0f54b4c --- /dev/null +++ b/.spyproject/config/codestyle.ini @@ -0,0 +1,8 @@ +[codestyle] +indentation = True +edge_line = True +edge_line_columns = 79 + +[main] +version = 0.2.0 + diff --git a/.spyproject/config/defaults/defaults-codestyle-0.2.0.ini b/.spyproject/config/defaults/defaults-codestyle-0.2.0.ini new file mode 100755 index 0000000..0b95e5c --- /dev/null +++ b/.spyproject/config/defaults/defaults-codestyle-0.2.0.ini @@ -0,0 +1,5 @@ +[codestyle] +indentation = True +edge_line = True +edge_line_columns = 79 + diff --git a/.spyproject/config/defaults/defaults-encoding-0.2.0.ini b/.spyproject/config/defaults/defaults-encoding-0.2.0.ini new file mode 100755 index 0000000..0ce193c --- /dev/null +++ b/.spyproject/config/defaults/defaults-encoding-0.2.0.ini @@ -0,0 +1,3 @@ +[encoding] +text_encoding = utf-8 + diff --git a/.spyproject/config/defaults/defaults-vcs-0.2.0.ini b/.spyproject/config/defaults/defaults-vcs-0.2.0.ini new file mode 100755 index 0000000..ee25483 --- /dev/null +++ b/.spyproject/config/defaults/defaults-vcs-0.2.0.ini @@ -0,0 +1,4 @@ +[vcs] +use_version_control = False +version_control_system = + diff --git a/.spyproject/config/defaults/defaults-workspace-0.2.0.ini b/.spyproject/config/defaults/defaults-workspace-0.2.0.ini new file mode 100755 index 0000000..2a73ab7 --- /dev/null +++ b/.spyproject/config/defaults/defaults-workspace-0.2.0.ini @@ -0,0 +1,6 @@ +[workspace] +restore_data_on_startup = True +save_data_on_exit = True +save_history = True +save_non_project_files = False + diff --git a/.spyproject/config/encoding.ini b/.spyproject/config/encoding.ini new file mode 100755 index 0000000..a17aced --- /dev/null +++ b/.spyproject/config/encoding.ini @@ -0,0 +1,6 @@ +[encoding] +text_encoding = utf-8 + +[main] +version = 0.2.0 + diff --git a/.spyproject/config/vcs.ini b/.spyproject/config/vcs.ini new file mode 100755 index 0000000..fd66eae --- /dev/null +++ b/.spyproject/config/vcs.ini @@ -0,0 +1,7 @@ +[vcs] +use_version_control = False +version_control_system = + +[main] +version = 0.2.0 + diff --git a/.spyproject/config/workspace.ini b/.spyproject/config/workspace.ini new file mode 100755 index 0000000..e012e19 --- /dev/null +++ b/.spyproject/config/workspace.ini @@ -0,0 +1,10 @@ +[workspace] +restore_data_on_startup = True +save_data_on_exit = True +save_history = True +save_non_project_files = False + +[main] +version = 0.2.0 +recent_files = ['../../../../../../../../../../home/djalim/.config/spyder-py3/temp.py', 'fonctions.py'] + diff --git a/CahierDesCharges.ipynb b/CahierDesCharges.ipynb new file mode 100755 index 0000000..a00b041 --- /dev/null +++ b/CahierDesCharges.ipynb @@ -0,0 +1,145 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cahier des charges\n", + "\n", + "\n", + "donc notre projet de site \"d'entrainement cerebrale sur le theme des operation mathematique\" plus communement appelé \"calcul mental\" par le commun des mortels\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Taches à effectuer + %\n", + "\n", + "## Priorité - Haute\n", + "\n", + "> 1) la fonction generation de chiffre/calcul aleatoire - 100%\n", + "- docstring tres explicite\n", + "- prends en parametre une difficulté.\n", + "- sa range() doit etre modulable celon la difficulté ( par exemple en facile on obtient des nombres entre 0 et 10 et en difficile entre 25 et 75)\n", + "- si le calcul est une division, elle doit tomber juste, donc soit les chiffre \"3\" \"6\" \"9\" sont a banir ou bien verifier que le diviseur et le divisé partagent une table\n", + "- si le calcul est une soustraction, le resultat doir etre positif, donc verifier que le premier nombre est plus grand que le second\n", + "\n", + "> 2) la fonction verifiant la reponse - 100 %\n", + "- docstring explicite\n", + "- prends en parametre le calcul generé precedement\n", + "- doit etre fiable a 100%\n", + "\n", + "> des test unitaire - 0 %\n", + "\n", + "## Priorité - Moyenne\n", + "\n", + "> 3) Interface Homme - machine html / css - 80%\n", + "- Belle, minimale et efficace\n", + "- les pages principales sont:\n", + " * le menu principale (ou l'utilisateur choisis un mode de jeu : qcm ou classique, une difficulté)\n", + " * les pages de calcul (ou l'utilisateur reponds aux calcul qui lui sont proposés)\n", + " * la page finale (ou l'utilisateur obtiens la correction des calculs, son score et peut choisir ou non d'enregistrer son score dans le classement dans ce cas il devra entrer un pseudonyme)\n", + " * la page de classement ( qui affiche tout les score enregistrés dans le classement)\n", + "\n", + ">4) la fonction generation de reponse pour qcm - 100%\n", + "- docstring explicite\n", + "- prends en parametre le calcul generé precedement et sa difficulté\n", + "- genere des 3 fausses reponses en plus de la vrai reponse\n", + "- plus la difficulté est basse plus la similarité entre la reponse juste et les reponses fausses est basse \n", + "\n", + "> 5) fonction attribuant un score a calcul - 0%\n", + "- prends en parametre un calcul et sa difficulté\n", + "- renvoie un score entre 0 et 10 celon la perfomance de l'utilisateur ( on peut prendre par exemple la vitesse a la quelle l'utilisateur a repondu a la question pour quantifier la perfomance )\n", + "\n", + "## Priorité - Basse / optionel\n", + "\n", + "> Ajouter un classement des meilleurs perfomances\n", + "\n", + "> Ajouter la possiblilité a l'utilisateur de se chronometrer\n", + "\n", + "> Donnez la possiblilité a l'utilisateur de choisir le nombre de calculs\n", + "ex: 10, 30, 50 et peut etre integrer un systeme de difficulté croissante\n", + "\n", + "> Ajouter des effets sonores /des musiques libre de droit\n", + "\n", + "> Ajouter un mode marathon ou il n'y a pas de limite sur le nombre de question, la partie s'arette a la premiere mauvaise reponse, le but et donc d'enchainer le plus de bonne reponse avec des calculs a difficulté croissante\n", + "\n", + "# Reparition des Taches\n", + "\n", + "\n", + "\n", + "| Fonction | Developpeur | Progression |\n", + "| :------------ |: -------------: | ------------: |\n", + "| 1) | Clément | 100% |\n", + "| 2) | Clément | 100% |\n", + "| 3) | Djalim | 80% |\n", + "| 4) | Djalim | 100% |\n", + "| 5) | . | 0% |\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exemple visuel du site" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](https://cdn.discordapp.com/attachments/561585323616763924/707153314214838292/Menu.png)\n", + "![image](https://cdn.discordapp.com/attachments/561585323616763924/707153302386900992/class.png)\n", + "![image](https://cdn.discordapp.com/attachments/561585323616763924/707153317574344754/qcm.png)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "autoclose": false, + "autocomplete": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "hotkeys": { + "equation": "Ctrl-E", + "itemize": "Ctrl-I" + }, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a5b293 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# Site d'enrichissement cerebral sur le theme des matematique communement appel{} : Calcul Mental + +## + + +## Prerequis + +- python3 +- flask + +## usage + +> python3 index.py + diff --git a/__pycache__/fonctions.cpython-37.pyc b/__pycache__/fonctions.cpython-37.pyc new file mode 100755 index 0000000..b3d3a98 Binary files /dev/null and b/__pycache__/fonctions.cpython-37.pyc differ diff --git a/__pycache__/fonctions.cpython-39.pyc b/__pycache__/fonctions.cpython-39.pyc new file mode 100755 index 0000000..94df513 Binary files /dev/null and b/__pycache__/fonctions.cpython-39.pyc differ diff --git a/__pycache__/test_.cpython-37-pytest-5.3.5.pyc b/__pycache__/test_.cpython-37-pytest-5.3.5.pyc new file mode 100755 index 0000000..ab5432c Binary files /dev/null and b/__pycache__/test_.cpython-37-pytest-5.3.5.pyc differ diff --git a/__pycache__/test_fonctions.cpython-37-pytest-5.2.1.pyc b/__pycache__/test_fonctions.cpython-37-pytest-5.2.1.pyc new file mode 100755 index 0000000..b149736 Binary files /dev/null and b/__pycache__/test_fonctions.cpython-37-pytest-5.2.1.pyc differ diff --git a/__pycache__/test_fonctions.cpython-37-pytest-5.3.5.pyc b/__pycache__/test_fonctions.cpython-37-pytest-5.3.5.pyc new file mode 100755 index 0000000..bba8c86 Binary files /dev/null and b/__pycache__/test_fonctions.cpython-37-pytest-5.3.5.pyc differ diff --git a/fonctions.py b/fonctions.py new file mode 100755 index 0000000..012366e --- /dev/null +++ b/fonctions.py @@ -0,0 +1,280 @@ +import random +import csv + +def creer_calcul(difficulte:int )->str: + """ + Cette fonction crée un calcul au hasard entre une addition, soustrction, multiplication et division euclidienne. + Elle prend en compte la difficulté, choisie par l'utilisateur. + En difficulté facile (difficulté = 0), les - sont positives, les nombres sont des entiers positifs, les * et les / sont les tables de 1 à 10. + En difficulté normale (difficulté = 1), les - peuvent être négatives, il y a des nombre entiers positifs et négatifs pour les + et les -, les * et / sont : un chiffre * un nombre compris entre -99 et 99. + En difficulté difficile (difficulté = 2), pour les - et +, les nombres sont relatifs avec 2 chiffres max après la virgule, les * et / sont : un nombre compris entre -99 et 99 * un nombre compris entre -99 et 99. + + :param difficulte: La difficulte du calcul mental. C'est un entier compris entre 0 et 2. + :return: Un calcul mental, sous forme de str. + :return: L'operation liée au calcul, sous forme de str. + """ + try: + assert type(difficulte) == int + assert difficulte >= 0 and difficulte < 3 + except: + return None + + calcul = '' + + if difficulte == 0 : + + n1 = random.randint(0, 10) + n2 = random.randint(0, 10) + operation = random.choice(['+', '-', '*', '/']) + + if operation == '-' : + while n1 < n2 : + n1 = random.randint(0, 10) + n2 = random.randint(0, 10) + calcul = str(n1) + '-' + str(n2) + + if operation == '/' : + n1 = random.randint(1, 10) + dividende = n1*n2 + calcul = str(dividende) + '/' + str(n1) + + elif operation == '+' or operation == '*' : + calcul = str(n1) + operation + str(n2) + + + if difficulte == 1 : + + n1 = random.randint(-99, 99) + n2 = random.randint(-99, 99) + operation = random.choice(['+', '-', '*', '/']) + + if operation == '/' : + while n1 == 0 : + n1 = random.randint(-99, 99) + n2 = random.randint(2, 10) + dividende = n1*n2 + calcul = str(dividende) + '/' + str(n1) + + if operation == '*' : + n1 = random.randint(2, 10) + if n2 < 0 : + calcul = str(n1) + '*' + '(' + str(n2) + ')' + else : + calcul = str(n1) + '*' + str(n2) + + elif operation == '+' or operation == '-' : + if n2 < 0 : + calcul = str(n1) + operation + '(' + str(n2) + ')' + else : + calcul = str(n1) + operation + str(n2) + + + if difficulte == 2 : + + n1 = random.randint(-100, 99) + round(random.random(), 2) + n2 = random.randint(-100, 99) + round(random.random(), 2) + operation = random.choice(['+', '-', '*', '/']) + + if operation == '*' : + n1 = random.randint(-99, 99) + n2 = random.randint(-99, 99) + if n2 < 0 : + calcul = str(n1) + '*' + '(' + str(n2) + ')' + else : + calcul = str(n1) + '*' + str(n2) + + if operation == '/' : + n1 = random.randint(-99, 99) + while n1 == 0 : + n1 = random.randint(-99, 99) + n2 = random.randint(-99, 99) + dividende = n1*n2 + calcul = str(dividende) + '/' + str(n1) + + else : + if n2 < 0 : + calcul = str(n1) + operation + '(' + str(n2) + ')' + else : + calcul = str(n1) + operation + str(n2) + + + return calcul, operation + +def reponses_qcm(calcul:str, difficulte:int, operation:str)-> list : + + """ + Cette fonction genere les reponses a affichier dans le mode qcm. + Elle genere 3 reponses fausses en plus de la vrai reponse. + Selon la difficulté les fausses reponses sont plus ou moins eloignés de la vrai reponse + + :param calcul: un calul generé aleatoirement + :param difficulte: La difficulte du calcul mental, peut être difficile, normal, facile + :return: une liste de reponces (melangé afin que la bonne reponse ne soit pas toujours au meme index) + """ + + try: + assert type(calcul) == str + assert type(difficulte) == int + assert difficulte >= 0 and difficulte <= 3 + except: + return None + + bonne_reponse = round(eval(calcul), 2) + reponses = [bonne_reponse] + + if difficulte == 0: + fausse_minimale = eval(calcul) - 10 + fausse_maximale = eval(calcul) + 10 + fausses = [round(random.uniform(fausse_minimale , fausse_maximale),0) for i in range (3)] + + if difficulte == 1: + fausse_minimale = eval(calcul) - 30 + fausse_maximale = eval(calcul) + 30 + fausses = [round(random.uniform(fausse_minimale , fausse_maximale),0) for i in range (3)] + + if difficulte == 2: + fausse_minimale = eval(calcul) - 50 + fausse_maximale = eval(calcul) + 50 + if operation == "+" or operation == "-" : + fausses = [round(random.uniform(fausse_minimale , fausse_maximale),2) for i in range(3)] + else : + fausses = [round(random.uniform(fausse_minimale, fausse_maximale),0) for i in range(3)] + for i in range(3) : + + + while fausses[i] == bonne_reponse or fausses[0] == fausses[1] or fausses[0] == fausses[2] or fausses[1] == fausses[2] : + if difficulte == 2: + if operation == "+" or operation == "-" : + fausses = [round(random.uniform(fausse_minimale , fausse_maximale),2) for i in range(3)] + else : + fausses = [round(random.uniform(fausse_minimale, fausse_maximale),0) for i in range(3)] + else : + fausses = [round(random.uniform(fausse_minimale , fausse_maximale),0) for i in range (3)] + + reponses.extend(fausses) + random.shuffle(reponses) + try: + assert len(reponses) == 4 + except: + return None + return reponses + +def verifier_reponse(reponse_utilisateur:str, calcul:str)-> str: + + """ + Cette fonction vérifie la réponse donnée par l'utilisateur. + + :param reponse_utilisateur: La réponse donnée. + :param calcul: Le calcul mental auquel l'utilisaateur a repondu. + :return: True si la reponse est juste, sinon la bonne réponse. + """ + try: + assert type(reponse_utilisateur) == str + assert type(calcul) == str + bonne_reponse = round(eval(calcul),2) + except: + return None + + try : + if round(float(reponse_utilisateur), 2) == round(bonne_reponse, 2) : + return "Bravo !" + elif round(float(reponse_utilisateur), 2) != round(bonne_reponse, 2) : + return "Raté, la bonne réponse était : " + str(bonne_reponse) + except : + return "Ecrivez juste un nombre" + +def enregistrer_score(nom:str, score:str) : + + """ + Cette fonction enregistre les scores des joueurs dans un fichier csv score.csv. + Si le joueur a fait un meilleur score, la ligne du tableau correspondant à son pseudo est modifiée. + Si le joueur donne un pseudo inconnu, une nouvelle ligne est créée à la fin du tableau. + + :param nom: Le nom entré par l'utilisateur + :param score: Le score obtenue par l'utilisateur + """ + """ + try: + assert type(nom) == str + assert type(score) == str + except: + return + """ + fichier_r = open('static/Score.csv', 'r', encoding = 'utf-8') + modifier = False + new = "" + print(nom) + nom = nom.replace(','," ") # dans le cas ou des malin mettent des vigules dans leur nom et ruinent le classement + + for ligne in fichier_r : + if nom in ligne : + score_ligne = ligne.split(',')[1] + if int(score) > int(score_ligne) : + ligne = ligne.replace(str(score_ligne), str(score)) + "\n" + new = new + ligne + modifier = True + else : + new = new + ligne + modifier = True + elif nom not in ligne : + new = new + ligne + + if modifier == False : + ligne = "\n" + nom + ',' + str(score) + new = new + ligne + + fichier_r.close() + fichier_w = open('static/Score.csv', 'w', encoding = 'utf-8') + fichier_w.write(new) + fichier_w.close() + return + +def meilleur_score(nom:str)->str : + """ + Cette fonction trouve le meileur score d'un joueur dans le tableau score.csv. + + :param nom: Le nom entré par l'utilisateur + :return: Le meilleur score detenu par l'utilisateur + """ + + try: + assert type(nom) == str + except: + return + + fichier_r = open('static/Score.csv', 'r', encoding = 'utf-8') + for ligne in fichier_r : + nom_ligne = ligne.split(',')[0] + if nom == nom_ligne : + return "Votre meilleur score est : " + ligne.split(',')[1] + return 'Vous êtes anonyme' + +def trier_csv() : + """ + Cette fonction écrit les 10 meilleurs scores de Score.csv dans Score_classement.csv, en les triant par ordre décoissant. + """ + fichier_r = open('static/Score.csv', 'r', encoding = 'utf-8') + fichier_reader = csv.reader(fichier_r) + table = [] + comptage_ligne = 0 + for ligne in fichier_reader : + comptage_ligne += 1 + table.append(ligne) + + for i in range(len(table)) : + m = i + for j in range(i+1, len(table)) : + if int(table[j][1]) < int(table[m][1]) : + m = j + x = table[i] + table[i] = table[m] + table[m] = x + + table.reverse() + if len(table) > 10 : + table = [table[i] for i in range(10)] + + fichier_w = open('static/Score_classement.csv', 'w', encoding = 'utf-8') + fichier_writer = csv.writer(fichier_w) + for i in range(len(table)) : + fichier_writer.writerow(table[i]) diff --git a/index.py b/index.py new file mode 100755 index 0000000..d17ced7 --- /dev/null +++ b/index.py @@ -0,0 +1,94 @@ +from flask import Flask, render_template, request +from fonctions import * +app = Flask(__name__) + +@app.route("/") +def index(): + return render_template("Acceuil.html") + +@app.route("/commencer_classique/", methods = ['POST']) +def commencer(): + difficulte = int(request.form['radio']) + calcul_entier = creer_calcul(difficulte) + calcul = calcul_entier[0] + operation = calcul_entier[1] + numero = 1 + calcul_juste = 0 + return render_template("Calcul.html",difficulte=difficulte, calcul=calcul, numero = numero,calcul_juste=calcul_juste) + +@app.route("/commencer_qcm/", methods = ['POST']) +def commencer_qcm(): + difficulte = int(request.form['radio']) + calcul_entier = creer_calcul(difficulte) + calcul = calcul_entier[0] + operation = calcul_entier[1] + reponces = reponses_qcm(calcul,difficulte,operation) + numero = 1 + calcul_juste = 0 + rep1 = float(reponces[0]) + rep2 = float(reponces[1]) + rep3 = float(reponces[2]) + rep4 = float(reponces[3]) + return render_template("Calcul_qcm.html", calcul=calcul,difficulte=difficulte, rep1=rep1, rep2=rep2, rep3=rep3, rep4=rep4, numero=numero,calcul_juste=calcul_juste, operation=operation) + +@app.route("/suivant/", methods = ['POST']) +def suivant(): + try: + reponse = request.form['resultat'] + except: + reponse = '' + calcul = request.form['calcul'] + operation = request.form['operation'] + verification = verifier_reponse(reponse, calcul) + calcul_juste = int(request.form['calcul_juste']) + if verification == "Bravo !" : + calcul_juste += 1 + difficulte = int(request.form['difficulte']) + + calcul_entier = creer_calcul(difficulte) + calcul = calcul_entier[0] + operation = calcul_entier[1] + + mode = request.form['type'] + numero = int(request.form['numero']) + if verification == "Ecrivez juste un nombre" : + numero -= 1 + calcul = request.form['calcul'] + operation = request.form['operation'] + while numero < 2 : + if mode == "qcm": + numero += 1 + reponces = reponses_qcm(calcul,difficulte,operation) + rep1 = float(reponces[0]) + rep2 = float(reponces[1]) + rep3 = float(reponces[2]) + rep4 = float(reponces[3]) + return render_template("Calcul_qcm_suivant.html",difficulte=difficulte, calcul=calcul,verification=verification, rep1=rep1, rep2=rep2, rep3=rep3, rep4=rep4,numero = numero,calcul_juste=calcul_juste) + else : + numero += 1 + return render_template("Calcul_suivant.html",difficulte=difficulte, calcul=calcul, verification=verification, numero=numero, calcul_juste=calcul_juste) + return render_template("Resultat.html",calcul_juste=calcul_juste) + +@app.route('/resultat/', methods=['POST']) +def resultat(): + score = int(request.form['score']) + nom = request.form['nom'] + + nom = nom.strip() + if len(nom) > 10 : + erreur = 'Trop de caractères' + calcul_juste = request.form['score'] + return render_template("Resultat.html",calcul_juste=calcul_juste, erreur=erreur) + if len(nom) > 0 : + print(nom) + enregistrer_score(nom, score) + ms = meilleur_score(str(nom)) + return render_template('Classement.html', nom=nom, ms=ms) + +@app.route('/classement', methods=['GET', 'POST']) +def classement() : + trier_csv() + return render_template('Classement.html') + +if __name__ == "__main__": + app.run(host="localhost", port = 5002,debug=True) diff --git a/static/Score.csv b/static/Score.csv new file mode 100755 index 0000000..b93201f --- /dev/null +++ b/static/Score.csv @@ -0,0 +1,12 @@ +Clement,9 +Djalim,9 +Test,9 +c,6 +12,6 +TOTO,10 +Test2,2 +Paul,2 +lol,2 +Test3,2 +Test4,2 +Paul2,2 \ No newline at end of file diff --git a/static/Score_classement.csv b/static/Score_classement.csv new file mode 100755 index 0000000..de8a5cd --- /dev/null +++ b/static/Score_classement.csv @@ -0,0 +1,10 @@ +TOTO,10 +Djalim,9 +Clement,9 +Test,9 +12,6 +c,6 +Paul2,2 +Test4,2 +Test3,2 +lol,2 diff --git a/static/licence_free_background.jpg b/static/licence_free_background.jpg new file mode 100755 index 0000000..bc0b9c1 Binary files /dev/null and b/static/licence_free_background.jpg differ diff --git a/static/style.css b/static/style.css new file mode 100755 index 0000000..82ef8f8 --- /dev/null +++ b/static/style.css @@ -0,0 +1,163 @@ +* { + box-sizing: border-box; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-kerning: auto; +} + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + background-color: greenyellow; /* a changer j'aime pas trop cette couleur en vrai*/ + background-image: url(./licence_free_background.jpg); +} + +ul { + list-style-type: none; +} + +li{ + font-size: 20px; +} + +h1 { + text-align:center; + font-size: 54px; +} + +h2 { + text-align:center; + font-size: 60px; + opacity: 1.0; +} + +h3 { + text-align:center; + font-size: 30px; + opacity: 1.0; +} +#principale { + width: 951px; + margin: auto; + display: flex; +} + +.secondaires { + width: 425px; + margin-left: 25px; + margin-right: 25px; + border: 0px solid black; + border-radius: 40px; + padding: 15px; + background-color: greenyellow; + opacity: 0.7; +} + +.secondaires:hover { + opacity: 1.0; +} + +.checkboxes { +width: 200px; +margin: auto; +opacity: 1.0; +} + +#calcul { + width: 301px; + margin: auto; +} + +.start { + margin-top: 25px; +} + +#boite_qcm { + width: 525px; + margin: auto; +} + +#liste_qcm_reponces { + display: flex; + flex-wrap: wrap; +} + +.qcm_reponses { + width: 200px; + margin: 10px; + font-size: 30px; + text-align: center; +} + +#titre { + border: 3px solid black; + border-radius: 12px; + width: 508px; + margin-left: auto; + margin-right: auto; +} + +#accueil { + border: 3px solid black; + border-radius: 12px; + width: fit-content; + margin: auto; + padding: 25px; + margin-top: 25px; + margin-bottom: 25px; +} + +p { + text-align:center; +} + +table { + border-collapse: collapse; + border: 2px black solid; + font: 12px sans-serif; +} + +td { + border: 1px black solid; + padding: 10px; + font-size: 28px; + text-align: center; + width: calc(100% + 5px); +} + +#classement { + margin:0 auto; + display: table; +} + +#entete { + width: auto; + background-color: #00701a; + display: flex; +} + +a { + text-decoration: none; + font-size: 16px; + color: black; +} + +.bouton { + width: 120px; + text-align: center; + margin-left: 10px; + margin-right: 10px; + height: 55px; + padding: 18px; + background-color: #43a047; +} + +.bouton:hover{ + background-color: #76d275; +} + diff --git a/static/test_score.csv b/static/test_score.csv new file mode 100755 index 0000000..187b2d0 --- /dev/null +++ b/static/test_score.csv @@ -0,0 +1,6 @@ +Clement,9 +Djalim,9 +Test,9 +c,6 +12,6 +TOTO,10 diff --git a/templates/Acceuil.html b/templates/Acceuil.html new file mode 100755 index 0000000..c79566e --- /dev/null +++ b/templates/Acceuil.html @@ -0,0 +1,52 @@ + + + + + + + Calcul mental + + + + + + +
+ + +
+

Bienvenue sur notre site de calcul mental

+
+
+

Classique

+

Difficulté

+
+
+
    + +
  • facile
  • +
  • normal
  • +
  • difficile
  • +
  • +
+
+
+
+
+

QCM

+

Difficulté

+
+
+
    +
  • facile
  • +
  • normal
  • +
  • difficile
  • + +
+
+
+
+
+ + + \ No newline at end of file diff --git a/templates/Calcul.html b/templates/Calcul.html new file mode 100755 index 0000000..22ca602 --- /dev/null +++ b/templates/Calcul.html @@ -0,0 +1,34 @@ + + + + + + + Calcul mental + + + + + + +
+ + +
+

Calcul Mental

+

Calcul {{ numero }} sur 10

+

{{ calcul }}

+
+
+ + + + + + + + +
+
+ + \ No newline at end of file diff --git a/templates/Calcul_qcm.html b/templates/Calcul_qcm.html new file mode 100755 index 0000000..aee8744 --- /dev/null +++ b/templates/Calcul_qcm.html @@ -0,0 +1,39 @@ + + + + + + + Calcul mental + + + + + + +
+ + +
+

Calcul Mental

+

Calcul {{ numero }} sur 10

+

{{ calcul }}

+
+
+
    +
  • {{ rep1 }}
  • +
  • {{ rep2 }}
  • +
  • {{ rep3 }}
  • +
  • {{ rep4 }}
  • +
+ + + + + + + +
+
+ + \ No newline at end of file diff --git a/templates/Calcul_qcm_suivant.html b/templates/Calcul_qcm_suivant.html new file mode 100755 index 0000000..80f3c67 --- /dev/null +++ b/templates/Calcul_qcm_suivant.html @@ -0,0 +1,40 @@ + + + + + + + Calcul mental + + + + + + +
+ + +
+

Calcul Mental

+

Calcul {{ numero }} sur 10

+

{{verification}}

+

{{ calcul }}

+
+
+
    +
  • {{ rep1 }}
  • +
  • {{ rep2 }}
  • +
  • {{ rep3 }}
  • +
  • {{ rep4 }}
  • +
+ + + + + + + +
+
+ + \ No newline at end of file diff --git a/templates/Calcul_suivant.html b/templates/Calcul_suivant.html new file mode 100755 index 0000000..88db06f --- /dev/null +++ b/templates/Calcul_suivant.html @@ -0,0 +1,34 @@ + + + + + + + Calcul mental + + + + + +
+ + +
+

Calcul Mental

+

Calcul {{ numero }} sur 10

+

{{verification}}

+

{{ calcul }}

+
+
+ + + + + + + + +
+
+ + \ No newline at end of file diff --git a/templates/Classement.html b/templates/Classement.html new file mode 100755 index 0000000..2b3a360 --- /dev/null +++ b/templates/Classement.html @@ -0,0 +1,42 @@ + + + + + + + +
+ + +
+

Calcul Mental

+

{{ms}}

+

Top 10

+
+
+ + + + +
+
+ + \ No newline at end of file diff --git a/templates/Resultat.html b/templates/Resultat.html new file mode 100755 index 0000000..c08e35c --- /dev/null +++ b/templates/Resultat.html @@ -0,0 +1,30 @@ + + + + + + + Calcul mental + + + + + + +
+ + +
+

Calcul Mental

+

{{ calcul_juste }} / 10

+
+
+

Vous pouvez vous enregistrer, pour cela entrez votre pseudo :

+ + +
+ + +
+ + \ No newline at end of file diff --git a/test_fonctions.py b/test_fonctions.py new file mode 100755 index 0000000..1ba771a --- /dev/null +++ b/test_fonctions.py @@ -0,0 +1,60 @@ +from fonctions import * + +def test_cree_calcul_aleatoire_facile(): + for i in range(10): + precedant = creer_calcul(0) + assert creer_calcul(0) != precedant + +def test_cree_calcul_aleatoire_normal(): + for i in range(10): + precedant = creer_calcul(1) + assert creer_calcul(1) != precedant + +def test_cree_calcul_aleatoire_difficile(): + for i in range(10): + precedant = creer_calcul(2) + assert creer_calcul(2) != precedant + +def test_cree_calcul_difficulte_str(): + assert creer_calcul("0") == None + +def test_cree_calcul_difficulte_invalide(): + assert creer_calcul(4) == None + +#-----------------------------------------------------------------# + +# Cette fonction est un peu chelou a test, si tu trouve des test a faire +# je suis preneur + +#def test_reponces_qcm_simple() +# assert reponses_qcm("1+1",0,"+") + +#-----------------------------------------------------------------# + +def test_verifier_reponse_simple_juste(): + assert verifier_reponse("2","1+1") == "Bravo !" + +def test_verifier_reponse_simple_faux(): + assert verifier_reponse("11","1+1") == "Raté, la bonne réponse était : 2" + +def test_verifier_reponse_lettre(): + assert verifier_reponse("deux","1+1") == "Ecrivez juste un nombre" + +def test_verifier_reponse_reponse_type_int(): + assert verifier_reponse(2,"1+1") == None + +def test_verifier_reponse_calcul_incorrect(): + assert verifier_reponse("2","1plus1") == None + +#-----------------------------------------------------------------# + +def test_enregistrer_score_nom_type_int(): + assert enregistrer_score(123,"456") == None + +def test_enregistrer_score_score_type_int(): + assert enregistrer_score("test",123) == None + +#-----------------------------------------------------------------# +def test_meilleur_score_type_int(): + assert meilleur_score(123) == None +