Ich habe vor ein paar Tagen einen vierstündigen Python-Videokurs für Anfänger durchgearbeitet und dachte mir dann, dass der beste Weg, um tiefer in die Materie einzusteigen, ein eigenes Projekt wäre. Da ich nicht auf ein bestimmtes Ziel hinarbeite, lerne ich also die Dinge, die sich im Laufe meines Projektes als notwendig herauskristallisieren.
Ein kleines Spiel schien mir ein guter erster Schritt. Irgendwie gibt es immer noch ein Feature, was sich sinnvoll einbauen lässt.
Was ich euch hier vorstelle, ist die lauffähige Version 1.0.0.0. Ob es bei so einem kleinen Projekt sinnvoll ist, da Versionsnummern einzuführen, sei mal dahingestellt. Schaden kann es aber auch nicht und falls das Projekt doch wider aller Erwartungen größer wird, ist es als Übersicht über die einzelnen Entwicklungsschritte sicherlich auch ganz hilfreich.
Anfangs hatte ich noch einige Probleme, die sich vor allem in den Feinheiten zeigten. Ich benutzte zu viele Datentypen (Strings, Listen, Sets), die ich hin und her konvertiert habe, um die gewünschte Funktionalität zu gewährleisten. Später konnte ich das deutlich vereinfachen, obwohl bestimmte Abschnitte bestimmt noch immer unnötig kompliziert sind.
Ich habe versucht das Ganze so sauber wie möglich zu programmieren. Dies betrifft Variablen- und Funktionsnamen, Kommentare und das, was man gemeinhin als "guten Stil" bezeichnet. Zumindest das, was ich für guten Stil halte. Mangels Erfahrung mag das stellenweise gründlich schiefgegangen sein.
Was ich mir von euch wünsche sind Kommentare zu praktisch allen Aspekten meines Scriptes. Ungünstige Variablennamen, verkomplizierte Prozesse, schlechter Kommentarstil oder schlechter Stil allgemein und quasi allem anderen. Wenn ihr mit Blick auf die Tatsache, dass ich erst seit ein paar Tagen dabei bin, auch etwas Nettes anzumerken habt, nehme ich das natürlich auch gerne an. Sowas hält nämlich die Motivation aufrecht. Wenn der Ton stimmt, und ich habe keinen Grund, etwas anderes anzunehmen, kann ich Kritik aber gut aushalten und setze das gerne um. Ich will ja letztendlich besser werden.
Fragen, warum ich etwas so und nicht anders gemacht habe, werde ich so gut es geht beantworten.
Auch Anregungen für künstige Features sind gerne gesehen.
Kurze Projektbeschreibung:
Zu Galgenmännchen gibt es nicht viel zu sagen. Das Script wählt einen zufälligen Begriff aus einer Datei und gibt ihn mit "_" anstelle von Buchstaben aus. Man rät so lange Buchstaben, bis man entweder 3 Fehlversuche oder das Wort erraten hat. Man kann sich auch Hinweise holen. Hinweise verraten einen zufälligen Buchstaben. Die Anzahl der Hinweise ist derzeit nicht begrenzt.
Mögliche künftige Features:
- verschiedene Kategorien
- ein GUI
- die Möglichkeit, selbst Kategorien hinzuzufügen
Das Script:
Code: Alles auswählen
import random, sys, codecs, re, string
version = "1.0.0.0"
def new_game():
global word_to_guess, letters_guessed, i, fails, play, clean_word_to_guess
# Liest eine zufällige Zeile aus der Datei "tiere.txt" und entfernt Zeilenumbrüche
word_to_guess = random.choice(codecs.open("tiere.txt", "r", "utf-8").readlines()).strip("\n\r") # -> raw_word_to_guess
clean_word_to_guess = re.sub('[- ]', '', word_to_guess).lower() # Bindestriche und Leerzeichen entfernen
letters_guessed = "" # Liste aller geratener Buchstaben
i = 1 # Schleifenzähler
fails = 0 # Anzahl der Fehlversuche
play = True # Spiel läuft
print_word(letters_guessed) # Erste Ausgabe
def print_word(letters):
global clean_word_to_guess # Vorher: "referenced before assignment"
for letter in word_to_guess: # Prüfen: Es wird ein Buchstabe zu viel ausgegeben
# Wenn der Buchstabe ein Bidnestrich oder Leerzeichen ist ...
if letter == "-" or letter == " ":
sys.stdout.write(letter + " ")
# Wenn der geratene Buchstabe im gesuchten Wort enthalten ist ...
elif set(letters) & set(word_to_guess.lower()) and letter.lower() in letters_guessed:
sys.stdout.write(letter + " ")
# Eratenen Buchstaben aus dem Set löschen
check_word = clean_word_to_guess.replace(letter.lower(), "")
clean_word_to_guess = check_word
else:
# Anderenfalls Unterstrich ausgeben
sys.stdout.write("_ ")
def is_valid(user_input):
valid_chars = "abcdefghijklmnopqrstuvwxyz1" # String mit allen validen Zeichen
if len(user_input) > 1 or user_input.lower() not in valid_chars: # Wenn die Eingabe mehr als ein Zeichen hat oder nicht valide ist
return False
else:
return True
print("Viel Spaß bei Galgenmännchen v" + version +"\n") # Beim ersten Start Willkommensnachricht und Versionsnummer ausgeben
new_game() # Initialisiert die Variablen für ein neues Spiel
while True:
print("\nFehlversuche: " + str(fails))
print("(1) eingeben, um einen Hinweis zu bekommen")
# Buchstaben eingeben und zur Liste "letters_guessed" hinzufügen
user_letter = input("Geben sie einen Buchstaben ein (" + str(i) +". Versuch): ").lower()
print()
if is_valid(user_letter): # Wenn der Buchstabe valide ist ...
if user_letter in clean_word_to_guess:
letters_guessed = letters_guessed + user_letter
i += 1
else:
if user_letter == "1":
hint = random.choice(clean_word_to_guess)
letters_guessed = letters_guessed + hint
check_word = clean_word_to_guess.replace(hint.lower(), "")
clean_word_to_guess = check_word
else:
fails += 1
i += 1
else:
print("Fehler: Das ist keine valide Eingabe!\n")
print_word(letters_guessed) # Liste aller geratener Buchstaben an print_word übergeben
if fails == 3 or len(clean_word_to_guess) == 0:
print()
if fails == 3:
print("Das war dein dritter Fehlversuch. Du hast verloren.")
print("Das gesuchte Wort war " + word_to_guess)
else:
print("Herzlichen Glückwunsch! Du hast das Wort erraten.")
keep_playing = input("Möchtest du nochmal spielen (j/n)? ")
# Wenn eines neues Spiel gestartet werden soll ...
if keep_playing == "j":
print()
new_game()
else:
break
Mit leicht nervösen Grüßen,
Hart mit Bart