5. Spiele programmieren

Das Spielen am und mit dem Computer ist eine Sache. Eine andere Sache ist das Programmieren von Spielen. Beides kann herausfordernd, aber auch interessant und spannend sein.

Als Beispiel ein Würfelspiel

Bild 113
Abbildung 1: Sechseitiger Würfel

Regeln des Würfelspiels

Der Spieler benutzt zum Würfeln einen sechseitigen Würfel (Abbildung 1) mit den Augenzahlen 1 bis 6 hat und gibt die gewürfelte Augenzahl ein.

Der Computer »würfelt« mit einem »virtuellen« Würfel, indem per Zufall die Augenzahl ermittelt wird.

Anschließend wertet der Computer das Würfeln aus:

  • Ist die Augenzahl des Spielers größer als die des Computers, gibt der Computer aus, dass in der Spielrunde der Spieler gewonnen hat.
  • Ist die Augenzahl des Spielers kleiner als die des Computers, gibt der Computer aus, dass in der Spielrunde der Computer gewonnen hat.
  • Haben der Spieler und der Computer die gleiche Augenzahl, gibt der Computer aus, dass es in der Spielrunde unentschieden steht.

Der Spieler entscheidet, ob er das Würfeln wiederholt oder beendet.

Programm »wuerfelspiel.py«

Das »Würfeln« mit dem sechseitigen Spielwürfel ist im Programm »wuerfelspiel.py« implementiert.

Das Programm »wuerfelspiel.py« besteht aus zwei Teilen:

  • der grafischen Benutzeroberfläche – dem Hauptfenster und den darauf plazierten Widgets
  • der Callback-Funktion »wuerfeln« mit dem Algorithmus des Wuerfelspiels, dessen Kern eine äußere if-else-Anweisung mit zwei Bedingungszweigen und eine innere if-elif-else-Anweisung mit drei Bedingungszweigen ist

In der Callback-Funktion »wuerfeln« ist der Algorithmus des Würfelspiels umgesetzt.

Quelltext des Programms »wuerfelspiel.py«
 import tkinter as tk
import random

runde = 0

# Callback-Funktion
def wuerfeln():
    global runde
    try: 
        augenzahl_spieler=int(entry.get())
        if augenzahl_spieler in range(1, 7):
            runde=runde+1
            augenzahl_computer=random.randint(1, 6)      
            if augenzahl_spieler>augenzahl_computer:
                label2.config(text=\
                    f"{runde}. Du hast gewonnen!")
            elif augenzahl_spieler< augenzahl_computer:
                label2.config(text=\
                    f"{runde}. Computer hat gewonnen!")
            else:
                label2.config(text=\
                    f"{runde}. Unentschieden!")
        else:
            label2.config(text="Keine korrekte Augenzahl!")
    except ValueError:
        label2.config(text="Falsche Eingabe!")
    entry.delete(0, tk.END)  

# grafische Benutzeroberfläche
root = tk.Tk()
root.title("Würfelspiel")
root.geometry("400x250")
root.resizable(False, False)

# Widgets
label1=tk.Label(root, text="Gib die Augenzahl ein!")
entry=tk.Entry(root, width=1)
button1=tk.Button(root, text="Spielen", command=wuerfeln)
label2=tk.Label(root, text="")
button2=tk.Button(root, text="Würfeln beenden",\
                    command=root.destroy)
   
label1.pack(pady=10)
entry.pack(pady=10)
button1.pack(pady=10)
label2.pack(pady=10)
button2.pack()

root.mainloop()

 
Erklärungen zum Quelltext
2. Zeile Das Modul »random« mit der Methode «randint« wird in das Programm eingebunden.
  • Mit der Methode »randint« werden Ganzzahlen per Zufall erzeugt.
4. Zeile Die Variable »runde« ist eine globale Variable, weil sie außerhalb der Callback-Funktion »wuerfeln« deklariert wird und dadurch im gesamten Programm gültig ist.
  • Dagegen sind »augenzahl_spieler« und »augenzahl_computer« lokale Variablen, weil sie innerhalb der Callback-Funktion »wuerfeln« deklariert werden.
    Die beiden Variablen »augenzahl_spieler« und »augenzahl_computer« sind aus diesem Grund nur innerhalb der Callack-Funktion »wuerfeln« gültig und nicht im gesamten Programm.
7. bis 27. Zeile Die Callback-Funktion »wuerfeln« mit dem Algorithmus des Wuerfelspiels wird deklariert.
8. Zeile Die globale Variable »runde« wird in die Callback-Funktion »wuerfeln« eingebunden.
9. bis 27. Zeile Die Ausnahmebehandlung dient dazu, Eingaben von Zeichenketten »abzufangen«, die nicht mit dem Typumwandler »int« in ganze Zahlen umgewandelt werden können.
10. Zeile Die Eingabe des Spielers erfolgt über das Entry-Widget (Eingabefeld).
  • Die Variable "augenzahl_spieler" bekommt die eingegebene Zeichenkette durch den Typumwandler »int« als ganze Zahl zugewiesen.
11. bis 24. Zeile Die äußere if-else-Anweisung mit zwei Bedingungszweigen wird deklariert.
  • Falls der Spieler eine unzulässige Augenzahl eingibt, führt der Computer das Würfeln nicht aus.
    Der Spieler kann das Eingeben erneut vornehmen.
  • Ist die Eingabe des Spielers korrekt, führt der Computer das Würfeln und die Auswertung aus.
12. Zeile Der Wert der Variable »runde« erhöht sich durch das Inkrementieren »runde=rund+1« um den Wert 1.[1]
13. Zeile Die Methode »randint« ermittelt per Zufall eine ganze Zahl.
  • Die Variable »augenzahl_computer« bekommt per Zufall als Wert eine ganze Zahl zwischen einschließlich 1 und einschließlich 6 zugewiesen.
14. bis 22. Zeile Die innere if-elif-else Anweisung mit drei Bedingungszweigen wird deklariert.
  • Die Eingabe des Spielers und die zufälligen Auswahl des Computers werden ausgewertet.
16., 19. und 22. Zeile Die jeweilige Auswertung des Spiels wird ausgegeben.
27. Zeile Die vom Spieler in das Entry-Widget (Eingabefeld) geschriebene Zeichenkette wird gelöscht, sodass erneut eine Eingabe des Spielers erfolgen kann.

In der Abbildung 2 ist die grafische Benutzeroberfläche – das Hauptfenster mit den darauf platzierten Widgets – zu sehen.

Bild 114
Abbildung 2: Hauptfenster mit Widgets[2]
Übung

Aufgabe A80

Implementiere das Programm »wuerfelspiel.py« am Computer.

Führe das Programm aus und teste, ob es fehlerfrei läuft und den gestellten Anforderungen entspricht:

  • gib mehrmals gewürfelte Augenzahlen ein
  • gib keine korrekten Augenzahlen ein (beispielsweise 8)
  • gib statt einer Zahl einen Buchstaben ein

  1. [1] Die Wertzuweiszng »runde+=1« ist die verkürzte Schreibweise für »runde=runde+1«. Der Operator »+=« dient der Inkrementbildung.
  2. [2] Wegen des besseren Verstehens ist die grafische Benutzeroberfläche einfach gestaltet.