Hangman / Visual Studio installieren

Bisher haben wir uns ja nur auf der Webseite herumgetrieben und im Prinzip Zeichen ausgegeben und auf Eingaben gewartet. Aber es war, wenn wir die Website zu gemacht haben, haben wir alles verloren. Python können wir jedoch auch auf unserem PC laufen lassen.
Damit uns der Einstieg gelinkt, installieren wir einfach Visual Studio.
Visual Studio-IDE für Python: Python-Entwicklungstools für Windows (microsoft.com)
Die Community Edition von Visual Studio ist frei und wirklich eine der besten Entwicklungsumgebungen, die es gibt.
Nachdem wir das Visual Studio über den obigen Link installiert haben öffnen wir Visual Studio und sehen folgenden Bildschirm:

Wir klicken auf Neues Projekt erstellen und bekommen den nächsten Bildschirm:

Nun wählen wir Python Anwendung und kommen zum nächsten Konfigurationsschirm:

Nun geben wir als Projektname und Projektmappe Hangman ein. Den Pfad kann gleich belassen werden oder nach individuellen Bedürfnissen ausgewählt werden. Nachdem wir das ganze ausgefüllt haben, klicken wir auf Erstellen und schwups sehen wir dieses Fenster:

Nun geht es aber wieder zum Coden.
Wir wollen ein Hangman programmieren. Das ist ein sehr einfaches Wortrate Spiel – kennt eh jeder. Zuerst machen wir eine einfache Version des Spiels um uns mit Visual Studio vertraut zu machen.

Zuerst importieren wir wieder die, uns schon bekannte, random Bibliothek

#encoding: latin-1
import random

In der ersten Zeile steht #encoding: latin-1 – das fügen wir ein um den Zeichensatz (encoding) des Scripts zu definieren. Latin-1 enthält viele Zeichen der westeuropäsichen Sprachen, darunter ö,ü,.. Zwingend notwenig ist es nicht, jedoch besser.
Als nächstes definieren wir eine Variable namens woerterliste. Diese Variable ist eigentlich ein Array und wir initialisieren wir mit ein paar Wörtern – später kommen mehr hinzu.

def waehleWort():
    woerterliste = ['python', 'hangman', 'programmieren', 'microsoft', 'kunstlicheintelligenz']
    return random.choice(woerterliste)

Nun können wir das eigentliche Spiel schreiben. Dazu definieren wir eine Funktion, die wir hangman nennen.


def hangman():
    wort = waehleWort()
    geratene_buchstaben = set()
    max_fehler = 6
    fehler = 0
    wort_geloest = False

    print("Willkommen beim Hangman-Spiel!")
    print("_ " * len(wort))

    while not wort_geloest and fehler < max_fehler:
        geraten = input("Rate einen Buchstaben: ").lower()

        if len(geraten) == 1 and geraten.isalpha():
            if geraten in geratene_buchstaben:
                print("Du hast diesen Buchstaben bereits geraten. Versuche es erneut.")
            elif geraten in wort:
                geratene_buchstaben.add(geraten)
            else:
                fehler += 1
                print(f"Falsch! Du hast {fehler} von {max_fehler} Fehlern gemacht.")
        else:
            print("Ungültige Eingabe. Gib einen einzelnen Buchstaben ein.")

        aktueller_stand = ""
        for buchstabe in wort:
            if buchstabe in geratene_buchstaben:
                aktueller_stand += buchstabe + " "
            else:
                aktueller_stand += "_ "

        print(aktueller_stand)

        if "_" not in aktueller_stand:
            wort_geloest = True
            print("Glückwunsch! Du hast das Wort richtig geraten.")
        elif fehler == max_fehler:
            print(f"Leider verloren! Das richtige Wort war '{wort}'.")


Schauen wir uns den Sourcecode ein wenig genauer an. Zuerst definieren wir eine Variable “wort”. Dieser Variablen weisen wir ein Wort aus unserer Wortliste zu.
Als nächstes definieren wir “geratene_buchstaben” als “set()”.
set ist ein Datentyp in Python, der eine ungeordnete Sammlung eindeutiger Elemente darstellt. Jedes Element in einem Set muss eindeutig sein, und die Reihenfolge der Elemente spielt keine Rolle. Das Set wird durch set() initialisiert, was ein leeres Set erzeugt. In unserem Fall wird das Set verwendet, um die Buchstaben zu verfolgen, die der Benutzer bereits geraten hat, um Duplikate zu vermeiden und den Spielstatus zu überwachen.
Es folgt die Zuweisung von einen Spiel relevanten Variablen, wie unter anderem wie viele Fehler wir machen dürfen.
Nach einer Willkommen Meldung, verraten wir dem Spieler, die Länge des Wortes, das er erraten soll, mit der Zeile print(„_ “ * len(wort))
len ist eine Python-Funktion, die die Anzahl der Elemente in einer Sequenz zurückgibt. In diesem Fall die Anzahl der Buchstaben des Wortes, das wir erraten sollen.
„_ “ * len(wort)diesen Ausdruck verwenden wir um eine Multiplikation von Zeichenketten zu bewerkstelligen. Hier wird die Zeichenkette „_ “ mit der Länge des Wortes multipliziert. Das Ergebnis ist eine Zeichenkette, die aus einer Abfolge von Unterstrichen und Leerzeichen besteht. Zum Beispiel, für das Wort Python, ist das Ergebnis „_ _ _ _ _ _ „.
In unseren ersten zwei Lernprogrammen haben wir die “while” – Schleife schon kennengelernt.
Nun verwenden wir statt der Endlosschleife, eine mit einer Bedingung.
Die bedingung ist ein Ausdruck, der entweder True oder False ergibt. Solange die Bedingung True ist, werden die Anweisungen innerhalb der Schleife wiederholt ausgeführt. Wenn die Bedingung False wird, wird die Schleife beendet, und der Programmfluss geht zum nächsten Abschnitt nach der Schleife über.
In unserem Fall ist die Bedingung “not wort_geloest and fehler < max_fehler:”
not wort_geloest: Der Ausdruck not wort_geloest verwendet den logischen Operator not, der die Umkehr der Bedingung wort_geloest bewirkt. Das bedeutet, dass die Schleife weiterläuft, solange wort_geloest den Wert False hat. Wenn wort_geloest den Wert True erreicht, wird die Umkehr zu False, und die Schleife wird beendet.
and: Der logische Operator and verknüpft zwei Bedingungen und gibt True zurück, wenn beide Bedingungen True sind. Die Schleife läuft also weiter, solange sowohl not wort_geloest als auch fehler < max_fehler erfüllt sind.
fehler < max_fehler: Dies ist die zweite Bedingung. Die Schleife wird nur fortgesetzt, wenn die Anzahl der Fehler (fehler) kleiner ist als die maximale erlaubte Anzahl von Fehlern (max_fehler). Solange der Spieler noch Versuche übrig hat, wird die Schleife weitergeführt.
So aber nun können wir den Source Code in Visual Studio kopieren oder von GitHub öffnen.
Wir haben, dann dieses Fenster vor uns:

Wenn wir auf den Ausführen Button drücken (rot eingekringelt) dann öffnet sich schon ein Fenster und wir können anfangen das Wort zu erraten

Nun ist es aber ein wenig fad, wenn nur unsere paar Wörter zu erraten. Natürlich können wir unsere Liste beliebig erweitern – ist aber irgendwie langweilig. Um ein wenig Salz in die Suppe (Code) zu bringen, können wir ein API verwenden. Um ein zufälliges Wort zu bekommen, können wir das API von https://random-word-api.herokuapp.com/ verwenden.
Um in Python eine API Abfrage (Request) zu machen, benötigen wir die request – Bibliothek.
In Visual Studio ist es recht einfach eine Bibliothek hinzufügen. Zunächst öffnen wir im Projektmappen Explorer den Folder Python-Umgebung – in meinem Fall die Python 3.9 (64-bit). Wir klicken mit der rechten Maustaste drauf und wählen Python-Pakete verwalten aus.

Es öffnet sich nun folgender Dialog

Wir geben nun in das Eingabefeld requests ein und installieren das Paket.

Nun können wir uns eine Funktion programmieren, in der wir uns ein Word von diesem API holen.
Als erstes müssen wir unsere neue Bibliothek importieren.
import requests

Dann modifizieren wir unsere waehleWort, damit wir über das das Random Word API ein neues Wort erhalten.

api_url = "https://random-word-api.herokuapp.com/word?lang=de"
try:
   response = requests.get(api_url)
   response.raise_for_status() # Wirft eine Exception, wenn die Anfrage nicht erfolgreich war (z.B., wenn Statuscode nicht 200 ist)
   # Die Antwort des API ist ein JSON, wir extrahieren das Wort aus dem JSON
   word = response.json()[0]
   return word
except requests.exceptions.RequestException as e:
   print(f"Fehler bei der API-Anfrage: {e}")
   return None

Als erstes definieren wir eine String Variabel namens api_url. Diese beinhaltet die URL des API. Wir wollen ein Hangman mit deutschen Wörter. Wir können auch Wörter in englisch, italienisch, spanisch und chinesisch zurückgegeben lassen. Englisch wenn wir den URL Parameter ?lang weglassen oder de durch zh (chinesisch), es (spanisch), it (italienisch) ersetzen.

Eine wichtiges Konstrukt haben wir auch in die obigen Zeilen eingebaut. Try, catch, finally, wobei wir finally nicht verwenden.
In Python verwenden wir try, except, finally-Struktur, um Fehler (Ausnahmen) in einem Programm abzufangen und entsprechende Maßnahmen zu ergreifen.
Mit try beginnt ein Block, dessen code einen Fehler erzeugen könnte. Wenn eine Ausnahme auftritt so springt die Ausführung zum entsprechenden except – Block.
Dort können wir zum Beispiel eine Fehlermeldung ausgeben, oder einen default Wert, wie in unserem Fall None, definieren.
Der Finally Block wird immer ausgeführt, unabhängig davon, ob eine Ausnahme aufgetreten ist oder nicht. Wir können ihn verwenden, um Code zu platzieren, der unabhängig von Ausnahmen aufgerufen werden muss, wie z.B. das Schließen von Dateien oder Netzwerkverbindungen.

So nun haben wir ein cooles Hangman Spiel:

Der komplette Source code des Hangman Spiels

encoding: latin-1

import random
import requests

def waehleWort():
api_url = "https://random-word-api.herokuapp.com/word?lang=de"
try:
    response = requests.get(api_url)
    response.raise_for_status()  # Wirft eine Exception, wenn die Anfrage nicht erfolgreich war (z.B., wenn Statuscode nicht 200 ist)

    # Die Antwort des API ist ein JSON, wir extrahieren das Wort aus dem JSON
    word = response.json()[0]

    return word
except requests.exceptions.RequestException as e:
    print(f"Fehler bei der API-Anfrage: {e}")
    return None
def hangman():
  wort = waehleWort()
  geratene_buchstaben = set()
  max_fehler = 6
  fehler = 0
  wort_geloest = False

  print("Willkommen beim Hangman-Spiel!")
  print("_ " * len(wort))

  while not wort_geloest and fehler < max_fehler:
    geraten = input("Rate einen Buchstaben: ").lower()

    if len(geraten) == 1 and geraten.isalpha():
        if geraten in geratene_buchstaben:
            print("Du hast diesen Buchstaben bereits geraten. Versuche es erneut.")
        elif geraten in wort:
            geratene_buchstaben.add(geraten)
        else:
            fehler += 1
            print(f"Falsch! Du hast {fehler} von {max_fehler} Fehlern gemacht.")
    else:
        print("Ungültige Eingabe. Gib einen einzelnen Buchstaben ein.")

    aktueller_stand = ""
    for buchstabe in wort:
        if buchstabe in geratene_buchstaben:
            aktueller_stand += buchstabe + " "
        else:
            aktueller_stand += "_ "

    print(aktueller_stand)

    if "_" not in aktueller_stand:
        wort_geloest = True
        print("Glückwunsch! Du hast das Wort richtig geraten.")
    elif fehler == max_fehler:
        print(f"Leider verloren! Das richtige Wort war '{wort}'.")

if name == "main":
hangman()

Den Source Code ist auch unter gpiwonka/Hangman (github.com) zu finden.