• Kostenlose Vektorgrafiken zum Thema Schnecke

    Die Raupe wird beweglich

    Wenn du dein Spiel gespielt hast und mehrere Blätter mit der Raupe gesammelt hast, wird die Raupe recht lang. Da die Raupe starr ist und nicht beweglich, wird das Spiel immer schwerer zu steuern sein. In diesem letzten Abschnitt möchte ich dir noch zeigen wie du eine bewegliche Raupe erhältst.

    • Als Ausgangsbasis nutze bitte wieder deine Datei raupe.py, die du nach Abschnitt "Funktionen - Teil2" vollendet hattest. Erstelle dir wieder eine Kopie davon, die du raupe3.py nennen kannst.

      Ich werde dir die Änderungen des Codes von oben nach unten erklären und nicht durch den Code springen, so dass manche Zusammenhänge oder Verwendungen von Funktionen erst später erklärt werden. So wie der import des Moduls time, dass du später verwendest.


      https://www.davetrost.com/static/media/shell.f48db705.pngimport



      https://www.davetrost.com/static/media/shell.f48db705.png#Hintergrund
      Im Folgenden wirst du die Eigenschaften von dem Spielfenster bearbeiten. Dafür gehst du in deinem Code an die Stelle, wo der Hintergrund definiert wurde. Diesen wirst du nun wie folgt ersetzen. Du erzeugst ein Objekt t.Screen() zum Beispiel mit dem Namen fenster. Diesem Objekt übergibst du die Hintergrundfarbe, einen Titel und du kannst die Größe des Spielfensters bestimmen.


      Der Aufruf der turtle-Funktion tracer(0) bewirkt dabei, dass die Animationen im Spiel verwendet werden können.
      https://www.davetrost.com/static/media/shell.f48db705.png#Raupenkoerper

      Der Raupenkörper, den wir bisher hatten, wird zum Raupenkopf. Der Einfachheit halber belassen wir den Objektnamen bei raupe. Die Richtungsänderungen der Raupe wirst du in diesem Programm nicht mit setheading() durchführen, ich werde dir eine andere Möglichkeit vorstellen. Dazu definierst du ein Attribut richtung, das an dem Objekt raupe hängt und den Wert "stop" hat. Im Code sollte der Teil für den Raupenkopf wie folgt aussehen:



      https://www.davetrost.com/static/media/shell.f48db705.png#Blattkoerper und #Texte

      Am Programmcode für das Blatt, den Text, sowie dem Punktestand ändert sich nichts

      https://www.davetrost.com/static/media/shell.f48db705.png#Punkte
      Füge unter dem Objekt für die Punkte noch eine Liste namens segmente ein. (Du kannst auch einen anderen Namen verwenden, dann müsstest du es auch an den anderen Stellen, wo die Liste verwendet wird, ebenfalls tun.)



      https://www.davetrost.com/static/media/shell.f48db705.pngausserhalb_fenster():
      Die Funktion ausserhalb_fenster() ändert sich nicht und bleibt so, wie sie ist.

      https://www.davetrost.com/static/media/shell.f48db705.pngspiel_ende():

      In der Funktion spiel_ende() wird auch der restliche Raupenkörper versteckt.



      https://www.davetrost.com/static/media/shell.f48db705.pnganzeige_punkte(aktuelle_punkte): und platziere_blatt():

      In der Funktion anzeige_punkte() und platziere_blatt() bleibt alles so bestehen.

      https://www.davetrost.com/static/media/shell.f48db705.pngstarte_spiel():
      Kommen wir nun zum Hauptteil in der Funktion starte_spiel(). Vieles von dem was du bereits programmiert hattest, wirst du übernehmen. Jedoch wird die Geschwindigkeit durch eine Verzögerung des Programmdurchlaufs erreicht und die Länge der Raupe durch die Anzahl der Segmente in der Liste, die du erstellt hast. Im Code fügst du eine neue Variable ein verzoegerung und stattdessen löschst du die Variablen raupe_speed und raupe_laenge, sowie die Veränderung der Raupe mit raupe.shapesize(). Damit du weißt, was ich meine, hier der Programmcode vom Beginn der starte_spiel()-Funktion.


      Kommen wir nun zur while-Schleife, in der die meisten Änderungen stattfinden.
      Die Raupe wird sich nicht mehr durch den forward()-Befehl vorwärts bewegen, so dass dieser gelöscht wird. Du wirst zu einem späteren Zeitpunkt, wenn es um die Bewegung der Raupe geht, diese über die Veränderung der x- oder y-Koordinaten bewegen.
      Das Spielfenster wird regelmäßig aktualisiert werden müssen, dafür wird das Objekt fenster mit dem Befehl update() aktualisiert.

      Raupe_while_fenster_update

      In der if-Bedingung, wenn die Raupe das Blatt frisst, muss wieder der Teil mit den Änderungen für raupe_speed und raupe_laenge, sowie die Veränderung der Raupe mit raupe.shapesize() entfernt werden.



      In der if-Bedingung, ob die Raupe ausserhalb_fenster() ist, entferne das break.

      Nun folgt die Programmierung für den Körper der Raupe. Im Folgenden zunächst der Code für die Bewegung des Raupenkörpers, den ich anschließend erkläre.

      Raupe_Bewegung_Raupenkoerper

      Du benötigst eine for-Schleife, mit der du die Liste von segmente durchgehst, die du zuvor bereits erstellt hast. Diese for-Schleife geht jedoch nicht vom 1. Wert bis zum letzten Wert, sondern in umgekehrter Reihenfolge. Dafür wird mit len(segmente) die Länge des Raupenkörpers ermittelt und da du das erste Segement mit dem Raupenkopf betrachten müsstest, wird es an dieser Stelle rausgerechnet und die Länge um 1 subtrahiert. Somit hast du mit len(segmente)-1 deinen Startwert und 0 ist der Endwert. Der 3. Wert für range() gibt an in welchen Schritten die Schleife durchlaufen wird. Bisher hast du diesen Wert nicht angegeben, dann wird standardmäßig 1 verwendet. Da diese Schleife rückwärts in Einerschritten durchlaufen werden soll, gibst du in diesem Fall -1 an.
      Die Bewegung der Raupe wird so sein, dass das letzte Segment des Raupenkörpers an die Stelle vorrückt, wo sich das vorletzte Segement des Raupenkörpers befindet und immer so weiter. Um nun die x-Koordinate des Vorgängers der Segmente in der Liste zu ermitteln, wird segmente[index-1].xcor() geschrieben. Das Gleiche gilt für die y-Koordinate mit ycor(). Diese Werte werden anschließend als Koordinaten an das aktuelle Segment segment[index] mit der Funktion goto(x, y) übergeben.

      Jetzt folgt die Bewegung des 1. Segments an die Stelle des Raupenkopfes. Dafür benötigst du eine if-Bedingung, die prüft, ob die Raupe bereits Segmente hat und nicht nur den Kopf. Anschließend werden die x- und y-Koordinate des Kopfes ermittelt und an das erste Segment übergeben. Im Code sieht es dann wie folgt aus:

      Raupe_Bewegung_Raupenkoerper2

      Als nächstes muss die Bewegung der Raupe erfolgen. Zuvor hat sich die Raupe mit dem Befehl forward() bewegt. In diesem Programm wird die Bewegung durch die Änderung der Koordinaten erfolgen. Jedoch wirst du dafür eine eigene Funktion erstellen namens bewegen.

      Raupe_Funktion_bewegen

      Bevor du die Funktion bewegen nun aber befüllst (pass ist nur ein Platzhalter), wirst du die letzten beiden Schritte in der while-Schleife noch abschließen.

      Mit der beweglichen Raupe kann es natürlich passieren, dass die Raupe sich selbst beißt, dann sollte das Spiel ebenfalls beendet werden. Dafür wirst du mit einer for-Schleife jedes Segment des Raupenkörpers durchgehen und mit einer if-Bedingung prüfen, ob die Entfernung zwischen dem zu betrachtenden Segment des Raupenkörpers und des Raupenkopfes kleiner als 20 Pixel ist (wie zwischen Raupenkopf und Blatt). Wenn dieser Fall eintritt, soll die Funktion spiel_ende() aufgerufen werden.



      Als Letztes wird in der while-Schleife noch die Verzögerung des Spiels programmiert. Aus dem Modul time, dass du zu Beginn bereits importiert hast, verwendest du die Funktion sleep(Sekunden), die den Programmablauf für eine bestimmte Zeit anhält und somit eine Verzögerung der Raupenbewegung verursacht.

      Raupe_verzoegerung
      https://www.davetrost.com/static/media/shell.f48db705.pngbewege_hoch/runter/links/rechts():
      Bevor du die neue Funktion bewegen ausfüllst, erweiterst du die anderen 4 Funktionen bewege_hoch(), bewege_runter(), bewege_links() und bewege_rechts(). Rufe das Attribut richtung vom Objekt raupe auf und übergib dementsprechend die Werte hoch, runter, links und rechts.



      https://www.davetrost.com/static/media/shell.f48db705.pngbewegen():
      Zum Schluss wird nun die Funktion bewegen() erarbeitet. Den Platzhalter pass löscht du wieder raus. Ich zeige dir zunächst wieder den Code und erkläre ihn anschließend.


      Wenn die Raupe sich durch die Pfeiltaste nach oben bewegen soll, wird das Attribut richtung auf hoch gesetzt. In der Funktion bewegen() wird das Attribut richtung geprüft. Für hoch und runter wird die y-Koordinate ausgelesen und eine neue gesetzt mit sety(). Dabei wird der Wert um 20 Pixel erhöht, wenn die Raupe hoch läuft und um 20 Pixel verringert, wenn sie runter läuft. 
      Für die Richtung links und rechts geschieht das Gleiche, jedoch wird hier die x-Koordinate betrachtet.

      Dein Programm ist nun fertig. Speichere es ab und teste es.

    • https://www.davetrost.com/static/media/shell.f48db705.png Abschluss


      Dieser Kurs schließt mit der beweglich Raupe im Spiel ab lächelnd . Ich hoffe, ich konnte dir ein bißchen was zum Programmieren mit Python erklären und du hast ein funktionsfähiges Spiel in 3 verschiedenen Varianten entwickeln können. Wenn du noch Fragen haben solltest, kannst du dich gern bei mir melden.

      Am 13.04.2023 werde ich einen neuen Kurs beginnen "An die Tasten fertig los! Sei kreativ mit JavaScript". Wenn du auch wieder mit machen möchtest, melde dich dafür bei der Webakademie.

      Kostenlose Illustrationen zum Thema Hase