• Herzlich Willkommen

      Hallo, ich freu mich, dass du auch diese Woche wieder mit dabei bist! Heute wollen wir unsere Schlange so bearbeiten, dass sie mit dem Einsammeln der Äpfel stück für stück wachsen kann. Ich wünsche dir ganz viel Spaß beim ausprobieren, lernen und entdecken. Lass uns keine Zeit verlieren und direkt loslegen!


    • Vorschau

      Heute wollen wir den Teil des Spiels programmieren, der dafür sorgt, dass unsere Schlange auch wirklich eine Schlange wird. Wir wollen als, dass der Spieler immer dann länger wird, wenn er einen Apfel eingesammelt hat. Hier habe ich dir ein kleines Video von dem Spiel erstellt. Dieses kannst du dir jetzt auch einmal ansehen , um dir ein Bild von dem zu machen, was wir heute schaffen wollen:

        


    • Anpassungen

      Unseren heutigen Kurs habe ich in zwei Teile geteilt. Den Code der ersten Hälfte „Änderungen“ kannst du nun hier sehen. Sollte es später einmal nicht funktionieren oder solltest du dir einmal unsicher sein wo genau du eine Code-Zeile hinschreiben sollst, gleiche deinen Code mit diesem hier ab. Solltest du deinen Fehler nicht finden, kannst du mir gerne jederzeit eine Nachricht schreiben.



      -------------------------------------------------------------------------------------------------------------------------------

      Jetzt wollen wir alle Änderungen einmal durchgehen. Währenddessen kannst du diese in deinem Code übernehmen.

      Wir werden zuerst einige, nützliche Änderungen an unserem Code vornehmen. Die Variablen „width“ und „height“ speichern ja mittlerweile den selben Wert. Von daher ist es sinnvoller, diese zu löschen und mit einer einzelnen Variable weiterzuarbeiten. Lösche deshalb beide Variablen und erstelle an der Stelle die neue Variable „size“ (eng. Größe). 


      Nun ist es aber so, dass wir in unserem Programm mit den Variablen „width“ und „height“ gearbeitet haben. An diesen Stellen müssen wir „width“ und „height“ durch „size“ ersetzen. Nehme nun folgende Änderungen in deiner Schleife vor.


      Und nehme nun noch folgende Änderung in deiner „draw“ Funktion vor:

      Nun werden mir unsere „draw“ Funktion ändern. Markiere diesen Teil deiner Funktion, drücke die rechte Maustaste und wähle „Cut“ aus.


      Gehe nun an das Ende deiner While-Schleife, klicke oberhalb der Zeile in welcher „draw()“ steht, mache wieder einen Rechtsklick und wähle „Paste“ aus. Achte nun darauf, dass alle Zeilen korrekt eingerückt sind. Die Zeile „draw()“ kannst du anschließend löschen.


      Unsere „draw“-Funktion soll nun dazu dienen, um unsere Schlange zu Zeichnen und eben zu verlängern. Da sie jetzt nicht mehr zum alleinigen Zeichnen verwendet wird, lass uns die Funktion einmal umbenennen, damit wir später noch wissen, was in der Funktion passiert. Wir nennen sie nun „snakeExt“ (für snake extend eng. Schlange erweitern).


      Da unsere „snakeExt“-Funktion ja dazu dienen soll unsere Schlange zu zeichnen, können wir nun noch einmal an das Ende unserer Schleife gehen, die Zeile, die für das Zeichnen unseres Spielers sorgt, markieren, die Rechte Maustaste drücken und wieder „Cut“ auswählen.


      Nun können wir zurück in unsere „snakeExt“-Funktion gehen, dort herein klicken, wieder einen Rechtsklick machen und „Paste“ auswählen. Deine „snakeExt“-Funktion sollte nun wie folgt aussehen:


      Wenn du dein Programm nun startest, wird dein Spieler noch nicht gezeichnet werden. Das liegt daran, dass wir die Funktion, die wir jetzt erstellt haben, noch gar nicht aufrufen. Das wollen wir jetzt einmal ändern.

      Hierfür gehen wir wieder zurück an das Ende unserer While-Schleife und fügen die Zeile „snakeExt()“ wie folgt hinzu.


      Wenn du dein Spiel jetzt startest, funktioniert es wie zuvor. Probiere es jetzt einmal aus.

      Nun haben wir alle wichtigen Änderungen an unserem Code vorgenommen um nun, mit dem Verlängern der Schlange beginnen zu können.


    • Die Schlange

      Hier siehst du einmal wie unser Programm am Ende des Kurses aussehen soll. Sollte es später einmal nicht funktionieren oder solltest du dir einmal unsicher sein wo genau du eine Code-Zeile hinschreiben sollst, gleiche deinen Code mit diesem hier ab. Solltest du einen Fehler einmal nicht finden, kannst du mir gerne jederzeit eine Nachricht schreiben.


      ---------------------------------------------------------------------------------------------------------------------------------------
      Jetzt wollen wir den Teil des Spiels programmieren, der dafür sorgt, dass unsere Schlange auch wirklich eine Schlange wird. Wir wollen also, dass der Spieler immer dann länger wird, wenn er einen Apfel eingesammelt hat. Hier kannst du eine kleine Vorschau sehen von dem, was wir jetzt machen wollen.


      Jetzt können wir mit dem Verlängern der Schlange beginnen. Hierfür legen wir zunächst zwei Variablen außerhalb unserer Schleife an. Einmal legen wir eine leere Liste „snake“ an und dann legen wir noch eine zweiter Variable an, welche der Länge unserer Schlange entspricht. Da unsere Schlange von Beginn an bereits aus einem Quadrat besteht, bekommt die Variable „snakeLength“ den Wert 1. Tippe nun diese beiden Zeilen oberhalb deiner While-Schleife ab:


      Jetzt machen wir uns an die Logik. Tippe hierfür erst einmal diese Zeilen in deine While-Schleife: 

      Füge außerdem diese Zeilen in deine While-Schleife unterhalb von der Zeile „print(„Yummy“): 


      Doch was genau passiert hier eigentlich? Mit „snakeHead =[]“ legen wir, mit jedem Schleifenaufruf, eine leere Liste an. „snakeHead.append(x)“ fügt den Wert von x in die Liste „snakeHead“ und „snakeHead.appendJa“fügt den Wert von y in die Liste ein. Unsere Liste sieht also nach dem Einfügen von x und y erstmal so aus: snakeHeade = [55, 155]. Wenn wir unseren Spieler nun bewegen, änderen sich auch die Werte in dieser Liste.

      Die Liste „snakeHead“ fügen wir mit „ snake.append(snakeHead)“ in die Liste snake ein. Mit dem ersten Schleifenaufruf sieht unsere Liste „snake“ also wie folgt aus: snake =[[55, 155]]. Es sind zwar zwei Zahlen in der Liste, diese werden aber als einen Wert von deinem Computer verstanden. Wir nennen diese Art von Werten, „Tupel“. Der Begriff Tupel stammt aus der Mathematik und bezeichnet eine geordnete Menge von Objekten, die auf bestimmte Weise zusammengefasst und dargestellt werden. In Python fasst man diese Werte mithilfe von eckigen Klammern zusammen.

      Nun wollen wir uns den if-Befehl ansehen. Mithilfe von „len(snake)“ weiß unser Computer wie viele Elemente in unserer Liste „snake“ sind. Mit jedem Schleifenaufruf fügen wir die x- und y-Werte in unsere Liste ein. Ist unsere Liste nun zwei Elemente lang, ohne, dass wir einen Apfel eingesammelt wurde und somit auch ohne, dass „snakeLength“ um eins hochgezählt wurde, wird das erste Element aus der Liste mithilfe von „del snake[0]“ wieder entfernt.

      Dieser if-Befehl hat somit also zwei Aufgaben:

      1. Unsere Schlange wird hierdurch wirklich nur dann länger, wenn sie einen Apfel gegessen hat. Ist das nicht der Fall, wird vorne an der Schlange zwar ein neues Quadrat gezeichnet, gleichzeitig wird das letzte Quadrat aber gelöscht.


      2. Dieser if-Befehl sorgt außerdem für eine flüssige Bewegung unserer Schlange. Dadurch, das wir mit jedem Schleifenaufruf einen neuen Kopf an die Schlage zeichnen und das letzte Element der Schlange löschen, kann sich unsere Schlange wie gewünscht über unseren Bildschirm bewegen. Wenn unsere Schlange einen Apfel findet, wird das letzte Element einfach nicht gelöscht.

      Nun müssen wir aber noch unserer Funktion „snakeExt“ sagen, dass sie alle Elemente aus unserer Liste „snake“ zeichnen soll. Nehme nun an der Funktion „snakeExt“ folgende Änderungen vor:


      Die Funktion benötigt jetzt zwei Parameter, die sie übergeben bekommt. Einmal ist es „size“ also die Größe der einzelnen Quadrate und einmal ist es die Liste „snake“. Die for-Schleife wird nun mit allen Elementen der Liste „snake“ einmal aufgerufen. Im Schleifen-Body zeichnen wir nun die einzelnen Quadrate. Da, wo vorher x und y stand, werden nun die Elemente aus der Liste eingefügt. Diese Elemente entsprechen den Tupeln, welche wieder aus zwei Elementen bestehen. X ersetzen wir durch das erste Element der Tupel „i[0]“ und y durch das zweite Element „i[1]“.

      Bevor wir unser Spiel nun ausprobieren können, müssen wir nun unserer Funktion noch die Parameter übergeben, die sie haben möchte. Hierfür gehen wir noch einmal an das Ende unserer While-Schleife und ändern den Funktionsaufruf wie folgt:


      Nun sollte deine Schlange mit jedem Apfel wachsen. Wenn sie dir zu langsam wächst, kannst du der Variable „speed“ einen höheren Wert geben. Dadurch wird sie zwar schneller länge, sie wird aber auch ihr Tempo deutlich anziehen. Mit einem kleinen Trick kannst du das aber umgehen. Hierfür erhöhst du den Wert der Variable „speed“ und gibst unten in der While-Schleife bei „clock.tick()“ einen kleineren Wert in den Klammern ein. Versuch es mal mit „speed = 10“ und „clock.tick(20)“.


      Für heute wollen wir noch eine letzte Änderung vornehmen. Aktuell kann sich unsere Schlange nämlich noch selber kreuzen. Im originalen Spiel, ist das Spiel vorbei wenn das passiert. Tippe diese Zeilen ab, damit das Spiel beendet wird, sobald unsere Schlange sich selbst kreuzt:


      Jetzt kannst du dein Spiel einwandfrei spielen. Viel Spaß dabei. lächelnd
    • Wenn du nun soweit bist, dass dein Programm aussieht wie meins, kannst du es jetzt hier hochladen.

    • Ausblick

      Unser Spiel lässt sich nun wirklich richtig spielen. Wir können unseren Spieler steuern, wir können Punkte machen indem wir die Äpfel einsammeln, wir verlieren das Spiel, wenn der Spieler den Rand berührt und unsere Schlange wächst mit jedem Apfel den sie isst. Unser Snake-Spiel ist also nun wirklich fertig. Nächste Woche wollen wir uns nur noch um den Feischliff kümmern. Wir werden die Punkte direkt im Spiel anzeigen lassen und wir werden einen "Game Over Bildschirm" anzeigen lassen, wenn wir das Spiel verloren haben. Ich freue mich, dich nächste Woche wieder bei diesem Kurs begrüßen zu dürfen.