Wir testen und repetieren noch einmal.
Aufgabe: Das Fisch-Game
Du sollst einen Fisch von links nach rechts durchs Wasser steuern und dabei Sterne aufsammeln. Ihm kommen andere Fische entgegen, die du nicht berühren darfst.
Dein Fisch schwimmt mit fixer Geschwindigkeit nach rechts. Er sinkt dabei langsam ab. Nur während du die Leertaste drückst, erhält er Auftrieb.
Jedes Mal, wenn du einen Stern berührst, verschwindet ein entgegen kommender Fisch (und der Stern natürlich auch).
Du hast 10 Leben, diese werden oben links angezeigt. Sobald du einen fremden Fisch berührst, wird dir ein Leben abgezogen.
- Speichere die folgenden Bilder im images-Ordner ab:
- Realisiere entweder selbstständig die oben genannten Ziele oder lies die unten stehende Schritt-für-Schritt-Anleitung.
Aufgabe: Fisch steuern
- Kopiere die Vorlage aus der Schneefall-Übung und stelle sicher.
- Füge einen Actor
mein_fischfür deinen Fisch (fish-1.png) hinzu, gib ihm eine zufällige Anfangsposition am linken Bildrand und zeige ihn an. - Füge deinem Fisch die zwei Eigenschaften
vxundvyhinzu und setze diese auf1resp.2, so dass der Fisch stärker sinkt als vorwärts kommt. - Programmiere in der
update()-Funktion den benötigten Code, um den Fisch nach rechts zu bewegen und sinken zu lassen. - Implementiere nun die Tastatursteuerung so, dass der Fisch etwas nach oben schwimmt, solange die Leertaste gedrückt ist.
Lösung: Fisch steuern (nicht angemeldet)
Diese Lösung ist nur für angemeldete Benutzer zugänglich – wenn die LK die Lösung freigegeben hat. Bitte melde dich an, um die Lösung einsehen zu können.Aufgabe: Andere Fische
- Erstelle eine Konstante
ANZAHL_FISCHEund setze diese auf5. - Erstelle eine leere Liste
fische. - Füge vor Beginn der Animation eine Schleife hinzu, die pro Durchgang jeweils einen Fisch-Actor
fischerstellt (Bildfish-2.png). - Die neuen Fische sollen eine zufällige x-Koordinate rechts ausserhalb des Bild erhalten (z.B. in einem Bereich rechts des Fensters, der halb so breit ist wie das Bild selbst) sowie eine zufällige y-Koordinate innerhalb der Bildhöhe.
- Füge jedem Fisch mit Hilfe der Eigenschaft
vxeine Geschwindigkeit hinzu und setze diese auf-2. - Programmiere in der
update()-Funktion eine Schleife mit dem benötigten Inhalt, damit die Fisch mit der definierten Geschwindigkeit von rechts nach links schwimmen. - Zeichne in der
draw()-Funktion jeweils sämtliche Fische mit Hilfe einer Schleife.
Lösung: Andere Fische (nicht angemeldet)
Diese Lösung ist nur für angemeldete Benutzer zugänglich – wenn die LK die Lösung freigegeben hat. Bitte melde dich an, um die Lösung einsehen zu können.Aufgabe: Stern
- Füge einen weiteren Actor
sternhinzu und positioniere ihn bei x-Koordinate400in der Mitte der Bildhöhe. - Prüfe nun in der
update()-Funktion, ob dein Fisch den Stern berührt, indem du die Funktionobjekt1.colliderect(objekt2)aufrufst (das Resultat istTrueoderFalse, lässt sich also in einemifprüfen). Falls eine Kollision stattgefunden hat, nimmst du den Stern weg, indem du seine x-Koordinate auf-400setzt. - Ebenfalls im Falle eine Kollision entfernst du zufällig einen Fisch aus der Liste.
mehr
Beim Entfernen von Elementen aus einer Liste muss entweder ein konkretes Objekt oder dessen Position in der Liste angegeben werden. Es ist daher am Einfachsten, wenn du eine zufällige Position bestimmst und diese Element mit liste.pop(index) entfernst.
Lösung: Stern (nicht angemeldet)
Diese Lösung ist nur für angemeldete Benutzer zugänglich – wenn die LK die Lösung freigegeben hat. Bitte melde dich an, um die Lösung einsehen zu können.Aufgabe: mehrere Sterne
- Füge eine Liste
sternehinzu und ändere den Code so, dass mehrere Sterne zufällig platziert und gezeichnet werden. - Ändere nun auch den Code in der
update()-Funktion entsprechend (die Kollision muss mit jedem Stern geprüft werden).
Lösung: mehrere Sterne (nicht angemeldet)
Diese Lösung ist nur für angemeldete Benutzer zugänglich – wenn die LK die Lösung freigegeben hat. Bitte melde dich an, um die Lösung einsehen zu können.Aufgabe: Leben
- Füge deinem Fisch eine weitere Eigenschaft
lebenhinzu und setze diese gleich zu Beginn auf 3. - Zeige den Inhalt dieser Eigenschaft oben links im Fenster an. Der Text in der Variablen
mein_fisch.lebenkann mit dem Befehlscreen.draw.text(text, (x, y))an der Position (x|y) angezeigt werden. Hinweis: Denke daran, dass der Text (also die Anzahl Leben: eine Zahl) beim Aufrufen der Funktion als String übergeben werden muss. - Prüfe nun in der
update()-Funktion in einer Schleife für jeden fremden Fisch, ob dein Fisch diesen fremden Fisch berührt. Falls eine Kollision stattgefunden hat, ziehst du ein Leben ab. - Wenn keine Leben mehr übrig sind, soll das Spiel angehalten werden und «Game Over» stehen.
mehr
Achtung: Da wir beim Vorbeischwimmen einen fremden Fisch stets lange Zeit berühren, darf nicht in jedem Update ein Leben abgezogen werden. Daher müssen wir uns merken (z.B. in einer neuen Eigenschaft eines Fisches kollision), mit welchem fremden Fisch gerade eine Kollision stattfindet. Wir speichern dazu den fremden, kollidierenden Fisch in dieser Eigenschaft.
Die Struktur ist etwas tricky: Da es noch andere Fische gibt, müssen wir speichern, mit welchem Fisch wir gerade kollidieren und korrekt prüfen, ob die Kollision mit genau diesem Fisch vorbei ist, bevor wir eine neue Kollision anschauen.



