Seite 1 von 1
Quiz Fragen mischen
Verfasst: Samstag 21. September 2019, 17:36
von SaberGFX
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.
Re: Quiz Fragen mischen
Verfasst: Samstag 21. September 2019, 19:52
von Fire Spike
du kanst die Anworten mischen wenn du die in eine liste schreibst und die mit
zufällig vermischt.
Die Liste wird an Ort und Stelle gemischt!
Re: Quiz Fragen mischen
Verfasst: Samstag 21. September 2019, 21:12
von Sirius3
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.
Re: Quiz Fragen mischen
Verfasst: Sonntag 22. September 2019, 09:03
von SaberGFX
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()
Re: Quiz Fragen mischen
Verfasst: Sonntag 22. September 2019, 09:41
von ThomasL
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()
Re: Quiz Fragen mischen
Verfasst: Sonntag 22. September 2019, 09:47
von SaberGFX
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
Re: Quiz Fragen mischen
Verfasst: Sonntag 22. September 2019, 11:19
von SaberGFX
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)
Re: Quiz Fragen mischen
Verfasst: Sonntag 22. September 2019, 11:44
von __blackjack__
@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.
Re: Quiz Fragen mischen
Verfasst: Sonntag 22. September 2019, 11:49
von __blackjack__
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)