Hallo und willkommen im Forum!
Bei deinem Programm kann man noch eine ganze Menge verbessern, ich fange einfach mal von oben nach unten an:
- Funktionen sollten (in der Regel) eine Tätigkeit beschreiben, daher enthalten diese typischerweise ein Verb. Deine Funktion "wortWahl" sollte daher besser "wort_waehlen" oder ähnlich heißen. Bei der Gelegenheit kannst du auch einen Blick auf PEP 8 werfen. Funktionsnamen werden in Python durch_unterstriche_getrennt.
- Die Verwendung von "global" ist eine ganz schlechte Idee. Damit schaffst du Abhängigkeiten im Code, welche nur schwer zu überblicken sind. Dadurch entstehen sehr leicht Fehler, welche dazu noch schwer zu finden sind. Werte betreten eine Funktion in der Regel über Parameter und verlassen sie über den Rückgabewert. Das solltest du dir ganz schnell angewöhnen. Vergiss also am besten gleich, dass es "global" überhaupt gibt. Wenn du das verwendest, dann machst du etwas falsch.
- Deine Funktion zur Wortauswahl ist äußert ungeschickt, du machst ganz oft das selbe. Du wandelst das Wort, auch noch per Hand, in eine Liste um und hängst das an "wort" an (was eine ganz schlechte Idee ist; sie Rückgabewerte). Wie stellst du dir das vor, wenn du tausende von Wörtern hast? Willst du für jedes Worte extra drei Zeilen Code schreibe? Sicher nicht, daher verwendest du am besten entsprechende Datenstrukturen und passt die Auswahlfunktion entsprechen an:
Code: Alles auswählen
WOERTER = "Maus", "Tastatur", "Drucker", "Mac", "Buch"
def wort_waehlen():
return random.choice(WOERTER).lower()
Das macht das gleiche wie deine Funktion, nur in kurz und in sauber.
- Du verwendest offensichtlich noch Python 2.x, dort ist print noch ein Statement. Die Klammern nach dem print solltest du daher weglassen
- Wenn du einen String sehr oft wiederholen möchtest, zum Beispiel in deiner "linie"- oder "aufgabe"-Funktion, dann kannst du dazu die Multiplikation verwenden:
- Warum heißt die "aufgabe"-Funktion "aufgabe"? Es wird doch gar keine Aufgabe gestellt.
- "erneutSpielen" ist auch verbesserungswürdig. Statt mehrfach auf Gleichheit zu testen, bietet sich der in-Operator an:
Auch sollte man das Programm nicht einfach so mit "sys.exit" verlassen. Schon gar nicht aus einer Funktion in die man hineingesprungen ist, das ist sehr unübersichtlich.
- Code sollte nie auf modulebene stehen, da gehören nur Importe, Konstanten und Definitionen von Funktion und Klassen hin. Andernfalls gibt es Probleme, falls du dein Modul mal importieren möchtest. In Python gibt es dazu ein Idiom:
In die main-Funktion packst du dann alles rein, was dein Spiel startet. So kannst du einzelene Funktionen aus deinem Programm wiederverwenden und es ist gleich ersichtlich, wo in dein Programm eingestiegen wird.
- "spielen" ist vollkommen überflüssig, du verwendest es nirgends.
- ``while x == True`` ist total überflüssig. Wenn x den Wert True hatte, dann kommt nur wieder True raus, wenn nicht, dann eben False. Du kannst also gleich ``while x`` schreiben.
- Du solltest mehr auf Funktionen setzen. Damit lässt sich viel Übersichtlichkeit schaffen und du kannst einzelne Teile wiederverwenden. Die Abfrage eines neuen Buchstaben bietet sich dazu an:
Code: Alles auswählen
def buchstabe_abfragen():
while True:
buchstabe = raw_input("Buchstaben eingeben:").lower()
if len(buchstabe) != 1:
print "Es muss genau ein Buchstabe eingegeben werden!"
print
elif buchstabe not in string.ascii_lowercase:
print "Es hadelt sich nicht um einen gültigen Buchstaben!"
print
else:
return buchstabe
- Generell ist deine ganze Logik des Programms etwas zu kompliziert geworden. Ich mache einfach mal einen Gegenvorschlag:
Code: Alles auswählen
#coding: utf-8
import random
import string
WOERTER = "Maus", "Tastatur", "Drucker", "Mac", "Buch"
MAX_FEHLER = 8
def wort_waehlen():
return random.choice(WOERTER).lower()
def buchstabe_abfragen():
while True:
buchstabe = raw_input("Buchstaben eingeben:").lower()
if len(buchstabe) != 1:
print "Es muss genau ein Buchstabe eingegeben werden!"
print
elif buchstabe not in string.ascii_lowercase:
print "Es hadelt sich nicht um einen gültigen Buchstaben!"
print
else:
return buchstabe
def wort_anzeigen(loesung, eingaben):
print "".join("_" if c not in eingaben else c for c in loesung)
def abfragen(frage):
eingabe = raw_input(frage)
return eingabe in ("j", "ja")
def main():
while True:
loesung = wort_waehlen()
eingaben = set()
wort_anzeigen(loesung, eingaben)
fehler = 0
while fehler < MAX_FEHLER:
buchstabe = buchstabe_abfragen()
if buchstabe not in loesung:
fehler += 1
eingaben.add(buchstabe)
wort_anzeigen(loesung, eingaben)
if set(loesung).issubset(eingaben):
#Lösung erraten
print "Richtig!"
print
break
else:
#Lösung nicht erraten
print "Es wurden zu viele Fehler gemacht, die Lösung lautet:"
print loesung
print
if not abfragen("Noch eine Runde spielen?"):
break
if __name__ == "__main__":
main()
Bei dem Code kann man auch noch einiges besser machen, so weicht der Vorschlag aber nicht zu weit von deiner Lösung ab.
Das Leben ist wie ein Tennisball.