Quiz

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

ich habe soeben versucht ein Quiz u programmieren leider läuft das programm nicht so wie es soll, brauche Hilfe

Code: Alles auswählen

import random

fragen_liste = []

richtige_antwort_liste = []

moegliche_antworten_lsiet = []

class Moegliche_Antworten:
    def __init__(self,a,b,c):
        self.a = a
        self.b = b
        self.c = c

def eingabe():
    while True:
        eingabe_frage = input("Frage >>")
        if eingabe_frage == "beende":
            return
        eingabe_antwort_a = input("Antwort A >>")
        eingabe_antwort_b = input("Antwort B >>")
        eingabe_antwort_c = input("Antwort C >>")
        richtige_antwort = input("Richtige Antwort (a,b,c) >>")
        fragen_liste.append(eingabe_frage)
        richtige_antwort_liste.append(richtige_antwort)
        moegliche_antworten_lsiet.append(Moegliche_Antworten(eingabe_antwort_a,eingabe_antwort_b,eingabe_antwort_c))


def quiz():
    while True:
        zahl = random.randint(1,len(fragen_liste)-1)
        print (fragen_liste[zahl])
        print ("a - " + moegliche_antworten_lsiet[zahl].a)
        print ("b - " + moegliche_antworten_lsiet[zahl].b)
        print ("c - " + moegliche_antworten_lsiet[zahl].c)
        eingabe_antwort = input("Richtig ist (a,b,c) >>")
        if eingabe_antwort == richtige_antwort_liste[zahl]:
            print ("Richtg")
        elif eingabe_antwort == "beende":
            return
        else:
            print ("richtig waere " + richtige_antwort_liste[zahl])

def ausgabe():
    zahl = 0
    while zahl < len(fragen_liste) - 1:
        print (fragen_liste[zahl])
        print ("a - " + moegliche_antworten_lsiet[zahl].a)
        print ("b - " + moegliche_antworten_lsiet[zahl].b)
        print ("c - " + moegliche_antworten_lsiet[zahl].c)
        print (richtige_antwort_liste[zahl])
        print ("________________________________")
        zahl = zahl + 1


while True:
    befehl = input("Befehl >>")


    if befehl == "eingabe":
        eingabe()

    elif befehl == "quiz":
        quiz()

    elif befehl == "ausgabe":
        ausgabe()

    elif befehl == "beende":
        break

    else:
        print("einagabe | quiz | ausgabe | beende")
Zuletzt geändert von Anonymous am Freitag 28. Juli 2017, 21:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brevista: wie soll es denn laufen?
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

zuerst soll die der Befehl ausgegeben werden d.h. entweder eingabe, ausgäbe, Quiz oder beende

wenn eingabe als Befehl eingegeben wird soll eingabe() ausgeführt werden dort soll dann die frage die Antwortmöglichkeiten und die richtige Antwort eingegeben werden.

wenn Quiz eingegeben wird soll eine zufällige frage und die Antwortmöglichkeiten ausgegeben werden. dann Sol der Benutzer die Antwort eingeben ist die richtig soll "richtig" ausgegeben werden, wenn sie falsch ist die richtige Antwort.

wenn ausgabe eingegeben wird sollen alle fragen und die richtigen antworten dazu ausgegeben werden.

bei beende soll das Programm beendet werden
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brevista: und wo läuft es nicht so, wie Du willst?
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

Wenn ich zu beginn z.b. "eingabe" schreibe werde ich nicht in die if eingabe == "eingabe" geleitet sonder in die else schleife also wird wieder erneut nach dem Befehl gefragt
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

dann lass' dir doch mal zwecks debugging zwischen `eingabe = ...` und dem `if` den Wert der Variabeln `eingabe` mittels `print` ausgeben - offensichtlich wird ja die Bedingung nicht erfüllt.

Was man bei so was auch normalerweise macht, um unabhängig von Groß- / Kleinschreibung zu sein, ist so was:

Code: Alles auswählen

if befehl.lowercase() == "eingabe":
Dann ist es schon mal egal, ob du "Eingabe" oder "eingabe" oder "EiNgAbE" eingibst.

Wie du die Klasse im Listing verwendest macht das auch wenig Sinn... Die Klasse kann man ohne Probleme (und sinnvoller) auch als Liste oder Named Tuple schreiben und die erzeugst nirgendwo eine Instanz der Klasse.

Gruß, noisefloor
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brevista: man schreibt nicht 73 Zeilen Code ohne die einzelnen Teile zu testen. Du scheinst schon nicht zu wissen, was »input« macht und was dessen Rückgabewert ist. Am besten Du gibts den Wert von »befehl« nach der Eingabe aus.

Dann sind da noch ein paar grundsätzliche Dinge, mit denen man erst gar nicht anfangen sollte, weil sie später schlimme Folgen haben: globale Variablen, zusammengehörige Dinge in verschiedenen Listen zu speichern, schlechte Variablennamen.
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

Eine frage zu Input, wieso wird nicht einfach das was man schreibt (wenn man das Input printet) ausgegeben Sondern etwas anderes?
bei anderen Programmen die ich früher programmiert habe hat es funktioniert das nur das was man eingegeben hat auch so der variable zugeordnet wird, wieso geht das hier nicht und wie muss ich es machen
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Eine frage zu Input, wieso wird nicht einfach das was man schreibt (wenn man das Input printet) ausgegeben Sondern etwas anderes?
Was schreibst du denn und was wird ausgeben? Wenn du mal ein paar mehr Infos liefern würdest, aka beschreibst, was du _genau_ tust, wäre das hilfreich. "Funktioniert nicht" oder "es wird etwas anderes ausgegeben" ist nun mal wenig hilfreich...

Abgesehen davon funktioniert das eigentlich... Beispiel mit Python 3.5.:

[codebox=pycon file=Unbenannt.txt]>>> s = input('Eingabe: ')
Eingabe: foo
>>> s
'foo'
>>> if s == 'foo':
... print('Du hast foo eingegeben')
... else:
... print('Du hast was anderes eingeben')
...
Du hast foo eingegeben
>>>
[/code]

Gruß, noisefloor
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

Code: Alles auswählen

Befehl >>ausgabe
<function ausgabe at 0x107e39050>
einagabe | quiz | ausgabe | beende
Befehl >>
oder wenn ich es normal ausführe

Code: Alles auswählen

Befehl >>eingabe
einagabe | quiz | ausgabe | beende
Befehl >>
BlackJack

@Brevista: Du verwendest offenbar Python 2.x, da möchtest Du nicht `input()` sondern `raw_input()` verwenden. Und vielleicht auch nicht die unnötigen Klammern bei ``print`` verwenden als wäre das eine Funktion. Dann hätten wir nämlich viel schneller gesehen das das Python 2 ist und `input()` die falsche Funktion ist. :-)
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

ich benutze Pycharm 2017.2, wo kann ich einsehen welche Version von Python ich habe?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Brevista hat geschrieben:ich benutze Pycharm 2017.2, wo kann ich einsehen welche Version von Python ich habe?
Pycharm kann jeden Python Interpreter verwenden den du installiert hast. Für dein aktuelles Projekt schaust du unter ->File->Settings und suchst da "Project Interpreter".
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

ok vielen dank, jetzt läuft es auch danke :)
Antworten