while-not-in-Schleife wiederholt sich immer trotz richtiger Eingabe?!

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
Pythius
User
Beiträge: 4
Registriert: Sonntag 10. September 2017, 18:22

Guten Abend,
ich bin ein blutiger Anfänger und habe versucht ein kleines "Spiel" (Schere-Stein-Papier) zu schreiben mit den aktuellen Kenntnissen, die ich mit Python habe (nicht unbedingt viele :? ) . Es geht um einen Fehler den ich einfach nicht finde, habe mir bereits viel Zeit genommen um diesen zu finden, aber alles ohne Erfolg. Und zwar: Egal welche Zahlen ich bei der "Spielerauswahl" eingebe, die while-not-Schleife wird nach der Eingabe IMMER wiederholt, obwohl dies nur bei allen Zahlen AUßER eins, zwei und drei sein sollte und nicht beispielsweise bei vier. Ich bin schon komplett verzweifelt, weil es wahrscheinlich ein ganz primitiver Fehler ist ... :cry:

Hier ist der Code:

#Schere-Stein-Papier 1.0

print("\n"*10)
import random
import time

print("----------------------WILLKOMMEN ZU DIESEM SPIEL!----------------------")
print("| Bitte wähle eine der unteren folgenden Spielfiguren |")
print("| |")
print("| Schere[1] Stein[2] Papier[3] |")
print("-----------------------------------------------------------------------")

#Variablen
figuren = ["Schere", "Stein", "Papier"]
spielen = True

while spielen:

spielerauswahl = 0
while spielerauswahl not in (1, 2, 3):
spielerauswahl = int(input("Wähle deine Spielfigur: "))
spielerfigur = figuren[spielerauswahl-1]

computerfigur = figuren[random.randint(0,2)]

if spielerfigur == computerfigur:
print("Unentschieden! Computer wählte", computerfigur)
elif spielerfigur == "Schere":
if computerfigur == "Stein":
print("Du hast verloren! Computer wählte", computerfigur)
elif spielerfigur == "Stein":
if computerfigur == "Schere":
print("Du hast gewonnen! Computer wählte", computerfigur)
elif spielerfigur == "Papier":
if computerfigur == "Schere":
print("Du hast verloren! Computer wählte", computerfigur)
elif spielerfigur == "Schere":
if computerfigur == "Papier":
print("Du hast gewonnen! Computer wählte", computerfigur)

#Restart?
time.sleep(1)
entscheidung = ""
while entscheidung not in ("y", "n"):
entscheidung = input("\nNochmal spielen? [y]Ja [n]Nein")
if entscheidung == "n":
spielen = False
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pythius: Einrückungen sind wichtig. Schau mal, was da in Deinen while-Schleifen wiederholt wird.
Eingerückt wird immer 4 Leerzeichen pro Ebene und nicht mal 2 und mal 5.

Statt:

Code: Alles auswählen

wert = dummy
while bedingung(wert):
    wert = irgendwas
schreibt man

Code: Alles auswählen

while True:
    wert = irgendwas
    if not bedingung(wert):
        break
Pythius
User
Beiträge: 4
Registriert: Sonntag 10. September 2017, 18:22

Ups! Die Einrückungen sind wohl beim einfachen Reinkopieren verschwunden, tut mir leid!

Code: Alles auswählen

#Schere-Stein-Papier 1.0

print("\n"*10)
import random
import time

print("----------------------WILLKOMMEN ZU DIESEM SPIEL!----------------------")
print("|        Bitte wähle eine der unteren folgenden Spielfiguren          |")
print("|                                                                     |")
print("|           Schere[1]         Stein[2]         Papier[3]              |")
print("-----------------------------------------------------------------------")

#Variablen
figuren = ["Schere", "Stein", "Papier"]
spielen = True

while spielen:

    spielerauswahl = 0
    while spielerauswahl not in (1, 2, 3):
        spielerauswahl = int(input("Wähle deine Spielfigur: "))
    spielerfigur = figuren[spielerauswahl-1]

computerfigur = figuren[random.randint(0,2)]

if spielerfigur == computerfigur:
    print("Unentschieden! Computer wählte", computerfigur)
elif spielerfigur == "Schere":
    if computerfigur == "Stein":
         print("Du hast verloren! Computer wählte", computerfigur)
elif spielerfigur == "Stein":
    if computerfigur == "Schere":
         print("Du hast gewonnen! Computer wählte", computerfigur)
elif spielerfigur == "Papier":
    if computerfigur == "Schere":
         print("Du hast verloren! Computer wählte", computerfigur)
elif spielerfigur == "Schere":
    if computerfigur == "Papier":
         print("Du hast gewonnen! Computer wählte", computerfigur)

#Restart?
time.sleep(1)
entscheidung = ""
while entscheidung not in ("y", "n"):
  entscheidung = input("\nNochmal spielen? [y]Ja [n]Nein")
if entscheidung == "n":
  spielen = False
 
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pythius: Und jetzt schau Dir mal an, was da in Deinen while-Schleifen wiederholt wird.
Pythius
User
Beiträge: 4
Registriert: Sonntag 10. September 2017, 18:22

Ja, soweit ich meine, der Input, der sollte aber doch nur wiederholt werden wenn die Eingabe außerhalb (1, 2, 3) liegt, wegen dem "not in" ?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist nicht Deine einzige while-Schleife.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der Teil funktioniert auch so. Aber der Teil steht in einer `while spielen` Schliefe - und das ist bei dir eine Endlosschleife, weil in dem Block, der von `while spielen` eingeschlossen wird, `spielen` nie verändert wird. Wie Sirius3 schon sagte: Die Einrückungen sind wichtig bzw. stimmen bei dir nicht.

Gruß, noisefloor
Pythius
User
Beiträge: 4
Registriert: Sonntag 10. September 2017, 18:22

Oh, ich hab's gewusst dass es ein primitiver Fehler war ... vielen lieben Dank! :D
Antworten