• Kostenlose Vektorgrafiken zum Thema Nutzer

    Aufbau der Funktionen

    Bisher hast du deinen Programmcode noch nicht getestet. In diesem Abschnitt wirst du erfahren, wie dein Programm mit der Leertaste gestartet werden kann, damit du es testen kannst. Das Spiel ist zwar noch nicht fertig programmiert, aber an dieser Stelle prüfst du, ob sich Fehler eingeschlichen haben, die es zu beheben gilt. Nach dem Programmtest wirst du die Funktionen zum Bestimmen des Fensterrandes und für das Spielende vervollständigen.

    • https://www.davetrost.com/static/media/shell.f48db705.pngDefinieren der Funktionen


      Wie du schon gelernt hast, erfolgt das Definieren der Funktionen mit dem Befehl defDie Funktionsnamen wähle ich zum besseren Verständnis auf deutsch. (Beim Programmieren wird sonst in der Regel die englische Sprache verwendet, für die Einheitlichkeit und bessere Lesbarkeit.) Du kannst die Funktionsnamen natürlich auch frei wählen, achte aber dann darauf bei der Verwendung der Funktionen, also dem Funktionsaufruf, die richtigen Funktionsnamen zu verwenden.

      Für alle Punkte, die in der Vorüberlegung waren, werden nun Funktionen erstellt. Wenn der Inhalt der Funktionen noch nicht bekannt ist, kannst du pass schreiben. Mit der Anweisung pass schaffst du einen Platzhalter, der nichts ausführt.

      Füge die Funktionen unter deinen bisherigen Code zum Raupe-Spiel.


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


      Du wirst nun die Funktion zum Starten des Spiels starte_spiel() erarbeiten.

      In dem Code von letzter Woche hast du bereits die Variable spiel_startet erstellt und ihr den Wert False übergeben.
      In der Funktion starte_spiel() wirst du die Variable spiel_startet als globale Variable definieren. Sie wird anschließend mit einer if-Bedingung geprüft, ob sie True (wahr) zurück liefert, was bedeuten würde das Spiel läuft bereits. Indem Fall wird der Befehl return ausgeführt. Mit return kann man vom Programm etwas wiedergeben, in diesem Fall wird nichts übergeben und bricht den anderen Programmzweig ab. Ist die Variable spiel_startet noch False soll der weiter Programmcode durchlaufen werden, der damit beginnt die Variable spiel_startet auf True setzt. Das würde wie folgt aussehen:


      Als nächstes setzt du die Variable punkte auf 0, leerst das Objekt text_turtle, in dem der Text "Drücke Leertaste" steht. Für die Raupe legst du noch die Geschwindigkeit fest und die Größe.

      Mit der Funktion shapesize(strecken_breite, strecken_laenge, Umrissbreite) wird die Länge der Raupe beeinflusst. Anschließend wird die Raupe mit showturtle() angezeigt.

      Als nächstes rufst du die Funktion für die Anzeige der Punkte auf und die Funktion zum platzieren des Blattes.


      Wie du siehst, wird der Funktion anzeige_punkte() ein Parameter punkte übergeben. In der Funktion wird später diese Variable benötigt und muss mitgegeben werden, so dass du deine Funktion anzeige_punkte() ebenfalls anpassen musst.

      Das sieht dann wie folgt aus:


      Nun fehlt noch die Hauptschleife, die für die Bewegung der Raupe zuständig ist und Prüfungen vornimmt.

      Um eine Endlos-Schleife zu erzeugen, nutzt du die while-Schleife und sagst solange diese wahr ist, also while True:. Innerhalb der Schleife soll die Raupe sich nun vorwärts bewegen. Dem Befehl forward() übergibt man, die Anzahl der Pixel, die die Raupe läuft. Wenn man überlegt, wie man die Geschwindigkeit der Raupe steuert, werden wir dies über die Anzahl der Pixel, die die Raupe läuft, steuern und übergeben somit die Variable raupe_speed an den Befehl forward().


      Im Anschluss wird geprüft, ob die Distanz bzw. der Abstand zwischen der Raupe und dem Blatt kleiner als 20 Pixel ist? (if raupe.distance(blatt)< 20: )


      1. Wenn ja, wird ein neues Blatt erzeugt, indem die Funktion platziere_blatt() aufgerufen wird.

      Weiterhin wird die Länge der Raupe um 1 vergrößert. Dafür wird die Variable raupe_laenge um 1 erhöht und diese Variable wird an die Funktion shapesize() wieder übergeben.

      Außerdem wird die Geschwindigkeit raupe_speed um 1 erhöht.

      Die Anzahl der Punkte in der Variablen punkte wird um 10 erhöht, das heißt für jedes eingesammelte Blatt bekommt der Spieler 10 Punkte.

      Zum Anzeigen der Punkte wird noch die Funktion anzeige_punkte() aufgerufen und der aktuelle Punktestand übergeben.


      2. Wenn nein, passiert nichts weiter und die Raupe bewegt sich weiter.


      In der 2. Bedingung wird geprüft, ob die Raupe den Rand des Fensters erreicht hat? (if ausserhalb_fenster(): )


      1. Wenn ja, führe die Funktion spiel_ende() aus. Mit dem break wird die Schleife unterbrochen und das Programm stoppt.
      2. Wenn nein, passiert nichts weiter und die Raupe bewegt sich weiter.

      Du hast nun die Hauptfunktion erstellt. Speichere deinen Programmcode wieder ab.



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



      Damit du dein Programm testen kannst, muss eine Verbindung geschaffen werden zwischen der Funktion starte_spiel() und dem Drücken der Leertaste, die das Spiel starten soll. Dafür gibt es eine Funktion im Turtle-Modul, die heißt onkey(Funktionsname, 'Taste'). Der Funktionsname ist starte_spiel und die Taste heißt space.

      Wichtig: Der Name der Taste muss in Hochkomma geschrieben werden, damit er als String (Text) erkannt wird.

      Mit der Funktion listen() aus dem Turtle-Modul sorgst du dafür, dass das Programm Signale von der Tastatur empfängt. Erst dadurch kann die Leertaste erkannt werden.
      Damit die Prüfung, ob die Leertaste gedrückt wird, nicht nur kurz nach dem Öffnen des Programms erfolgt, wird eine Hauptschleife mainloop() gestartet. So kannst du deine Python-Datei öffnen und dich bereit machen zum Starten des Spiels mit der Leertaste. (Diese Funktion ist ebenfalls aus dem Turtle-Module.)

      Diese 3 Funktionen fügst du am Ende deines Programmes ein. Das würde wie folgt aussehen:


      Wenn du dein Programm nun abspeicherst und startest, solltest du das Spielfenster sehen. Beim Drücken der Leertaste startet das Spiel und die Raupe sollte sich bewegen.

        CLICK!

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


      Du hast ja noch ein paar Funktionen in denen Lücken sind. Du beginnst mit der Funktion ausserhalb_fenster(). In dieser Funktion kannst du pass entfernen. Stattdessen soll das Programm eine Prüfung vornehmen, ob die Raupe außerhalb des Fensterbereichs ist. Dafür muss der Rand des Fensters ermittelt werden. Mit der Turtle-Modul-Funktion window_width() lässt sich die Breite ermitteln und mit window_height() die Höhe. In folgendem Bild habe ich dir das Koordinatensystem des Turtle-Fensters dargestellt. Dort ist der Nullpunkt (0, 0) in der Mitte. Um mit der Breite bzw. Höhe den Rand zu ermitteln, müssen diese Werte somit halbiert werden.

      Koordinatensystem_beschriftet_Hoehe_Breite

      Für den rechten Rand gilt somit: rechts = Fensterbreite / 2
      Der linke Rand ist genauso weit entfernt, jedoch liegt er im negativen Bereich. Also ist links = -Fensterbreite / 2
      Für die Höhe ist es ähnlich:
      oben = Fensterhöhe / 2
      unten = -Fensterhöhe / 2

      Im Programmcode sieht es dann wie folgt aus:


      Als nächstes benötigst du die Position der Raupe, die mit der Funktion pos() ermittelt werden kann. Diese Funktion gibt ein Tupel zurück mit 2 Werten, die x- und die y-Koordinate. Damit du auf den x und y Wert einfach zugreifen kannst, lässt du die Position in (x, y) schreiben.


      Mit der Position der Raupe und den Werten der Ränder vom Fenster kannst du nun prüfen, ob die Raupe den Rand berührt und somit außerhalb des Fensters ist.

      Überlege, welche Werte x und y haben kann, dass die Raupe außerhalb des Fensters ist. 

      Wenn x kleiner als der Wert des linken Randes ist, oder
      wenn x größer als der Wert des rechten Randes ist, oder
      wenn y kleiner als der Wert des unteren Randes ist, oder
      wenn y größer als der Wert des oberen Randes ist.

      Im Programmcode wird bei jeder einzelnen Prüfung das Ergebnis wahr (true) oder falsch (false) zurückgegeben. Um nur eine lange Prüfung durchzuführen, werden alle "Teile" verknüpft. Die Verknüpfung wird in diesem Fall mit einem or (oder) geschehen. Sobald eine Teilprüfung wahr ist, ist die Raupe außerhalb des Fensters.


      Das Ergebnis der Prüfung muss von der Funktion ausserhalb_fenster() nur noch zurückgegeben werden mit return, damit es an der Stelle verwendet werden kann, wo die Funktion aufgerufen wurde.

      Wenn du dein Programm jetzt wieder testest, siehst du die Raupe, wie sie den Rand berührt.


    • Wenn du alle Schritte mit mir abgeschlossen hast, dein Code aber immer noch nicht funktioniert - keine Sorge. Gut möglich, dass dir nur ein Tippfehler unterlaufen ist. Klick einfach hier und kopiere den Code in deine Python-Datei. Kein Schummeln! Versuche zunächst, den Code Schritt für Schritt selbst zu vervollständigen. lächelnd