Antworten trotz verschobener Auswahl richtig bewerten

PythonBeginner
Jetzt üben

Einführung

Baue ein spielbares lokales Quiz, das Antworten auch bei verschobenen Auswahlmöglichkeiten richtig bewertet. Du brauchst Python-Funktionen, Listen, Dictionaries, Bedingungen und Schleifen. JSON, Zufallsauswahl und Eingabeprüfung werden hier erklärt. Die vorbereitete Terminal-Engine übernimmt Anzeige und Rückmeldung; du implementierst drei Regeln in logic.py.

Öffne in WebIDE Terminal und dann New Terminal (bei schmalem Fenster unter More). Führe alle Befehle dort aus. Bewahre engine.py, quiz.py, demo.py und bank.json unverändert; bearbeite nur logic.py. Geschätzte Lese- und Übungszeit: 40 Minuten, keine gemessene Anfängerzeit.

Fragen auswählen und ganze Optionen verschieben

In diesem Schritt spielst du zwei bekannte Fragen und ergänzt dann eine Zufallsauswahl, ohne Identitäten zu verlieren. Im WebIDE-Terminal wechselt cd das Arbeitsverzeichnis; python3 führt eine Python-Datei aus.

cd /home/labex/project
python3 demo.py

Gib 1 für Sun und anschließend 2 für Moon ein. Beide zeigen Correct!. Diese Demonstration mit fester Reihenfolge ist vorbereitet; dein wiederverwendbares Quiz wird auch Optionen verschieben.

cat zeigt eine Textdatei an:

cat bank.json

JSON stellt Listen mit [], Dictionaries mit {} und Zeichenketten mit doppelten Anführungszeichen dar. Jede Frage enthält question_id, prompt, options und correct_option_id. Jede Option verbindet option_id mit text. IDs bleiben stabil; Bildschirmnummern sind Positionen. sky und tide bieten Sun/Moon an, doch Sun ist nur bei sky richtig. Options-IDs sind innerhalb ihrer Frage eindeutig: Die Identität ist das Paar aus Frage und Option. In den gelieferten Banken sind Frage-IDs sowie Optionstexte innerhalb einer Frage eindeutig.

rng ist ein übergebenes Zufallsgeneratorobjekt. sample(items, count) liefert eine neue Liste ohne wiederholte Elemente, repariert aber keine doppelten Frage-IDs. shuffle(items) verändert eine Liste direkt; kopiere deshalb zunächst die Optionen. Verschiebe ganze Dictionaries, damit jede ID bei ihrem Text bleibt. Die angeforderte Anzahl ist positiv; begrenze die tatsächliche Auswahl mit min(count, len(questions)) auf die Bankgröße. Zufall sorgt für Spielvariation, nicht für Sicherheit. Gleichwertiges Auswählen oder Mischen ist erlaubt; ein fester Seed oder eine feste Reihenfolge wird nicht verlangt.

Dieses Here-Dokument schreibt Python-Text: > ersetzt logic.py; das zitierte <<'PY' übernimmt den Inhalt wörtlich bis zum letzten PY. Führe den gesamten Block einschließlich Schlusszeile aus. Er ersetzt die Ausgangsdatei durch diese beiden Funktionen; die Eingabefunktion folgt danach.

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 liefert jetzt eine begrenzte Auswahl; move_options liefert neu geordnete Optionsobjekte, ohne die Bank zu ändern. Falls das Terminal eine Fortsetzung erwartet, schließe mit PY allein auf einer Zeile ab.

Eine gültige Nummer zur ID zuordnen

In diesem Schritt übersetzt du die angezeigte Auswahl in eine stabile Options-ID. Die vorbereitete Engine übergibt ask für Eingabe und tell für Ausgabe. ask liefert Text; strip() entfernt äußere Leerzeichen. enumerate(..., start=1) verbindet jedes Objekt mit seiner angezeigten Nummer. Vergleiche den Text mit str(position), damit oops, -1, 0 und Nummern außerhalb des Bereichs keine Antwort abgeben. Nur die angezeigte Schreibweise gilt: 1, nicht 01. q beendet vor der Abgabe. Gib genau eine gültige Antwort zurück; sonst fragt die while-Schleife erneut.

Im selben Terminal hängt >> diese Funktion an, ohne die beiden vorhandenen zu ersetzen:

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

Spiele alle verfügbaren Fragen. --count fordert ein positives Maximum an; auch 100 wählt nur die drei gelieferten Fragen. Ohne --ordered variieren Fragen- und Optionspositionen.

python3 quiz.py bank.json --count 100

Probiere bei der ersten Eingabe oops, -1, 0 und 99. Jedes Mal erscheint Enter one displayed number, or q to stop. und dieselbe Frage wird erneut gestellt. Antworte danach nach dem Text: Sun für den Stern, Moon für Gezeiten, Root für Wasseraufnahme aus dem Boden. Lies jeweils die angezeigte Nummer. Die Rückmeldung muss zu deiner Auswahl passen; das Endergebnis lautet:

Score: 3/3 answered

Starte eine kürzere Runde und gib sofort q ein:

python3 quiz.py bank.json --count 2
Score: 0/0 answered

Unbeantwortete Fragen fehlen, sie gelten nicht als falsch. Die vorbereitete Engine gibt einmal ab, bewertet anhand der aktuellen Frage/Option-Beziehung und berechnet den Punktestand. Sie speichert keine Bildschirmnummern. Bei einem falsch geschriebenen Dateinamen bedeuten Quiz error: ... und ein Exitcode ungleich null, dass kein erfolgreiches Spiel vorliegt. Zeige mit ls die Namen an und wiederhole den genauen Befehl oben. Meldet Python einen Syntaxfehler, wiederhole das betreffende vollständige Here-Dokument; setze die Umgebung nicht zurück.

Zusammenfassung

Du hast ein wiederverwendbares, spielbares Quiz mit begrenzter Zufallsauswahl und stabiler Antwortzuordnung gebaut. Diese Einheit speichert keine Aufzeichnungen.