Python Verzweigung Anfänger Problem.

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
Bauchnabelfusseln
User
Beiträge: 1
Registriert: Montag 12. August 2019, 19:08

Hallo zusammen,

Ich verschuche grade Python mit Hilfe eines Buches zu lernen.
Darin entwickelt man ein Kopfrechen"spiel" immer weiter... Um mehr Verständnis zu bekommen versuche ich aber auch die einzelnen Üungen noch weiter zu denken und meine eigenen Schritte und Ideen einfließen zu lassen.
Dabei bin ich jetzt auf folgendes Problem gestoßen:

Es sollen zufällige Zahlen generiert werden, welche die Aufgabe bilden.
Die Abfrage des Ergebnisses soll so lange durch laufen, bis dieses richtig eingegeben wurde. Dazu soll dann die Anzahl der Versuche ausgegeben werden.
So weit kein Problem... Nun wollte ich aber hinzufügen, dass bei richtigem Ergebnis gefragt wird, ob man noch einmal spielen möchte.
Bei der Abfrage würde ich gerne in durch eine If Verzweigung regeln was passiert, je nachdem was der Benutzer eingibt.

Mein Problem ist, dass egal was man eingibt (solange es nicht "Nein" ist) eine neue Aufgabe gestellt wird.

Mein "Code" : :lol:
Ich hoffe mir kann geholfen werden :D
Danke im Voraus!

Code: Alles auswählen

#Zufallsgenerator
import random
random.seed()

#Werte und Berechnungen
a = random.randint(1,10)
b = random.randint(1,10)
c = a + b
print("Die Aufgabe:", a, "+", b)

#Variablen zuordnen
fehler = 1
versuch = 0

#While Schleife läuft so lange Fehler den Wert 1 hat
while fehler == 1:
    print("\nGeben Sie ihr Ergebnis in ganzen Zahlen ein!")
    e = input()
    try:
        #Try Block zum testen ob die Eingabe eine ganze Zahl war
        eingabe = int(e)
        if eingabe == c:
            #Verzweigung zum testen auf das richtige Ergebnis
            versuch = versuch + 1
            print("Ihr Ergebnis ist richtig")
            print("Sie haben", versuch, "Versuche gebraucht")
            fehler = 0
	    print("\nNoch einmal?")
            abfrage = str(input())
            if abfrage == 'ja' or 'Ja' or 'JA':
                #Verzweigung falls eine neue Aufgabe gestellt werden soll
                a = random.randint(1,10)
                b = random.randint(1,10)
                c = a + b
                print("Die neue Aufgabe:", a, "+", b)
                fehler = 1
                versuch = 0
                continue
            elif abfrage == 'nein' or 'Nein' or 'NEIN':
                #beenden wenn keine neue Aufgabe gewünscht ist
                quit()
            else:
                print("Keine richtige Eingabe")
        else:
            #Trifft zu wenn das Ergebnis falsch ist
            print("Das Ergebnis ist nicht richtig")
            versuch = versuch +1
    except:
        #Trifft zu wenn keine ganze Zahl eingegeben wurde
        print("Keine ganze Zahl eingegeben")
        continue
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

`or` ist kein umgangssprachliches Oder sondern eine logische Operation, die bei Dir immer "wahr" ergibt, weil ein nicht-leerer String wahr ergibt. Du solltest entweder str.upper verwenden oder den in-Operator.

Die beiden Zufallszahlen werden an zwei Stellen im Code erzeugt, besser wäre es nur eine Stelle zu haben. Das würde aber auch bedeuten, dass man zwei verschachtelte Schleifen braucht, eine äußere, die ein ganzes Spiel wiederholt, und eine innere, die nur einen Spielzug wiederholt.

Das random.seed am Anfang ist überflüssig und kann weg, solange man keinen konkreten Startwert für die „Zufallszahlen“ angibt, um immer die gleichen zu bekommen.

Keine nakten Excepts, denn die greifen auch bei allen möglichen Fehlern, die nichts mit der Zahlumwandlung zu tun haben, also z.B. falsch geschriebenen Variablennamen. Hier willst Du nur die Exception ValueError abfangen
Der try-Block sollte auch so klein wie möglich machen, nur um ›eingabe = int(e)‹.
`quit` sollte man nicht benutzen, sondern ganz normal die Schleife verlassen, wie Du es ja bei "Keine richtige Eingabe" auch machst.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Bauchnabelfusseln: Die Abfrage verhält sich anders als du erwartest. Am Beispiel für Ja wäre dies hier gleichwertig:

Code: Alles auswählen

if abfrage == 'ja' or 'Ja' or 'JA':
# =>
if abfrage == 'ja' or bool('Ja') == True or bool('JA') == True:
    (...)
Wie man sieht, kann diese Abfrage niemals zu False ausgewertet werden, da der zweite und dritte Teil immer wahr ist.

Stattdessen schreibt man das besser so:

Code: Alles auswählen

if abfrage in ('ja', 'Ja', 'JA'):
    (...)
Üblicher zum Ignorieren von Groß- und Kleinschreibung ist aber sowieso die Nutzung von lower():

Code: Alles auswählen

if abfrage.lower() == 'ja':
    (...)
Antworten