Aller au contenu

Questionnaire pour un cortinaire

Ce projet vous propose d'implanter un jeu de quizz, qui pourra même éventuellement vous servir pour vous révisions.

Parenthèse mycologique

Les cortinaires désignent les champignons du genre cortinarius, dont on trouve quelques espèces en France, entre autres :

Nom scientifique Nom français Commestible ?
Cortinarius purpurascens1 Cortinaire purpurescent Oui, sans intérêt
Cortinarius violaceus2 Cortinaire violet Oui, sans intérêt
Cortinarius praestans[^c_praestans] Cortinaire remarquable Oui
Cortinarius speciosissimus3 Cortinaire très joli Non, mortel
Cortinarius orellanus4 Cortinaire des montagnes Non, mortel

Attention

Les champignons mortels ou toxiques sont relativement courants, et ils peuvent souvent être confondus avec des champignons comestibles. Il convient donc d'être très très prudents si vous cueillez des champignons : en cas de doute, ne les cueillez pas. Si vous vous apercevez que vous avez cueilli un champignon mortel par erreur, ne consommez AUCUN des champignons avec lesquels il aura été mélangé ou stocké.

On peut d'ailleur remarquer que même le nom des champignons est trompeur, parce que le cortinaire très joli est mortel, alors que les trompettes-de-la-mort5 sont, elles, d'excellentes comestibles.

Vous l'aurez donc compris, nous allons implanter une version "sous-bois" de Questions pour un champion : Questions pour un champignon, que nous appelerons Questionnaire pour un cortinaire pour plus de style.

Déroulement du projet

On va conduire ce projet avec une méthode itérative.

Le principe est simple on va commencer par créer une version extrêmement simple et incomplète du logiciel que l'on veut créer.

Puis, on va améliorer ce logiciel existant par petites étapes successives. A la fin de chaque étape, on aura une version du logiciel fonctionnelle et un peu meilleure que la précédente.

Ce qui est bien avec ce type d'approche, c'est qu'en peu de temps, on aura un logiciel utilisable. Le désavantage, c'est que parfois on perdra un peu de temps à "défaire" des fonctionnalités précédentes pour en ajouter de nouvelles.

Dans le monde du développement logiciel itératif, ces étapes sont souvent appelées issues, que l'on peut traduire en français par soumissions, parce que c'est normalement les utilisateurs ou leur représentants qui soumettent les issues à l'équipe de développement . On utilisera donc ce terme par la suite, qui se prononce à l'anglaise : "ichiou" pour issue et "ichiouz" pour issues.

Chaque issue exprime un objectif sous forme d'une phrase en français relativement concise. Par exemple :

Le programme pose une question à l'utilisateur, et propose 4 choix possibles. L'utilisateur réponds. Si c'est la bonne réponse, le programme affiche "Gagné"

Après avoir traité chaque issue, on essaiera de faire un "nettoyage" notre code, appelé refactoring, de manière à le garder le plus simple possible. Quand une issue est terminée, on dit qu'on la ferme.

On pourra aussi, une fois le projet un peu avancé, choisir quelles issues on fait ou non, ou encore les faire en partie dans le désordre.

Remarque : n'essayez pas d'anticiper les issues suivantes, et produisez un code le plus simple et direct possible !

Issues

Les issues sont groupées par dépendances : les issues d'un groupe doivent être, dans l'idéal, traitées dans l'ordre. Dans le sujet, les groupes seront aussi traités dans l'ordre.

Groupe 0 : la base

Issue 0.1 : Le programme pose une question à l'utilisateur, et propose 4 choix de réponse possibles. L'utilisateur réponds. Si c'est la bonne réponse, le programme affiche "Gagné"

Issue 0.2 : Le programme pose 3 questions à l'utilisateur. A chaque réponse à une question, le programme affiche si l'utilisateur a eu juste ou faux, et quelle était la bonne réponse. Quand l'utilisateur a répondu à toutes les questions, le programme affiche le nombre de questions, et le nombre de bonnes réponses.

Issue 0.3 : Tant que la réponse de l'utilisateur n'est pas une des réponses proposées, le programme redemande à l'utilisateur de répondre.

Issue 0.4 : Le programme change aléatoirement l'ordre des réponses à chaque question.

Issue 0.5 : Le programme pose les questions définies dans une liste dans le code du programme.

Issue 0.6 : Le programme choisit aléatoirement un certain nombre de questions dans la liste des questions.

Groupe A : interface

Issue A.1 : Les questions et chaque réponses sont affichées sur des lignes séparées.

Issue A.2 : Les réponses ont un numéro attribué (1,2,3,4), et l'utilisateur peut répondre directement la lettre au lieu du texte de la réponse.

Issue A.3 : A chaque question, la question précédente est effacée, et donc la console d'affichage est utilisée comme un écran.

Groupe B : filtrage des questions

Issue B.1 : Le programme propose de choisir un thème sur lequel porteront les questions.

Issue B.2 : Le programme propose de choisir plusieurs thèmes sur lesquels porteront les questions.

Issue B.3 : Pour chaque question, un niveau de difficulté est renseigné. A la fin de la session, le programme affiche le détail des réponses par niveau.

Issue B.4 : Le programme propose de filtrer les questions selon un niveau maximal et minimal.

Issue B.5 : Les thèmes et niveaux proposés sont détectés automatiquement à partir de la liste de questions fournie.

Groupe C : questions depuis un fichier

Issue C.1 : Les questions sont chargées depuis un fichier CSV

Issue C.2 : Un programme utilitaire annexe permet de créer un nouveau fichier en renseignant des questions.

Issue C.3 : Le programme utilitaire propose une relecture des questions avant soumissions

Issue C.4 : Le programme utilitaire permet d'éditer un fichier de questions existant

Issue C.5 : Le programme utilitaire est intégré au programme de jeu

Groupe D : temps limite

ce groupe risque d'être très compliqué, je suis pas encore sûr qu'il soit faisable.

Issue D.1 : L'utilisateur dispose d'un temps donné pour répondre aux questions. Si il dépasse ce temps, la question est comptée comme fausse.

Issue D.2 : Un timer est affiché dans l'interface, qui informe le joueur sur le temps restant pour répondre.

Groupe E : multijoueur en ligne

ce groupe risque d'être très compliqué, je suis pas encore sûr qu'il soit faisable.

Issue D.1 : Deux joueurs peuvent jouer en réseau. Les deux effectuent le même questionnaire séparément, puis les résultats sont affichés aux deux joueurs.

Issue D.2 : Deux joueurs peuvent jouer en réseau. Les questions sont posées simultanément aux deux joueurs, et une fois que les deux ont répondu, la bonne reponse est affichée.

Issue D.3 : Plusieurs joueurs peuvent jouer en réseau.

Conseils

Lancez votre programme régulièrement pour vérifier que les modifications apportées sont bien fonctionnelles et valides. Et par régulièrement, j'entends très souvent, c'est à dire chaque vous que vous écrivez ou modifiez quelques lignes de code ! Si vous trouvez des erreurs, résolvez-les avant de continuer. Moins un programme comporte d'erreurs, plus il est simple (pratiquement et mentalement!) de les résoudre.

Finissez complètement chaque issue avant de passer à une autre, et testez manuellement que le programme marche bien.

Notez vos erreurs, vos doutes, vos incertitudes dans des commentaires. Si vous utilisez du code externe, par exemple le code de la correction, notez précisément d'où il provient : ça vous permettra de ne pas trop perdre de temps si vous devez revenir dessus plus tard sur le projet. C'est aussi une question d'étiquette.

Sauvegardes versionnées

Faites régulièrement des sauvegardes versionnées de votre code. A minima à la fin de chaque issue. Pour faire une sauvegarde versionnée, vous pouvez par exemple faire une copie de votre code, et former son nom comme suit :

nom_initial_annee_mois_jour_numero_issue.py
Où numéro est le numéro de sauvegarde faite dans ce même jour.

Par exemple, si le fichier du programme s'appelle questionnaire_cortinaire.py, et que vous terminez de travailler sur l'issue B.2 le 6 Décembre 2022, le nom de la sauvegarde s'appelera :

questionnaire_cortinaire_2022_12_06_1_B2.py

Puis, avoir fini et fermé l'issue B.3, le même jour, vous ajouterez une nouvelle sauvegarde :

questionnaire_cortinaire_2022_12_06_2_B3.py

Garder trace des versions successives de votre programme a de nombreux avantages :

  • Si vous vous trompez méchamment, et que vous avez tout cassé dans votre code, vous pourrez toujour reprendre à la version d'avant.
  • Vous gardez une trace de votre progression, à quelle date a été faite quelle issue.
  • Vous pouvez revoir le code qui a fini une issue en particulier, tel qu'il était au moment de l'écrire, pour comparer avec votre version actuelle.

Normalement, ce genre d'historique se fait avec un logiciel de contrôle de version (VCS pour Version Control Software) comme Git. Mais parce que ces logiciels demandent un temps d'apprentissage, et qu'ils ne sont pas toujours faciles ou possibles à installer sur des ordinateurs personnels ou de lycée, on va faire sans dans ce projet.

Quelques outils

f-string

Il est courant que l'on veuille insérer une ou plusieurs valeurs dans une chaîne de caractères. Jusqu'à présent, on a procédé avec str et + :

age = int(input("Quel est votre age ?"))
print("Vous avez " + str(age) + " ans !")

Mais c'est long à écrire et ça peut vite rendre le code illisible. Python propose une meilleure manière de faire : les f-string, pour formatted string. Une telle chaîne de caractère se crée en ajoutant un f avant les guillemets : f"du texte". Dans une f-string, on peut insérer des valeurs en les mettant entre accolades {} :

age = int(input("Quel est votre age ?"))
print(f"Vous avez {age} ans !")

Attention, les f-strings ne marchent pas avec les anciennes versions de Python, comme celle que l'on trouve dans EduPython. Préférez donc utiliser Thonny.

Le mode intéractif de Python

Quand vous avec un éditeur ouvert, comme Thonny, dans la partie console, c'est à dire là ou s'affichent les sorties du programme Python, vous pouvez sans doute voir des lignes commençant par :

>>>

Ces trois chevrons indiquent que Python est activé en mode intéractif, c'est à dire qu'après avoir exécuté votre fichier, vous pouvez appeler des fonctions directement dans la console...

Par exemple, après avoir exécuté le fichier suivant :

def addition(a, b):
    return a + b

Vous pouvez écrire :

>>> addition(10,20) 

Le programme affichera la valeur de retour à la suite, comme si elle était passée dans un print :

>>> addition(10,20) 
30

Les doctests

Une manière relativement simple de tester automatiquement des fonction en Python est d'utiliser les doctests. Vous pouvez en lire plus en suivant ce lien, qui vous emmènera vers un cours de SNT : https://snt.felix-bertoni.fr/python/fonctions/#doctests


  1. https://www.mycodb.fr/fiche.php?genre=Cortinarius&espece=purpurascens&source=search 

  2. https://www.mycodb.fr/fiche.php?genre=Cortinarius&espece=violaceus&source=search 

  3. https://www.mycodb.fr/fiche.php?genre=Cortinarius&espece=speciosissimus 

  4. https://www.mycodb.fr/fiche.php?genre=Cortinarius&espece=orellanus&source=search 

  5. https://www.mycodb.fr/fiche.php?genre=Craterellus&espece=cornucopioides&source=search