Introduction
Créez un quiz local jouable dont les réponses restent correctement évaluées lorsque les choix changent de place. Vous devez connaître les fonctions, listes, dictionnaires, conditions et boucles Python. JSON, le tirage aléatoire et la validation des saisies sont expliqués ici. Le moteur de terminal fourni gère l'affichage et les retours ; vous implémentez trois règles dans logic.py.
Ouvrez le menu Terminal de WebIDE, puis New Terminal (sous More dans une fenêtre étroite). Exécutez toutes les commandes dans ce terminal. Conservez engine.py, quiz.py, demo.py et bank.json ; seul logic.py est à modifier. Lecture et pratique estimées : 40 minutes, sans mesure auprès de débutants.
Tirer les questions et déplacer les options entières
Dans cette étape, jouez deux questions connues, puis ajoutez un tirage aléatoire sans perdre les identités. Dans le terminal WebIDE, cd change le répertoire de travail et python3 exécute un fichier Python.
cd /home/labex/project
python3 demo.py
Saisissez 1 pour Sun, puis 2 pour Moon. Les deux affichent Correct!. Cette démonstration à ordre fixe est fournie ; votre quiz réutilisable déplacera aussi les choix.
cat affiche un fichier texte :
cat bank.json
JSON représente les listes avec [], les dictionnaires avec {} et les chaînes entre guillemets doubles. Chaque question possède question_id, prompt, options et correct_option_id. Chaque option associe option_id à text. Les identifiants sont stables ; les numéros affichés sont des positions. sky et tide proposent Sun/Moon, mais Sun n'est correct que pour sky. Les identifiants d'option sont uniques dans leur question : l'identité est le couple question et option. Dans les banques fournies, les identifiants de question et les textes d'option au sein d'une question sont uniques.
rng est un objet générateur aléatoire fourni. sample(items, count) renvoie une nouvelle liste sans répéter d'élément ; il ne corrige pas les identifiants de question dupliqués. shuffle(items) modifie une liste sur place : copiez d'abord les options. Déplacez les dictionnaires entiers pour conserver chaque identifiant avec son texte. Le nombre demandé est positif ; limitez le tirage à la taille de la banque avec min(count, len(questions)). L'aléatoire varie le jeu, sans garantie de sécurité. Des méthodes équivalentes de tirage ou de mélange sont acceptées ; aucune graine ni aucun ordre fixes ne sont exigés.
Ce here-document écrit du texte Python : > remplace logic.py ; <<'PY', avec ses guillemets, conserve littéralement le contenu jusqu'au dernier PY. Exécutez tout le bloc, dernière ligne comprise. Il remplace le fichier initial par ces deux fonctions ; la fonction de saisie vient ensuite.
cat > logic.py <<'PY'
def choose_questions(questions, count, rng):
return rng.sample(questions, min(count, len(questions)))
def move_options(question, rng):
options = question["options"].copy()
rng.shuffle(options)
return options
PY
choose_questions renvoie désormais une sélection bornée ; move_options renvoie les options réordonnées sans modifier la banque. Si le terminal attend une suite, terminez par PY seul sur une ligne.
Retrouver l'identifiant à partir d'un numéro valide
Dans cette étape, convertissez un choix affiché en identifiant stable. Le moteur fourni transmet les fonctions ask (entrée) et tell (sortie). ask renvoie du texte ; strip() retire les espaces aux extrémités. enumerate(..., start=1) associe chaque objet à son numéro affiché. Comparez le texte à str(position) pour empêcher l'envoi de oops, -1, 0 et de numéros hors limites. Seule la forme affichée est acceptée : 1, pas 01. q arrête avant l'envoi. Renvoyez une seule réponse valide ; sinon la boucle while repose la question.
Dans le même terminal, >> ajoute cette fonction sans remplacer les deux précédentes :
cat >> logic.py <<'PY'
def read_answer(options, ask, tell):
while True:
text = ask("Answer (number or q): ").strip()
if text.lower() == "q":
return None
for position, option in enumerate(options, start=1):
if text == str(position):
return option["option_id"]
tell("Enter one displayed number, or q to stop.")
PY
Jouez toutes les questions disponibles. --count demande un maximum positif ; 100 ne tire toujours que les trois questions fournies. Sans --ordered, les positions des questions et options varient.
python3 quiz.py bank.json --count 100
À la première invite, essayez oops, -1, 0 et 99. Chaque saisie affiche Enter one displayed number, or q to stop. et repose la même question. Répondez ensuite selon le texte : Sun pour l'étoile, Moon pour les marées, Root pour l'eau du sol. Relisez chaque numéro affiché. Le retour doit correspondre à votre choix ; le résultat final est :
Score: 3/3 answered
Lancez une partie plus courte et saisissez immédiatement q :
python3 quiz.py bank.json --count 2
Score: 0/0 answered
Les questions non répondues sont absentes, pas incorrectes. Le moteur n'envoie qu'une fois, produit le retour d'après le couple question/option courant et calcule le score. Il ne conserve pas les numéros affichés. Un nom de fichier erroné produit Quiz error: ... et un code de sortie non nul : aucune partie réussie n'en résulte. Utilisez ls pour voir les noms, puis relancez la commande exacte ci-dessus. En cas d'erreur de syntaxe Python, répétez le here-document complet concerné ; ne réinitialisez pas l'environnement.
Résumé
Vous avez créé un quiz jouable et réutilisable, avec un tirage aléatoire fini et une correspondance stable des réponses. Cette unité ne sauvegarde aucun enregistrement.



