"Break" outside Loop

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
CTexx
User
Beiträge: 2
Registriert: Sonntag 2. Oktober 2022, 23:47

Hallo,

ich bin ein ziemlicher Neuling im programmieren und bin grad dabei mir es selber beizubringen.

Nun versuche ich grad ein Schere, Stein, Papier Spiel zu erstellen, bin jedoch auf ein Problem gestoßen.

Ich will hier sichergehen, dass man auch wirklich "Rock", "Paper" oder "Scissors" eingeben muss und möchte ansonsten die Funktion nochmal ausführen beziehungsweise bei richtiger Eingabe die Funktion beenden.
Jedoch läuft die Funktion bei richtiger Eingabe immer weiter, und ich bekomm mit dem "break" am Ende immer eine Fehlermeldung "break outside loop". Kann mir da einer weiterhelfen? Wird nicht allzu schwer sein denke ich. ^^

Code: Alles auswählen

def get_player_choice():
    choice2 = str(input("Enter Rock, Paper or Scissors:"))
    if choice2 != "Rock" or choice2 != "Paper" or choice2 != "Scissors":
        get_player_choice()
    else:
        break
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Du solltest das mit einer while-Schleife lösen, statt mit Rekursion, dann klappt es auch mit dem break:

Code: Alles auswählen

while True:
    choice = input(...)
    if ...:
       break
Und einen String braucht man nicht nochmals mittels str() in einen String umwandeln.
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast keine Schleife, also kann man auch nicht break benutzen.
input liefert bereits einen String, der Aufruf von str ist unnötig.
Benutze keine Zahlen an Variablennamen, weil die nichts aussagen.
Ein String ist immer entweder ungleich dem einen Wert oder dem anderen Wert. Wenn Du "Rock" eingibst, dann ist choice != "Rock" zwar False, aber ein choice != "Paper" ist True, also wird der if-Block betreten. Einfacher ist der positive Test, beim Negieren wird hier or zu and.
Man benutzt keine Rekursion als Schleifenersatz. Rekusion ist in manchen Fällen sinnvoll, meistens macht es aber das Verstehen des Codes schwieriger.
Es fehlt ein `return` um die Eingabe auch zurückzugeben.

Code: Alles auswählen

def get_player_choice():
    while True:
        choice = input("Enter Rock, Paper or Scissors:")
        if choice in ["Rock", "Paper", "Scissors"]:
            break
    return choice
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Ergänzend zu Sirius3 kannst Du die while Schleife auch mit einem return verlassen, wenn sich diese in einer Funktion befindet:

Code: Alles auswählen

def get_player_choice():
    while True:
        choice = input("Enter Rock, Paper or Scissors:")
        if choice in ["Rock", "Paper", "Scissors"]:
            return choice
Ob dies besserer Stil ist, sei einmal dahingestellt.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was mich als Benutzer nerven würde, ist das man komplette Worte eingeben muss, und dann auch noch darauf achten muss, dass man den ersten Buchstaben gross schreibt. Das würde ich nicht oft oder lange spielen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten