@DeinError404: Ich habe mir mal den gesamten Quelltext in dem verlinkten Gist angeschaut.
Um Bedingungen bei ``while`` (und auch bei ``if``/``elif``) gehören keine Klammern.
Du hast eine sehr inkonsistente Leerzeichensetzung vor Aufrufklammern. Mal ist da eins, mal nicht. Da gehört keins hin.
Das die äusserste ``while``-Schleife läuft solange `game` wahr ist und abbricht wenn `game` unwahr ist, finde ich ziemlich verwirrend. Man würde das genau umgekehrt erwarten.
`user` heisst auf deutsch „Benutzer“/„Anwender“. Es wird aber bei keinem `input()` ein Benutzer oder Anwender eingegeben. Zudem sind die Namen für die Eingaben durchnummeriert, was ein Zeichen mehr dafür ist, das man sich hier *passende* Namen überlegen sollte.
`input()` liefert bereits eine Zeichenkette, da macht ein `str()`-Aufruf keinen Sinn.
Der Code-Teil mit der Frage ob der Anwender noch eine Runde spielen möchte ist drei mal im Quelltext vorhanden. Man vermeidet als Programmierer sowohl Daten- als auch Code-Kopien im Quelltext. Das macht das Programm aufgeblähter und fehleranfälliger, weil man Änderungen immer an allen Kopien und bei allen gleichwertig machen muss. Da besteht die Gefahr das man eine Kopie vergisst, oder leicht anders ändert als die anderen. Die Frage ob noch eine Runde gespielt werden soll gehört hinter die Schleife die für die Runde zuständig ist. Immer wenn man Code kopiert und einfügt ist das ein „code smell“ und man sollte sich überlegen ob man das durch eine andere Strukturierung, eine Schleife, eine Funktion/Methode, oder eine Kombination davon vermeiden kann.
Das ``elif strike == 10`` ist überflüssig, ein ``else`` tut es hier auch.
Auch ber der Erhöhung und Auswertung der `strikes` ist wieder Code kopiert worden.
Das `erraten` auf `True` gesetzt wird wenn man 10 Fehlversuche hatte, also das Wort gar nicht erraten wurde ist irreführend. `erraten` braucht man aber eigentlich auch gar nicht. Man kann da eine ”Endlosschleife” (``while True:``) schreiben, die mit ``break`` abgebrochen wird wenn das Wort erraten oder 10 Fehlversuche erreicht sind. Und auch `game` kann man so loswerden.
Die Anzahl der Versuche steht sowohl als Zahl, als auch in einer Zeichenkette im Code. Das würde man als Konstante definieren.
Zwischenstand (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import getpass
MAX_STRIKES = 10
def main():
while True:
word = getpass.getpass(
"Geben Sie das zu erratende Wort ein (nur kleine Buchstaben): "
)
for i in range(1, len(word) + 1):
print(i, "_")
strikes = 0
while True:
guessed_character = input("Geben Sie einen Buchstaben ein: ")
if guessed_character in word:
strike = 0
print(guessed_character, "ist dabei")
for i, character in enumerate(word, 1):
print(
i,
guessed_character
if character == guessed_character
else "_",
)
answer = input("Wollen Sie raten? 'ja' oder 'nein'? ")
if answer == "ja":
guessed_word = input("Wie lautet das Wort? ")
if word == guessed_word:
print(" Das ist korrekt! Herzlichen Glückwunsch!")
break
strike = 1
print("Leider nicht korrekt")
else:
strike = 1
print(guessed_character, "ist nicht dabei")
if strike:
strikes += strike
if strikes < MAX_STRIKES:
print(strikes, "von", MAX_STRIKES, "Fehlversuchen.")
else:
print("Leider verloren! Das Wort war: ", word)
break
while True:
answer = input("Noch eine Runde 'ja' oder 'nein'? ")
if answer == "ja":
print("Neues Spiel, neues Glück!")
break
if answer == "nein":
print("Vielen Dank fürs Spielen. Auf Wiedersehen!")
return
print("Bitte geben Sie 'ja' oder 'nein' ein!")
if __name__ == "__main__":
main()
Für meinen Geschmack ist das zu lang für eine Funktionen. Man könnte mindestens das Spielen einer Runde in eine eigene Funktion heraus ziehen.