Hallo, weiß jemand was an diesem Programm falsch ist?

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
Noah1379
User
Beiträge: 6
Registriert: Freitag 14. Januar 2022, 21:11
Wohnort: Düsseldorf

Hallo, weiß jemand was an diesem Programm falsch ist? :?:

<def pruef_rate(antwort, loesung):>
<global punkte>
< noch_rate = False
< versuch = O>
< while noch_rate and versuch < 3:>
< if rate.lower() == antwort.lower():>
< print('Richtige Antwort')>
< punkte = punkte + 1>
<noch_rate = False>
<else:>
<if versuch < 2:>
<rate = input('Falsch. Versuche es erneut ')>
<versuch = versuch + 1>

<if versuch == 3:>
<print ('Die richtige Antwort ist ' + antwort)>

punkte = 0

print('Rate das Tier')
rate1 = input('Welcher Bär lebt am Nordpol? ')
pruef_rate(rate1, 'Eisbär')
rate2 = input('Was ist das schnellste Landtier? ')
pruef_rate(rate2, 'Gepard')
rate3 = input('Was ist das größte Tier? ')
pruef_rate(rate3, 'Blauwal')

print('Deine Punktzahl ist ' + str(punkte))

Wenn ich auf die erste Frage antworte kommt immer nur:
Rate das Tier
Welcher Bär lebt am Nordpol? Eisbär
Traceback (most recent call last):
File "/Users/noahhoffmann/Library/Mobile Documents/com~apple~CloudDocs/Programmieren/Tierquiz.py", line 22, in <module>
pruef_rate(rate1, 'Eisbär')
File "/Users/noahhoffmann/Library/Mobile Documents/com~apple~CloudDocs/Programmieren/Tierquiz.py", line 4, in pruef_rate
versuch = O
NameError: name 'O' is not defined

Ich bin neu in Python und kenn mich noch nicht so gut mit den Fehlermeldungen aus.
Ich würde mich über eine Antwort freuen. :D
Noah1379
User
Beiträge: 6
Registriert: Freitag 14. Januar 2022, 21:11
Wohnort: Düsseldorf

Ich hatte eigentlich versucht, dass die Zeilen die mit <> umklammert sind ihre Position behalten. Weiß jemand wie das funktioniert?
nezzcarth
User
Beiträge: 1765
Registriert: Samstag 16. April 2011, 12:47

Im Editor gibt es den Button "</>" um Quelltext zu formatieren. Da bleibt dann auch die Einrückung erhalten.

Das eigentliche Problem steht ja ganz gut in der Fehlermeldung: Es wurde der Buchstabe O verwendet, obwohl da wohl eine Null stehen soll. Stell den formatierten Quelltext vielleicht noch mal ein; soweit ich das erkennen kann, gibt es noch mehr Verbesserungspunkte an dem Code, über die man dann besser reden kann.
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Fehler ist doch eindeutig. Die Variable `O` ist nicht definiert. `O` ist etwas anderes als `0` (null)

Vergiss gleich wieder, dass es `global` überhaupt gibt. Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen. Eine Funktion `pruef_rate` sollte erst gar nicht Punkte zählen, sondern nur als Rückgabewert sagen, ob die Antwort richtig war, oder nicht.

Flags für while-Schleifen benutzt man selten, da man mit `break` viel klarer den Wunsch, die Schleife abzubrechen ausdrücken kann (oder hier gleich per `return`).
Dann ist die if-Abfrage am Ende auch nicht mehr nötig und die while-Schleife wird zu for-Schleife.
Statt Strings per + zusammenzustückeln benutzt man Formatstrings.

In `pruefe_rate` prüfst Du das falsche.
Statt Code zu kopieren und leicht anzupassen, benutzt man passende Datenstrukturen, hier eine Liste mit Fragen und Antwort.

Code: Alles auswählen

def pruef_rate(antwort, loesung):
    for versuch in range(3):
        if versuch > 0:
            antwort = input('Falsch. Versuche es erneut ')
        if loesung.lower() == antwort.lower():
            print('Richtige Antwort')
            return True

    print (f'Die richtige Antwort ist {antwort}.')
    return False


fragen = [
    ('Welcher Bär lebt am Nordpol? ', 'Eisbär'),
    ('Was ist das schnellste Landtier? ', 'Gepard'),
    ('Was ist das größte Tier? ', 'Blauwal'),
]

punkte = 0
print('Rate das Tier')
for frage, loesung in fragen:
    antwort = input(frage)
    if pruef_rate(antwort, loesung):
        punkte += 1

print(f'Deine Punktzahl ist {punkte}')
Antworten