• Herzlich Willkommen

      Hallo, ich freu mich, dass du auch diese Woche wieder mit dabei bist! Heute werden wir mit unserem Kurs-Projekt beginnen und dabei wichtige Grundlagen der Python-Programmierung lernen. Ich wünsche dir ganz viel Spaß beim ausprobieren, lernen und entdecken. Lass uns keine Zeit verlieren und direkt loslegen!


    • Über unser Projekt: Snake

      Heute wollen wir direkt mit dem Programmieren unseres, an Snake orientiertem Spiel beginnen. Hierfür müssen wir uns erstmal überlegen was wir unbedingt brauchen. Hier kannst du einmal in dem folgendem Video sehen, wie das Spiel am Ende des Kurses aussehen soll und dir kurz selbst überlegen, was wir für Komponenten benötigen:

        

      Lass uns einmal kurz zusammenfassen was Snake eigentlich ist und worum es in dem Spiel geht:

      • Es gibt einen Spieler in Form einer Schlange

      • Dieser Spieler lässt sich mit den Pfeiltasten steuern

      • Der Spieler kann Punkte machen, indem er so viele Äpfel wie möglich sammelt

      • Mit jedem gesammelten Apfel wird der Spieler (die Schlange) länger

      • Das Spiel ist vorbei, wenn der Spieler die Spielfeldränder berührt oder wenn die Schlange sich kreuzt

      Ein wichtiger Punkt, beim Programmieren ist, dass du dir nicht alles auf einmal vornimmst, denn sonst stehst du vor einem riesigen Berg von Teilaufgaben und weißt nicht genau wo du anfangen sollst. Aus diesem Grund nehmen wir uns heute auch nur vor, den Bildschirm anzeigen zu lassen und einen Spieler zu programmieren, der sich bewegen lässt. Bevor wir starten, lege bitte einen neuen Ordner für diesen Kurs an. Nenne ihn „Python_Kurs“. Jetzt kannst du wieder deine IDLE-Umgebung starten und ein neues Editor-Fenster öffnen. Wenn du dir unsicher bist, wie du dein Editor-Fenster öffnest, schaue noch einmal in dem Kurs der letzten Woche nach. Bevor wir loslegen,  gehe in deinem neuen Editor-Fenster oben links auf „File“ und klicke auf „Save As“. Gehe nun in deinen neu angelegten Ordner und speichere dein Programm als „Snake“.




    • Vorschau

      Heute wollen wir uns das Anzeigen des Bildschirms vornehmen und das Programmieren eines Spielers, der sich bewegen lässt. 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:



    • Jetzt geht es los!

      Jetzt kann es aber wirklich los gehen:

      Hier kannst du einmal das Programm sehen, welches wir heute programmieren wollen. Wir werden dabei aber Schritt für Schritt vorgehen. Merke dir, dass du alles was hinter einem „#“ steht, nie abtippen musst, denn das sind lediglich Kommentare, die dir zum Verständnis des Codes helfen sollen. Sie haben aber keine Auswirkung auf dein Spiel. Solltest du während des Kurses einmal unsicher sein an welche Stelle du eine Zeile schreiben musst, kannst du hier her zurückkehren um noch einmal nachzusehen.


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

      Tippe nun erst einmal diese Zeilen in dein Editor-Fenster:


      In den ersten beiden Zeilen importieren wir zunächst einmal alle Werkzeuge, die wir, neben Python selbst, für unser Spiel benötigen. In diesem Fall benötigen wir einmal „pygame“ um unser Spiel anzeigen lassen zu können, Figuren einfügen und steuern zu können, Punkte anzuzeigen und vieles mehr. Außerdem wollen wir hier noch „sys“ importieren um das Spiel später besser schließen zu können. Imports schreibt man immer in die obersten Zeilen des Codes. Wenn wir also später noch andere Werkzeuge benötigen, kommen diese auch dort hin.

      Mit „pygame.init()“ initialisieren wir Pygame. Das ist nützlich um Fehler zu vermeiden. Allternativ könnte man auch alle Module, die man verwendet einzeln initialisieren, so ist es aber deutlich einfacher. „init()“ ist eine von Pygame vorgefertigte Funktion.

      Funktionen sind sehr nützlich, weil sie viel Schreibarbeit ersparen. Sie sind benannte Codeblöcke, die du immer wieder verwenden kannst, indem du einfach nur ihren Namen schreibst.

      Wenn du eine vordefinierte Funktion von Python verwenden willst, kannst du sie also einfach „aufrufen“, indem du ihren Namen schreibst, gefolgt von einer leeren Klammer. Python führt dann den in der Funktion gespeicherten Code aus.

      Wir werden im laufe des Kurses noch einige vorgefertigte Funktionen kennenlernen und darüber hinaus auch noch eigene Funktionen definieren, die genau zu unserem Spiel passen.

      screen = pygame.display.set_mode([600, 600]) “ erstellt den Bildschirm auf dem dann später auch unser Spiel laufen soll. Wir speichern den Bildschirm in einer Variable mit dem Namen „screen“ um später noch auf ihn zugreifen und mit ihm arbeiten zu können.

      Variablen speichern und benennen einzelne Informationen. Sie sind sehr vielseitig einsetzbar, denn sie zeichnen zum Beispiel Punktzahlen oder den Bildschirm auf.

      Eine Variable braucht einen Namen. Am besten verwendest du immer einen Namen, der angibt, was in der Variable gespeichert wird, damit du direkt weißt, wofür du sie verwendest. Außerdem musst du deiner Variable einen Wert zuweisen.

      Auch für unseren Bildschirm verwenden wir wieder von Pygame vorgefertigte Funktionen. Hier verwenden wir eine Funktion von Pygame, welche „display“ (Bildschirm) heißt und welche wiederum eine Funktion beinhaltet, die „set_mode“ heißt. Diese Funktion möchte nun Daten übergeben bekommen, welche sie dann verarbeitet. Diese Daten nennen wir „Parameter“. Wir tragen eine  Liste mit zwei Werten ein (zwei mal 600). Diese zwei Werte entsprechen der Anzahl der Pixel in x- und y-Richtung und entsprechen somit der Größe unseres Bildschirms.

      Doch was genau ist eigentlich eine Liste? Listen speichern Datensammlungen. Sie können viele Elemente umfassen und gleichzeitig ordnen. Eine Liste kann zum Beispiel ein ganzes Kartenspiel speichern. Sie sind also auch wieder super hilfreich und ersparen uns eine Menge Schreibarbeit. Achte beim erstellen von Listen immer auf die [eckigen Klammern].

      Soweit so gut. Nun wollen wir das Programm einmal starten, um zu sehen, ob das was wir umsetzen wollten auch funktioniert. Klicke hierfür wieder auf „Run“, „Run Module“ und speichere dein Programm wenn du dazu aufgefordert wirst.


      Es sollte sich nun ein solches Fenster bei dir öffnen welches wie folgt aussieht. Mehr haben wir bis jetzt ja auch nicht programmiert. Um das Fenster wieder schließen zu können, musst du das dahinter liegende Shell-Fenster schließen.


      Nun fehlt nur noch unser beweglicher Spieler. Hierfür erstellen wir zunächst die fünf Variablen „x“, „y“, „speed“, „width“ und „height“.

      „x“ und „y“ sollen später der Position unseres Spielers entsprechen. „speed“ gibt die Geschwindigkeit vor, in der sich unser Spieler vorwärts bewegen wird. „width“ und „height“ entsprechen der Breite und der Höhe unseres Spielers.


      Für das bessere Verständnis habe ich dir hier einmal aufgezeichnet, wofür wir welche Variable verwenden:


      In allen eben angelegte Variablen speichern wir Zahlen. In Variablen lassen sich verschiedene Arten von Zahlen speichern. Ganze Zahlen werden als „Integer“ bezeichnet und Dezimalzahlen als „Float“. Programme zählen Dinge meisten als ganze Zahlen. Dezimalzahlen werden dagegen oft für Maßeinheiten verwendet. Dezimalzahlen werden in Python immer mit einem Punkt geschrieben also zum Beispiel als „1.5“.

      Bis jetzt haben wir schonmal die wichtigsten Grundlagen für unser Spiel geschaffen. Was jetzt noch fehlt, ist die Logik des Spiels. Wir müssen unseren Spieler zeichnen lassen und bewegen können. Die meisten Spiele laufen über eine Hauptschleife, welche man Main-Loop nennt und in ihr befindet sich die Spiel-Logik. Eine solche Schleife wollen wir jetzt auch erstellen. Doch was genau ist eine Schleife und wofür braucht man sie?

      In einem Spiel gibt es immer wieder Codeabschitte, die mehrmals ausgeführt werden müssen. Wenn du sie immer wieder schreiben müsstest, wäre das sehr ermüdend. Glücklicherweise gibt es die Schleifen – in zahlreichen unterschiedlichen formen.

      Eine Schleife wiederholt also immer wieder einen bestimmten Codeabschnitt. Den Code den die Schleife wiederholt, schreibst du in den Loop Body („Schleifenkörper“). Die Anweisungen im Loop Body musst du immer mit vier Leerzeichen einrücken. Somit weiß dein Computer, dass dieser Teil zu der Schleife gehört.

      Wir wollen nun eine sogenannte „while-Schleife“ verwenden. Der große Vorteil dieser Art von Schleifen ist, dass du ihr vorher nicht sagen musst, wie oft sie sich wiederholen soll.

      Eine While-Schleife umfasst eine Frage, deren Antwort entweder „True“ oder „False“ ist. Man nennt das eine Schleifenbedingung. Die while-Schleife beginnt nur, wenn die Antwort auf die Frage „True“ lautet. Wenn du also zum Beispiel in einem Spiel ein bestimmte Punktanzahl benötigst um ein Level aufzusteigen, dann ist die Anzahl deiner Punkte die Bedingung. Hast du die Punktzahl erreicht, dann lautet die Antwort auf die Frage „True“ und du darfst das nächste Level spielen. Wenn nicht, ist die Bedingung „False“ und die Schleife wird nicht aufgerufen.

      Tippe nun diese Zeilen ab:


      Wir erstellen vorher noch eine Variable „go“, damit unsere „while-Schleife“ definitiv aufgerufen wird. Die Schleife und somit auch das Spiel wird erst beendet, wenn go = False wird.

      Wenn ein Computer eine Frage stellt, gibt es nur zwei mögliche Antworten: „True“ (wahr) oder „False“ (falsch). In Python heißen diese sie Boolesche Werte und müssen immer mit einem großen Anfangsbuchstaben geschrieben werden. Ein solcher Wert kann ebenfalls in einer Variable gespeichert werden.

      Nun haben wir die Schleife erstellt. Alles, was von der Schleife wiederholt werden soll, muss nun immer 4 Leerzeichen eingerückt werden. Somit weiß dein Computer, dass diese Zeilen zu der Schleife gehören. Wenn du das Einrücken einmal vergisst, wird dein Code nicht funktionieren!

      In die While-Schleifen wollen wir nun zunächst einige grundlegende Einstellungen vornehmen. Diese Einstellungen sind wichtig, damit wir das Spiel später Steuern und beenden können. Wir beginnen mit dem Schließen des Spiels. Tippe nun den folgenden Code-Block ab. Hier verwenden wir wieder eine Schleife. Dieses mal ist es aber keine while- sondern eine for-Schleife.


      Wenn du weißt, wie oft ein Block ausgeführt werden muss, kannst du eine for-Schleife einsetzen. Hierfür benötigt man eine Schleifenvariable. Diese zählt mit, wie oft die Schleife bereits wiederholt wurde. In unserem Fall heißt diese Schleifenvariable „event“ und speichert jedes Event (Ereignis) aus „pygame.event.get()“. „pygame.event.get()“ ist eine Liste mit Elementen. Ein event aus dieser Liste kann beispielsweise das beenden des Programms oder das Drücken einer Taste sein. Die Liste wird von dir während des Spiels gefüllt. Mit dem Element „QUIT“ wollen wir nun auch arbeiten. Quit ist englisch und heißt so viel wie „beenden“.

      Wenn der Eventtyp nun gleich Quit ist, wird das Programm beendet. Wir verwenden hierfür den Python-Befehl „if“.

      In Spielen musst du oft Entscheidungen treffen. Gehst du nach rechts oder gehst du nach links? Wenn du nach rechts geht, passiert eventuell etwas ganz anderes als wenn du nach links gegangen wärst. Aus diesem Grund enthalten Programme häufig Code, der nur in bestimmten Situationen ausgeführt wird. Der Computer muss dann entscheiden, welche Teile er unter welchen Bedingungen ausführt.

      Hierfür gibt es in Python ein paar einfache Befehle. Sie nennen sich if- else-Befehle. If ist das englische Wort für „wenn“ und else heißt auf deutsch „sonst“. Ein kleines Beispiel: Wenn meine Zähne schon geputzt sind, dann kann ich jetzt ins Bett gehen. Sonst muss ich jetzt erstmal meine Zähne putzen gehen. In diesem Bespiel sind die geputzten Zähne unsere Bedingung um ins Bett gehen zu können. Du kannst eine Verzweigung an so viele Bedingungen knüpfen wie du möchtest. Außerdem kannst du deine Aussagen so sehr verzweigen wie due möchtest. Du könntest zu Beispiel auch folgendes sagen: Wenn meine Zähne schon geputzt sind, dann kann ich jetzt ins Bett gehen. Sonst, wenn es sowieso noch nicht Schlafenszeit ist, kann ich auch noch ein Stück Schokolade essen. Sonst muss ich jetzt erstmal meine Zähne putzen gehen.

      Und genau das selbe machen wir an dieser Stelle: Wenn das Event gleich Quit ist, was im Endeffekt abfragt, ob du das x in der rechten oberen Bildschirmecke gedrückt hast, wird der darunter stehende, eingerückte Code ausgeführt und beendet das Programm. Wenn das Event ungleich Quit ist, passiert nichts. Dieser Code-Block wird dann übersprungen. 

      Ist dir aufgefallen, dass wir bei unserer If-Abfrage zwei Gleichheitszeichen verwendet haben?

      Die folgenden Symbole nennt man „logische Operatoren“. Mit ihrer Hilfe stellt der Computer Vergleiche an, damit er Fragen stellen kann. Dein Computer kann dann auf die Frage mit „True“ oder „False“ antworten:


      Nun wollen wir uns darum kümmern, unseren Spieler bewegen zu können. Wir wollen hierfür die Pfeiltasten verwenden. Pygame hat eine Funktion, welche abfragen kann, ob eine Taste gedrückt wurde. Hierfür schrieben wir „pygame.key.get_pressed()“. Hiermit bekommen wir die Werte der Taste zurückgegeben. Wir interessieren uns jetzt erstmal nur für „UP“, „DOWN“, „RIGHT“ und „LEFT“ für hoch, runter, rechts und links. Zunächst speichern wir den Wert, den wir von der Funktion „pygame.key.get_pressed()“ bekommen in der Variable „pressed“. Mit diesem Wert wollen wir nämlich nun noch weiter arbeiten. Der Computer soll, wenn der Wert = Up ist, den Wert von speed (welcher aktuell noch gleich 3 ist) abziehen. Hierfür kann man einfach „y -= speed“ schreiben. Unser Spieler wird dann an der y-Koordinate 300 minus 3 neu gezeichnet. Hat pressed den Wert Down addieren wir den Wert 3 auf unsere y-Koordinate drauf. Bei Left ziehen wir den Wert 3 von unserem x Wert ab und bei Right addieren wir wieder den Wert 3 auf unsere x-Koordinate drauf.


      Für ein besseres Verständnis habe ich dir hier eine kleine Skizze angefertig. Sieh sie dir bitte an und versuche sie zu verstehen. Wichtig ist hierbei, dass du erkennst, dass das die y-Achse des Koordinatensystems in Python, anders als in der Schule, nach unten zeigt:



      Eine ganz wichtige Sache fehlt noch: unser Spieler. Wir haben zwar schon die wichtigsten Parameter festgelegt, allerdings zeichnen wir ihn noch nicht. Das wollen wir jetzt ändern. Für‘s erste soll es uns reichen, wenn unser Spieler als Rechteck dargestellt wird. Hierfür hat Pygame eine vorgefertigte Funktion. Tippe nun die Zeile „pygame.draw.rect(screen, (255,255,0), (x,y,width,height)) “. Draw ist das englische Wort für zeichnen. Rect ist eine Abkürzung für das englische Wort Rectangel was wiederum Rechteck heißt. Du könntest auch andere geometrische Formen zeichnen lassen, aber wir wollen nun erstmal bei dem Rechteck bleiben. Wir müssen der Funktion nun noch einige Parameter übergeben:

      1. Wo soll das Rechteck gezeichnet werden?  Auf den screen
      2. Welche Farbe soll das Rechteck haben?  (255,255,0) = Gelb
      3. An welche Stelle des Koordinatensystems soll das Rechteck gezeichnet werden und wie groß soll es sein?

      Tippe nun diese Zeile ab, um unseren Spieler zu Zeichnen:



      Die nächste, sehr wichtige Zeile die wir schreiben wollen ist „pygame.display.update()“. Hiermit aktualisieren wir unseren Bildschirm. Würden wir diese Zeil weglassen, könnten wir nichts auf unseren Bildschirm zeichnen können.


      Wir wollen nun noch eine Zeile außerhalb der Schleife einfügen. Wir werden nun noch eine weiter Variable anlegen. Diese nennen wir „clock“. Sie wird unsere Uhr sein. Wir benötigen diese  Variable, um unser Spiel in einer bestimmten „Bilder-pro-Sekunden-Anzahl“ ablaufen zu lassen. Sie gibt also an, wie oft unser Bildschirm pro Sekunde aktualisiert wird. Ist die Anzahl der Bilder pro Sekunde zu hoch, wird sich unser Spieler zu schnell bewegen. Ist der Wert allerdings zu niedrig, haben wir keinen flüssigen Spielverlauf und das Spiel scheint zu harken.


      An das Ende unserer Spielschleife schreiben wir nun „clock.tick(60)“ was 60 Bilder pro Sekunde entspricht.


      Nun kannst du dein Spiel einmal starten. Mit den Pfeiltasten solltest du deinen Spieler nun steuern können. Wir können nun quasi mit unserem Spieler malen. Das ist aber nicht was wir wollen. Es liegt daran, dass der weg unseres Spielers gezeichnet wird.


      Wir können einen einfachen Trick anwenden: Mit jedem Schleifenaufruf zeichnen wir den Bildschirm wieder schwarz. Das ganze machen wir mit der Zeile „screen.fill((0,0,0))“. Dabei steht die Zahl (0,0,0) für schwarz.


      Wenn du nun dein Spiel startest, kannst du deinen Spieler so bewegen, wie wir es haben wollten. Sollte das nicht der Fall sein, scrolle noch einmal nach oben und vergleiche deinen Code mit meinem.




    • Wenn du nun soweit bist, dass dein Programm aussieht wie meins, kannst du es jetzt hier hochladen.

    • Zusammenfassung

      Wir haben heute schon so viel geschafft und dabei auch die wichtigsten Dinge über die Python-Programmierung gelernt. Lass uns das Ganze noch einmal zusammenfassen. Du kannst dann auch jederzeit hierher zurückkehren um nochmal nachzuschauen was eine Variable, eine Schleife oder eine Funktion ist:

      Variablen

      Variablen speichern und benennen einzelne Informationen. Sie sind sehr vielseitig einsetzbar, denn sie zeichnen zum Beispiel Punktzahlen oder die Zahl deiner verbleibenden Leben auf. Eine Variable braucht einen Namen. Am besten verwendest du immer einen Namen, der angibt, was in der Variable gespeichert wird, damit du direkt weißt, wofür du sie verwendest. Außerdem musst du deiner Variable einen Wert zuweisen.

      Du hast schon gelernt, dass wir verschiedene Typen in Variablen speichern können. Hier hast du alles nochmal im Überblick. Wenn du dir einmal unsicher sein solltest welchen Typ du verwenden musst, kannst du immer zu dieser Übersicht zurückkehren:



      Entscheidungen

      In Spielen musst du oft entscheiden, wie du weiter vorgehst und meist beruhen die Entscheidungen auf Fragen wie: „Habe ich noch Leben übrig?“, „Ist jemand hinter mir?“ oder: “Habe ich die höchste Punktzahl geschlagen?“

      Auch Computer nutzen Fragen als Entscheidungsgrundlage. Oft vergleichen sie dabei zwei Werte, zum Bespiel: „Ist die Zahl größer als die andere?“ Wenn ja, überspringt der Computer vielleicht einen Codeblock, den er sonst ausgeführt hätte. Für diese Fragen verwenden wir häufig logische Operatoren wie diese:


      Außerdem haben wir heute die "if-else"-Befehle kennengelernt. Mit der Hilfe dieses Befehls können wir unserem Computer Fragen stellen, welche er dann mit "Ja" oder "Nein" beantworten kann.

      Schleifen

      In einem Spiel gibt es immer wieder Codeabschitte, die mehrmals ausgeführt werden müssen. Wenn du sie immer wieder schreiben müsstest, wäre das sehr ermüdend. Glücklicherweise gibt es die Schleifen – in zahlreichen unterschiedlichen formen.

      Eine Schleife wiederholt also immer wieder einen bestimmten Codeabschnitt. Den Code den die Schleife wiederholt, schreibst du in den Loop Body („Schleifenkörper“). Die Anweisungen im Loop Body musst du immer mit vier Leerzeichen einrücken. Somit weiß dein Computer, dass dieser Teil zu der Schleife gehört.

      Wir haben heute die "For-" und die "While-Schleifen" kennengelernt.

      Wenn du weißt, wie oft ein Block ausgeführt werden muss, kannst du eine for-Schleife einsetzen. Hierfür benötigt man eine Schleifenvariable. Diese zählt mit, wie oft die Schleife bereits wiederholt wurde.

      Manchmal kannst du nicht genau sagen, wie oft eine Schleife wiederholt werden soll. Aber keine Sorge: In diesen Fällen kannst du eine While-Schleife verwenden. Eine While-Schleife umfasst eine Frage, deren Antwort entweder „True“ oder „False“ ist. Man nennt das eine Schleifenbedingung. Die while-Schleife beginnt nur, wenn die Antwort auf die Frage „True“ lautet. Wenn du also zum Beispiel in einem Spiel ein bestimmte Punktanzahl benötigst um ein Level aufzusteigen, dann ist die Anzahl deiner Punkte die Bedingung. Hast du die Punktzahl erreicht, dann lautet die Antwort auf die Frage „True“ und du darfst das nächste Level spielen. Wenn nicht, ist die Bedingung „False“ und die Schleife wird nicht aufgerufen.

      Funktionen

      Funktionen sind sehr nützlich, weil sie viel Schreibarbeit ersparen. Sie sind benannte Codeblöcke, die du immer wieder verwenden kannst, indem du einfach nur ihren Namen schreibst. Python hat bereits einige vordefinierte Funktionen, aber du kannst auch jederzeit eigene Funktionen schreiben, die genau zu den Aufgaben in deinem Spielen passen.

      Wenn du eine vordefinierte Funktion von Python verwenden willst, kannst du sie „aufrufen“, indem du ihren Namenschreibst, gefolgt von einer leeren Klammer. Python führt dann den in der Funktion gespeicherten Code aus. Daten, mit denen die Funktion arbeiten soll, schreibst du in die Klammer. Diese Daten nennt man „Parameter“.



    • Ausblick

      Heute haben wir einige, wichtige Grundlagen für diesen Kurs gelegt. Unser Spieler kann sich jetzt schon bewegen. Allerdings bewegt er sich nur, wenn wir eine der Pfeiltasten drücken. In dem Spiel Snake ist es aber eigentlich so, dass sich der Spieler immer automatisch in die Richtung bewegt, in die du ihn lenkst. Das wollen wir nächste Woche ändern. Außerdem wollen wir einen Hintergrund einfügen und unser Spieler soll sich auch nicht mehr über den Bildschirmrand hinaus bewegen können. Ich freue mich, dich nächste Woche wieder bei diesem Kurs begrüßen zu dürfen.