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
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.
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()
| 2. Zeile |
Das Modul »random« mit der Methode «randint« wird in das Programm eingebunden.
|
| 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.
|
| 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).
|
| 11. bis 24. Zeile |
Die äußere if-else-Anweisung mit zwei Bedingungszweigen wird deklariert.
|
| 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.
|
| 14. bis 22. Zeile |
Die innere if-elif-else Anweisung mit drei Bedingungszweigen wird deklariert.
|
| 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.
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