Quiz Fragen mischen

Du hast eine Idee für ein Projekt?
Antworten
SaberGFX
User
Beiträge: 10
Registriert: Samstag 21. September 2019, 17:13

Hallo liebe Member.
Ich möchte Objektorientiert ein Quiz in Python schreiben.
Ich habe gerade einen kleinen Test geschrieben.
Mein Problem ist folgendes:
Ich würde gerne die Fragen per Zufall mischen lassen. Geht ja mit random Funktionen.
Ich dachte ich packe die Funktionen in eine Liste und lasse diese per random mischen.
Leider geht das nicht. Nun bin ich auch Ratlos und bräuchte eure Hilfe.

Code: Alles auswählen


class Quizz:
    Frage = ""
    antwort1 = ""
    antwort2 = ""
    antwort3 = ""
    antwort4 = ""
    RichtigeAntwort = ""

    def __init__(self, fr, ant1, ant2, ant3, ant4, rant):
        self.Frage = fr
        self.antwort1 = ant1
        self.antwort2 = ant2
        self.antwort3 = ant3
        self.antwort4 = ant4
        self.RichtigeAntwort = rant

    def ausgabe(self):
        print(self.Frage)
        print(self.antwort1)
        print(self.antwort2)
        print(self.antwort3)
        print(self.antwort4)
        print(self.RichtigeAntwort)





Frage1 = Quizz("Wie heißt die Hauptstadt von China?", "1. Kabul", "2. Ghana", "3. Ochsfurt", "4. Hoplo", "4. Hoplo")
Frage2 = Quizz("Paltte", "1", "2", "7", "8", "8")

#Dise soll gemischt werden// Frage1.ausgabe(), Frage2.ausgabe()


Sprich das die definierten Fragen dann zufällig ausgeben werden.

Vielen Dank.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

du kanst die Anworten mischen wenn du die in eine liste schreibst und die mit

Code: Alles auswählen

random.shuffle(liste)
zufällig vermischt.
Die Liste wird an Ort und Stelle gemischt!
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man anfängt, Variablennamen durchzunummerieren, will man statt dessen Listen verwenden. Das gilt für die Fragen genauso wie für die Antworten. Listen kann man dann auch leicht mischen.
Alle Klassenattribute sind überflüssig und können weg, da sie ja sofort von Instanzattributen überschrieben werden. Abkürzungen vermeiden, unter `rant` verstehe ich wahrscheinlich etwas anderes als Du. Dass die richtige Antwort im Code wiederholt werden muss, ist ungünstig. Die Schreibweise ist uneinheitlich. Konvention für Variablennamen ist klein_mit_unterstrich.
SaberGFX
User
Beiträge: 10
Registriert: Samstag 21. September 2019, 17:13

Danke für die Antworten. Mein Problem wenn ich die Definition in eine Liste packe wird sie schon beim Aufruf schon ausgeführt.

Code: Alles auswählen

import random
random.seed()


class Quizz:
    Frage = ""
    antwort1 = ""
    antwort2 = ""
    antwort3 = ""
    antwort4 = ""
    RichtigeAntwort = ""


    def __init__(self, fr, ant1, ant2, ant3, ant4, rant):
        self.Frage = fr
        self.antwort1 = ant1
        self.antwort2 = ant2
        self.antwort3 = ant3
        self.antwort4 = ant4
        self.RichtigeAntwort = rant

    def ausgabe(self):
        print(self.Frage)
        print(self.antwort1)
        print(self.antwort2)
        print(self.antwort3)
        print(self.antwort4)
        print(self.RichtigeAntwort)

    def mischen(self):
        liste_fragen = (Frage1.ausgabe(), Frage2.ausgabe())  <--- wird schon hier ausgeführt
        random.shuffle(liste_fragen) 						<---- möchte aber erst hier die Ausführung
      




Frage1 = Quizz("Wie heißt die Hauptstadt von China?", "1. Kabul", "2. Ghana", "3. Ochsfurt", "4. Hoplo", "4. Hoplo")
Frage2 = Quizz("Paltte", "1", "2", "7", "8", "8")
Frage1.mischen()
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Die Methode mischen() macht keinen Sinn. Eigentlich die ganze Klasse nicht aber hier mal wie es, in deinem Sinne, funktioniert.

Code: Alles auswählen

import random

class Quizz:

    def __init__(self, fr, ant1, ant2, ant3, ant4, rant):
        self.Frage = fr
        self.antwort1 = ant1
        self.antwort2 = ant2
        self.antwort3 = ant3
        self.antwort4 = ant4
        self.RichtigeAntwort = rant

    def ausgabe(self):
        print(self.Frage)
        print(self.antwort1)
        print(self.antwort2)
        print(self.antwort3)
        print(self.antwort4)
        print(self.RichtigeAntwort)


Frage1 = Quizz("Wie heißt die Hauptstadt von China?", "1. Kabul", "2. Ghana", "3. Ochsfurt", "4. Hoplo", "4. Hoplo")
Frage2 = Quizz("Paltte", "1", "2", "7", "8", "8")

fragen = [Frage1, Frage2]
zufalls_frage = random.choice(fragen)
zufalls_frage.ausgabe()
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
SaberGFX
User
Beiträge: 10
Registriert: Samstag 21. September 2019, 17:13

Vielen Dank, danach habe ich gesucht. Ja das der Code Schrott ist, war mir klar. Wollte nur schnell das Problem lösen. War mir aber nicht möglich.
Vielen Dank
SaberGFX
User
Beiträge: 10
Registriert: Samstag 21. September 2019, 17:13

Habe meinen Schrott mal verbessert. Kannst du mir noch mal helfen, um die Fragen zu mischen. Komm damit echt nicht klar.

Code: Alles auswählen

import random

class Question:
    def __init__(self, prompt, answer):
        self.prompt = prompt
        self.answer = answer


question_prompts = [
    "Wie läufts bei euch?\n(a) Gut\n(b) Schlecht",
    "Ein Apfel hat einen?\n(a) Kern\n(b) Stiel",
    "Wie groß ist ein Zwerg?\n(a) 5cm\n(b) 8cm\n(c) 16cm",

]

questions = [Question(question_prompts[0], "a"), Question(question_prompts[1], "b"), Question(question_prompts[2], "c"),]


def run_quiz(questions):
    score = 0
    for question in questions:
        answer = input(question.prompt)
        if answer == question.answer:
            score += 1
    print("Das war super", score, "war wohl nichts", len(questions))


run_quiz(questions)


Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SaberGFX: Schau Dir doch noch mal die erste Antwort auf Deine Frage, von Fire Spike, an.

Was an dem Code jetzt noch nicht wirklich gut ist, ist das Prompt und korrekte Antwort nicht zusammen gespeichert sind und das Du deswegen manuell noch mal für jede Frage `question_prompts` + den Index hinschreiben musst. Das ist viel unnötige Arbeit und es ist fehleranfällig. Ich würde die Liste mit den Prompts einfach weglassen und die Informationen einfach direkt mit in `questions` (bzw. `QUESTIONS`) aufnehmen.

Konstanten schreibt man per Konvention übrigens KOMPLETT_IN_GROSSBUCHSTABEN. Siehe auch den Style Guide for Python Code.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from collections import namedtuple
import random


Question = namedtuple("Question", "prompt answer")


QUESTIONS = [
    Question("Wie läufts bei euch?\n(a) Gut\n(b) Schlecht", "a"),
    Question("Ein Apfel hat einen?\n(a) Kern\n(b) Stiel", "b"),
    Question("Wie groß ist ein Zwerg?\n(a) 5cm\n(b) 8cm\n(c) 16cm", "c"),
]


def run_quiz(questions):
    questions = list(questions)
    random.shuffle(questions)
    score = 0
    for question in questions:
        answer = input(question.prompt)
        if answer == question.answer:
            score += 1
    print("Das war super", score, "war wohl nichts", len(questions))


if __name__ == "__main__":
    run_quiz(QUESTIONS)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten