@PatrickF: Die Wahl der Optionen darf halt nicht ausserhalb erfolgen, wenn diese Wahl das ist was (potentiell) wiederholt werden soll, denn was wiederholt werden soll muss ja in der Schleife stehen, dafür ist sie ja da.
Was man so nicht macht ist Code vor der Schleife zu wiederholen der dann auch noch mal in der Schleife steht. Du willst die Bedingung nicht ausserhalb der Schleife auswerten, sondern wirklich *in* der Schleife, im Schleifenkörper und nicht als Schleifenbedingung. Denn was Du haben willst ist eine nachprüfende Schleife, also eine wo erst am Ende die Abbruchbedingung geprüft wird. Das sind in Python Endlosschleifen, also ``while True:`` wo in der Schleife mit ``if`` geprüft und gegebenenfalls mit ``break`` die Schleife verlassen wird. Man kann auch, wo es Sinn macht, dann auch noch Code nach dem Abbruch schreiben, für den Fall dass dieser Fall nicht genommen wird.
Weitere Anmerkungen: Verwende keine kryptischen Abkürzungen als Namen. `random` sollte man nicht `rd` abkürzen. Das macht das Programm einfach nur unnötig schwerer zu lesen und spart hier noch nicht einmal Tastendrücke. Was an sich kein Wert ist, denn Quelltext wird deutlich öfter gelesen als geschrieben, also sollte man mehr Wert auf Lesbarkeit als auf wenig tippen legen.
Statt `antwort` in drei Teilbedingungen gegen einzelne Werte zu testen, kann man auch testen ob `antwort` in einer Sequenz von Werten vorkommt.
Das ``continue`` macht an der Stelle keinen Sinn weil es zu unerreichbarem Code führt. Generell sollte man mit ``continue`` eher sparsam umgehen, weil das ein Sprungbefehl ist, den man nicht an der Einrückung ablesen kann. Das kann überraschend für den Leser sein und Probleme beim Refactoring machen.
`sys.exit()` sollte man nur verwenden wenn man wenigstens potentiell einen anderen Rückgabecode als 0 an den Aufrufer des Programms übermitteln will. Das ist kein Ersatz oder Notausgang für Fälle wo man sich um einen sauberen Weg durch den Programmablauf drücken möchte.
Man kann sich etwas Code und Daten(teil)wiederholungen sparen wenn man die Wahl dynamisch in den Text hineinformatiert, statt das mit ``if``/``else`` auszuprogrammieren.
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import random
def main():
while True:
while True:
antwort = input("Kopf oder Zahl (k/z), e für Ende: ")
if antwort in ["k", "z", "e"]:
break
print("Fehler")
if antwort == "e":
print("Vielen Dank für das Spiel!")
break
wahl = random.choice(["Kopf", "Zahl"])
if antwort == wahl[0].lower():
print("Gewonnen")
print(f"Ich habe auch {wahl} gewählt\n")
else:
print("Pech!")
print(f"Ich habe {wahl} gewählt\n")
if __name__ == "__main__":
main()