Im Projekt 1 wollen wir ein Spiel entwickeln, bei dem das Bild einer Spielfigur auf einer zufälligen Stelle auf dem Bildschirm erscheint. Wenn man mit der Maus auf die Spielfigur klickt, soll „Treffer!“ ausgegeben werden. Wenn man daneben klickt, ist das Spiel beendet.
Für unser Spiel benötigen wir ein Objekt der Klasse Screen und ein Objekt der Klasse Actor. Das Screenobjekt repräsentiert das Spielfeld. In einem Pygame-Zero-Programm kann immer nur genau ein Screen-Objekt erzeugt werden. Für diese Objekt muss kein Konstruktor aufgerufen werden. Es wird automatisch bei der Verwendung von pgzrun erzeugt.
(Siehe https://pygame-zero.readthedocs.io/de/latest/introduction.html#ein-fenster-erzeugen)
Um ein Pygame-Zero Programm zu starten gibt es zwei Möglichkeiten:
import pgzrun # Hier steht das Programm. pgzrun.go()
pgzrun programm.py
.Wir werden immer die zweite Möglichkeit nutzen. Innerhalb der Entwicklungsumgebung Thonny gibt es dafür eine Einstellung.
Weiterhin benötigen wir in unserm Programm ein Objekt der Klasse Actor. Actor repräsentiert eine Spielfigur. Beim Erzeugen eines Objekts der Klasse Actor wird eine Bilddatei übergeben.
homer = Actor("homer.png")
Die verwendeten Bilder müssen sich in einem Unterverzeichenis images befinden und im png-Format vorliegen.
(Siehe https://pygame-zero.readthedocs.io/de/latest/introduction.html#eine-figur-sprite-zeichnen)
Erzeuge im Projektordner eine Datei projekt1.py mit dem folgenden Inhalt:
homer = Actor("homer.png") def draw(): screen.clear() homer.draw()
Starte das Programm durch den Aufruf pgzrun projekt1.py
oder mit dem pgzero-Modus von Thonny.
Es müsste das folgende Fenster erscheinen:
mit homer = Actor("homer.png")
wird ein Objekt der Klasse Actor angelegt. Die Funktion draw()
wird ausgeführt, wenn das Screen-Objekt erzeugt wird. In ihr wird der Bildschirm gelöscht und Homer gezeichnet.
Füge den folgenden Quelltext unter der Funktion draw()
ein:
def place_homer(): homer.x = 300 homer.y = 200 place_homer()
Führe das Programm erneut aus:
Durch die Funktion wird die Position von Homer auf dem Bildschirm bestimmt. Der Ursprung des Koordinatensystems befindet sich in der linken oberen Ecke des Screen-Objekts, die x-Achse verläuft von rechts nach links, die y-Achse von oben nach unten. Die Koordinaten werden in Pixeln angegeben.
Füge unter der Definition der Funktion place_homer()
den folgenden Quelltext ein:
def on_mouse_down(pos): if homer.collidepoint(pos): print("Treffer!") else: print("Daneben!") quit()
Diese Funktion on_mouse_down(pos)
reagiert auf den Mausklick (dann wird sie ausgeführt). An die Funktion wird die x- und die y-Koordinate der Maus übergeben, wenn man mit der Maus auf eine bestimmte Stelle des Screens klickt.
Die Funktion homer.collidepoint(pos)
testet, ob sich die übergebene Position innerhalb des Bildes von Homer befindet. In diesem Fall gibt sie True
zurück, anderenfalls False
.
Die if
-Anweisung bewirkt, dass wenn man auf Homer klickt, „Treffer!“ ausgegeben wird, anderenfalls wird „Daneben!“ ausgegeben und das Programm wird beendet.
Bisher ist das Spiel noch recht langweilig, weil Homer immer auf der selben Position erscheint. Im nächsten Schritt soll nun Homer bei jeden Treffer neu platziert werden.
Schreibe die folgende Anweisung an den Anfang deiner Datei:
from random import randint
Ändere die Funktion place_homer()
wie folgt ab:
def place_homer(): homer.x = randint(10, 800) homer.y = randint(10, 600)
Füge nach der Anweisung print("Treffer!")
die Anweisung place_homer()
ein:
... print("Treffer!") place_homer() ...
Mit der ersten Zeile wird der Zufallszahlengenerator importiert. Mit der veränderten Funktion place_homer()
wird die Spielfigur an einer zufälligen Stelle des Bildschirms platziert. Nach jedem Treffer wird die Funktion aufgerufen und Homer erscheint an einer anderen stelle des Bildschirms.
Hier seht ihr das fertige Programm:
import pgzrun from random import randint homer = Actor("homer.png") def draw(): screen.clear() homer.draw() def place_homer(): homer.x = randint(10, 800) homer.y = randint(10, 600) def on_mouse_down(pos): if homer.collidepoint(pos): print("Treffer!") place_homer() else: print("Daneben!") quit() place_homer() pgzrun.go()
Aufgabe 1
Verändere das Programm so, dass es auch bei „Daneben!“ weiterläuft. Es kann dann nur durch das Schließen des Fensters beendet werden.
Aufgabe 2
Führe eine Variable treffer ein, die die Anzahl der Treffer zählt. Sie muss zu Beginn des Programms im Hauptprogramm auf 0 gesetzt werden.
Wenn nun Homer getroffen wurde, soll die Variable soll um 1 erhöht werden. Um eine globale Variable in einer Funktion zu ändern, muss sie in der Funktion als global deklariert werden. (https://www.python-kurs.eu/python3_global_lokal.php)
Letztendlich soll in der print-Anweisung hinter Treffer noch die Anzahl der bisherigen Treffer ausgegeben werden.
Aufgabe 3
Schreibe ein eigenes Programm!
Führe andere ähnliche Spielfiguren (https://icons8.de/icon/set/characters/color) ein und passe die Hintergrundfarbe (https://pygame-zero.readthedocs.io/de/latest/introduction.html#einen-hintergrund-zeichnen) an, um den Spieler zu verwirren. Nur wenn auf eine bestimmte Figur geklickt wird (hier der Grinch) wird ein Treffer gezählt.