Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| gf_informatik:programmieren_i_new [2023-08-29 08:05] – gelöscht hof | gf_informatik:programmieren_i_new [2026-04-14 07:11] (aktuell) – [Flächen füllen] hof | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== Programmieren I: Programmieren mit TurtleGraphics ====== | ||
| + | |||
| + | ===== - Einführung ===== | ||
| + | |||
| + | Ein Computer ist zunächst einfach mal eine Maschine, die wahnsinnig schnell arbeiten (rechnen) kann. Damit man zum Beispiel ein Spiel spielen können, muss irgend jemand dem Computer also sagen, was er denn genau zu tun hat. Jemand muss also ein **Computerprogramm**, | ||
| + | |||
| + | Wir wählen hier die Programmiersprache **Python**. Im Jahre 2026 ist diese Sprache sicher in der Top 3 der wichtigsten Programmiersprachen - wenn nicht sogar auf dem ersten Platz. Dazu kommt, dass Python im Vergleich zu anderen Sprachen, z.B. C\+\+ (C Plus Plus), Java oder C# (C sharp) relativ einfach zu erlernen ist. | ||
| + | |||
| + | Wenn wir einen Satz mit vielen Schreibfelern und Grammatikfehler lesen, so sind wir meist trotzdem in der Lage, den Satz zu verstehen. Im Gegensatz zu uns ist ein Computer ist nicht in der Lage, einen Text selbst zu interpretieren. Ein Computer kann ein Programm nur ausführen, wenn es gar keine Fehler, sogenannte **Bugs**, hat. Es ist deshalb wichtig, dass man sich an die formalen Vorgaben der Programmiersprache hält. | ||
| + | |||
| + | ==== Installation ==== | ||
| + | |||
| + | === Web Tiger Python === | ||
| + | Am einfachsten ist es, Programme direkt im Web zu schreiben. Wir verwenden die folgenden Seiten: | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | Die Programme werden im Web allerdings nicht gespeichert. Am besten dokumentierst du deine Codes, indem du ein [[https:// | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | <nodisp 2> | ||
| + | ++++ Tiger Jython| | ||
| + | === Tiger Jython === | ||
| + | |||
| + | Alternativ steht ein installierbares Programm bereit, das auch _offline_ funktioniert. Gehe auf die Website [[https:// | ||
| + | |||
| + | *Tipp:* Wahrscheinlich benötigst du die 64-bit Version | ||
| + | |||
| + | == Entwicklungsumgebung === | ||
| + | |||
| + | Das Menu in TigerJython oben links sieht aus wie folgt: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Die wichtigsten Befehle, die du in TigerJython brauchst, sind die vier Symbole ganz links: | ||
| + | |||
| + | * **Neues Projekt** erstellen (Ctrl+N) | ||
| + | * Bestehendes Projekt **öffnen** (Ctrl+O) | ||
| + | * **Speichern** (Ctrl+S) | ||
| + | * Programm **ausführen** (F5) | ||
| + | |||
| + | Du solltest dir angewöhnen, | ||
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | ==== Dokumentation ==== | ||
| + | |||
| + | * Erstelle eine Ordnerstruktur auf [[https:// | ||
| + | * Erstelle für jedes Kapitel [[https:// | ||
| + | * Du machst dir Notizen während der Lektionen und zu den Aufgaben. Programme speicherst du als Permalink. | ||
| + | * Für einige Aufgaben wird es **Musterlösungen** geben, aber nicht für alle. Falls du dir unsicher bist: Frage bei der Lehrperson nach. | ||
| + | * Du bist **selbst verantwortlich**, | ||
| + | |||
| + | ==== Tipps ==== | ||
| + | |||
| + | * Im Dossier gibt es viele kleine **Code-Beispiele**. Tippe diese jeweils //von Hand ab// und versuche, alles zu // | ||
| + | * Verwende **Shortcuts**: | ||
| + | * Ctrl+Enter: Programm ausführen (statt auf den grünen Pfeil klicken). | ||
| + | * Generell: Benutze die Maus so wenig wie möglich! | ||
| + | |||
| + | ===== - Einfache Bewegungen ===== | ||
| + | < | ||
| + | |||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | fritz = Turtle() | ||
| + | |||
| + | fritz.forward(100) | ||
| + | </ | ||
| + | |||
| + | Erklärung der Zeilen: | ||
| + | - Zuerst musst du das *Modul `turtle` importieren*, | ||
| + | - Erzeuge eine neue Turtle mit einem Namen, hier `fritz`. Man nennt dieses auch ein *Turtle-Objekt*. | ||
| + | - Gib deiner Turtle den Befehl, 100 Pixel vorwärts zu laufen. | ||
| + | |||
| + | Du kannst deiner Turtle befehlen, sie soll sich um einen gewissen Winkel drehen oder rückwärts laufen. Die wichtigsten Befehle sind unten aufgeführt. Jedem Befehl muss der Name der Turtle (im Beispiel `fritz`) und ein Punkt vorangestellt werden. Viele weitere Befehle finden sich auf der [[gf_informatik: | ||
| + | |||
| + | ^ Befehl ^ Beschreibung ^ | ||
| + | | `forward(s)` | `s` Schritte (in Pixel) vorwärts bewegen | ||
| + | | `back(s)` | ||
| + | | `right(w)` | ||
| + | | `left(w)` | ||
| + | | `home()` | ||
| + | |||
| + | Um die Turtle an eine andere Stelle zu bewegen, brauchst du die folgenden Befehle: | ||
| + | |||
| + | ^ Befehl ^ Erklärung^ | ||
| + | | `teleport(-100, | ||
| + | | `setpos(-100, | ||
| + | | `setx(30)` | ||
| + | | `sety(30)` | ||
| + | | `up()` | Hebt den Stift, es wird also **nicht gezeichnet** | | ||
| + | | `down()` | Setzt Stift wieder ab, es wird also wieder **gezeichnet** | | ||
| + | |||
| + | Du willst mehr machen? Dann findest du viele weitere Funktionen in der [[https:// | ||
| + | |||
| + | ==== Aufgaben A ==== | ||
| + | |||
| + | === Aufgabe A1 === | ||
| + | |||
| + | Mache dich mit all diesen **Befehlen vertraut** und probiere sie aus. | ||
| + | |||
| + | === Aufgabe A2 === | ||
| + | |||
| + | Programmiere deine Turtle so, dass sie ein **Quadrat** abläuft. | ||
| + | |||
| + | === Aufgabe A3 === | ||
| + | |||
| + | Programmiere deine Turtle so, dass sie **deinen Namen**, Spitznamen oder zumindest deine Initialen abläuft. | ||
| + | |||
| + | === Aufgabe A4 === | ||
| + | |||
| + | Wahrscheinlich hast du die Aufgabe 2 (Quadrat ablaufen) so gelöst, dass dein Code aus 4x genau den gleichen vier Zeilen Code besteht. Dies ist zwar richtig, aber nicht sehr elegant. Mit `repeat` kannst du sagen, dass du einen Codeblock eine gewisse Anzahl mal hintereinander ausführen möchtest: | ||
| + | |||
| + | <code python> | ||
| + | repeat 4: | ||
| + | # schreibe hier deinen Code | ||
| + | </ | ||
| + | |||
| + | Bemerkungen: | ||
| + | * Der Codeblock, welcher mehrfach Wiederholt werden soll muss nach dem `repeat` Befehl **eingerückt** sein, und zwar um genau 4 Leerzeichen (oder 1x Tab). | ||
| + | * **Kommentare** werden in Python mit `#` gekennzeichnet. Kommentare werden von Python *ignoriert*. Man kann diese z.B. brauchen, um im Code Erklärungen anzufügen, damit jemand andere den Code besser verstehen kann. | ||
| + | |||
| + | Gehe zurück zu Aufgabe A2. Schreibe deine Lösung um, indem du den `repeat` Befehl verwendest. | ||
| + | |||
| + | ===== - Kreisbogen ===== | ||
| + | |||
| + | Um einen Turtle namens *Fritz* einen **Punkt** mit Radius 20 Pixel zeichnen zu lassen, tippe einfach: | ||
| + | |||
| + | <code python> | ||
| + | fritz.dot(20) | ||
| + | </ | ||
| + | |||
| + | Bisher haben wir unsere Turtles ausschliesslich gerade Linien laufen lassen. Um auf einem **Kreis** zu gehen, verwende den Befehl `circle(radius)`. | ||
| + | |||
| + | <code python> | ||
| + | fritz.circle(20) | ||
| + | </ | ||
| + | |||
| + | Dabei bestimmt das Argument den Radius des Kreise in Pixel. Ist der Radius positiv, zeichnen im Gegenuhrzeigersinn, | ||
| + | |||
| + | Um einen Teilkreis zu zeichnen, können wir zusätzlich den Winkel zwischen 0 und 360 Grad übergeben. | ||
| + | |||
| + | Zum Beispiel zeichnet man mit dem Befehl `circle(-100, | ||
| + | |||
| + | ==== Aufgaben B ==== | ||
| + | |||
| + | === Aufgabe B1 === | ||
| + | |||
| + | Verwende die Befehle `dot(), forward(), right(), left()`, um folgende Figur zu zeichnen: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Versuche nun deinen Code zu kurz wie möglich zu schreiben. Vermeide Code-Wiederholungen, | ||
| + | |||
| + | === Aufgabe B2 === | ||
| + | |||
| + | Zeichne mit Hilfe der Befehle `circle()` die nebenstehende Figur. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Aufgabe B3 === | ||
| + | |||
| + | Zeichne die folgende Schmetterling-Figur: | ||
| + | |||
| + | {{: gf_informatik: | ||
| + | |||
| + | === Aufgabe B4 === | ||
| + | |||
| + | Zeichne die folgenden Figuren; | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Aufgabe B5 === | ||
| + | |||
| + | Gelingt es dir die nebenstehende Figur in einem Zug zu zeichnen, ohne dass dabei eine Strecke zweimal durchlaufen wird? | ||
| + | |||
| + | {{: gf_informatik: | ||
| + | |||
| + | |||
| + | ===== - Farben (**Optional) ===== | ||
| + | |||
| + | Wir haben gelernt, wie man mit einem Turtle Figuren zeichnen kann. Nun wollen wir noch etwas Farbe ins Spiel bringen! | ||
| + | |||
| + | ==== Flächen füllen ==== | ||
| + | |||
| + | Just for fun: | ||
| + | * Kopiere den folgenden Code nach TigerPython (oder folge [[https:// | ||
| + | * Überlege dir bei jedem Codeblock, was dieser tut, und dokumentiere in einem Kommentar! | ||
| + | * Vergleicht eure Voraussagen zu zweit. | ||
| + | * Führe den Code aus! | ||
| + | * Trifft deine Voraussage zu? | ||
| + | * Ändere den Code ab, um das Bild zu verändern! | ||
| + | |||
| + | < | ||
| + | # Turtle wird importiert und eine neue Turtle mit | ||
| + | # dem Namen ' | ||
| + | # TODO import | ||
| + | fritz = Turtle() | ||
| + | |||
| + | # Fritz wird nach links und oben teleportiert. | ||
| + | fritz.teleport(-50, | ||
| + | |||
| + | # Was passiert hier? | ||
| + | Screen().bgcolor(" | ||
| + | fritz.color(" | ||
| + | |||
| + | fritz.begin_fill() | ||
| + | repeat 4: | ||
| + | repeat 3: | ||
| + | fritz.forward(100) | ||
| + | fritz.right(90) | ||
| + | fritz.left(180) | ||
| + | fritz.end_fill() | ||
| + | </ | ||
| + | |||
| + | Studiere den Code Zeile für Zeile. Stelle sicher, dass du folgende Befehle genau verstehst. | ||
| + | |||
| + | ^ Befehl ^ Erklärung^ | ||
| + | | `Screen().bgcolor(' | ||
| + | | `color(' | ||
| + | | `pencolor(' | ||
| + | | `fillcolor(' | ||
| + | | `begin_fill()` / `end_fill()` | Füllt den ganzen zwischen `begin` und `end` gezeichneten Körper mit der Füllfarbe.| | ||
| + | | `width(10)` | Legt die **Breite des Stiftes** fest.| | ||
| + | |||
| + | ==== Aufgaben C ==== | ||
| + | |||
| + | Verwende `pencolor` / `fillcolor`, | ||
| + | |||
| + | === Aufgabe C1 === | ||
| + | |||
| + | Spieglein, Spieglein... | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <nodisp 1> | ||
| + | ++++Lösung| | ||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | t = Turtle() | ||
| + | t.hideturtle() | ||
| + | |||
| + | # Farbe und Stiftbreite | ||
| + | t.color(" | ||
| + | t.width(5) | ||
| + | |||
| + | # Gefüllter Kreis | ||
| + | t.begin_fill() | ||
| + | t.circle(50) | ||
| + | t.end_fill() | ||
| + | |||
| + | # Griff | ||
| + | t.right(90) | ||
| + | t.forward(75) | ||
| + | t.backward(40) | ||
| + | t.left(90) | ||
| + | t.forward(40) | ||
| + | t.backward(80) | ||
| + | </ | ||
| + | |||
| + | ++++ | ||
| + | </ | ||
| + | === Aufgabe C2 === | ||
| + | |||
| + | A star is born - don't forget to `repeat`: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <nodisp 1> | ||
| + | ++++Lösung| | ||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | t = Turtle() | ||
| + | t.hideturtle() | ||
| + | |||
| + | # Hintergrund-, | ||
| + | Screen().bgcolor(" | ||
| + | t.fillcolor(" | ||
| + | t.pencolor(" | ||
| + | t.width(4) | ||
| + | |||
| + | # Sechs Ecken | ||
| + | t.begin_fill() | ||
| + | repeat 6: | ||
| + | t.forward(40) | ||
| + | t.right(120) | ||
| + | t.forward(40) | ||
| + | t.left(60) | ||
| + | t.end_fill() | ||
| + | </ | ||
| + | |||
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | === Aufgabe C3 === | ||
| + | Here comes the sun! | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <nodisp 1> | ||
| + | ++++Lösung| | ||
| + | < | ||
| + | from turtle import* | ||
| + | |||
| + | t = Turtle() | ||
| + | t.hideturtle() | ||
| + | t.speed(0) | ||
| + | |||
| + | Screen().bgcolor(" | ||
| + | t.color(" | ||
| + | |||
| + | # Statt ganz vieler Zacken: Linien durchziehen... | ||
| + | t.begin_fill() | ||
| + | repeat 36: | ||
| + | t.forward(100) | ||
| + | t.right(130) | ||
| + | t.end_fill() | ||
| + | </ | ||
| + | |||
| + | |||
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== - Lösungen ===== | ||
| + | |||
| + | <nodisp 1> | ||
| + | ++++Lösungen A| | ||
| + | ==== Aufgaben A ==== | ||
| + | ===== A2 ===== | ||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | fritz = Turtle() | ||
| + | |||
| + | fritz.forward(100) | ||
| + | fritz.left(90) | ||
| + | fritz.forward(100) | ||
| + | fritz.left(90) | ||
| + | fritz.forward(100) | ||
| + | fritz.left(90) | ||
| + | fritz.forward(100) | ||
| + | fritz.left(90) | ||
| + | </ | ||
| + | |||
| + | ===== A3 ===== | ||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | fritz = Turtle() | ||
| + | |||
| + | # Buchstabe: K | ||
| + | fritz.left(90) | ||
| + | fritz.teleport(-200, | ||
| + | fritz.forward(200) | ||
| + | fritz.teleport(-200, | ||
| + | fritz.right(45) | ||
| + | fritz.forward(141) | ||
| + | fritz.teleport(-200, | ||
| + | fritz.right(90) | ||
| + | fritz.forward(141) | ||
| + | |||
| + | # Buchstabe: S | ||
| + | fritz.teleport(-50, | ||
| + | fritz.left(45) | ||
| + | fritz.forward(100) | ||
| + | fritz.left(90) | ||
| + | fritz.forward(100) | ||
| + | fritz.left(90) | ||
| + | fritz.forward(100) | ||
| + | fritz.right(90) | ||
| + | fritz.forward(100) | ||
| + | fritz.right(90) | ||
| + | fritz.forward(100) | ||
| + | |||
| + | # Buchstabe: R | ||
| + | fritz.teleport(100, | ||
| + | fritz.left(90) | ||
| + | fritz.forward(200) | ||
| + | fritz.right(90) | ||
| + | fritz.forward(100) | ||
| + | fritz.right(90) | ||
| + | fritz.forward(100) | ||
| + | fritz.right(90) | ||
| + | fritz.forward(100) | ||
| + | fritz.left(135) | ||
| + | fritz.forward(141) | ||
| + | </ | ||
| + | |||
| + | ===== A4 ===== | ||
| + | |||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | fritz = Turtle() | ||
| + | |||
| + | repeat 4: | ||
| + | fritz.forward(100) | ||
| + | fritz.left(90) | ||
| + | </ | ||
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | <nodisp 1> | ||
| + | ++++Lösungen B| | ||
| + | |||
| + | ==== Aufgaben B ==== | ||
| + | ===== B1 ===== | ||
| + | |||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | matteo = Turtle() | ||
| + | |||
| + | repeat 2: | ||
| + | matteo.dot(20) | ||
| + | matteo.left(45) | ||
| + | matteo.forward(100) | ||
| + | matteo.dot(20) | ||
| + | matteo.right(90) | ||
| + | matteo.forward(100) | ||
| + | matteo.dot(20) | ||
| + | # Turn left only 45° as the next round | ||
| + | # will start with a left turn. | ||
| + | matteo.left(45) | ||
| + | </ | ||
| + | |||
| + | ===== B2 ===== | ||
| + | |||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | matteo = Turtle() | ||
| + | matteo.left(90) | ||
| + | |||
| + | matteo.teleport(-100, | ||
| + | |||
| + | matteo.circle(-100, | ||
| + | matteo.circle(-50, | ||
| + | matteo.circle(50, | ||
| + | </ | ||
| + | |||
| + | ===== B3 ===== | ||
| + | |||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | matteo = Turtle() | ||
| + | matteo.left(90) | ||
| + | |||
| + | matteo.circle(-25, | ||
| + | matteo.circle(-50, | ||
| + | matteo.circle(-100, | ||
| + | |||
| + | matteo.teleport(0, | ||
| + | matteo.setheading(90) | ||
| + | |||
| + | matteo.circle(25, | ||
| + | matteo.circle(50, | ||
| + | matteo.circle(100, | ||
| + | </ | ||
| + | |||
| + | ===== B4 ===== | ||
| + | |||
| + | < | ||
| + | from turtle import * | ||
| + | |||
| + | anna = Turtle() | ||
| + | anna.hideturtle() | ||
| + | |||
| + | # 1 | ||
| + | anna.left(90) | ||
| + | anna.teleport(-350, | ||
| + | |||
| + | repeat 3: | ||
| + | anna.forward(200) | ||
| + | anna.right(120) | ||
| + | |||
| + | # 2 | ||
| + | anna.teleport(-100, | ||
| + | |||
| + | repeat 6: | ||
| + | anna.forward(100) | ||
| + | anna.right(60) | ||
| + | |||
| + | # 3 | ||
| + | anna.teleport(150, | ||
| + | |||
| + | repeat 2: | ||
| + | anna.forward(100) | ||
| + | anna.right(90) | ||
| + | repeat 3: | ||
| + | anna.forward(100) | ||
| + | anna.left(90) | ||
| + | </ | ||
| + | |||
| + | ===== B5 ===== | ||
| + | |||
| + | < | ||
| + | from turtle import * | ||
| + | from math import sqrt | ||
| + | |||
| + | josef = Turtle() | ||
| + | # | ||
| + | |||
| + | m = 200 | ||
| + | l = m*sqrt(2) | ||
| + | s = m/sqrt(2) | ||
| + | |||
| + | josef.left(135) | ||
| + | josef.forward(l) | ||
| + | repeat 2: | ||
| + | josef.right(90) | ||
| + | josef.forward(s) | ||
| + | josef.right(90) | ||
| + | josef.forward(l) | ||
| + | josef.right(135) | ||
| + | josef.forward(m) | ||
| + | repeat 3: | ||
| + | josef.right(90) | ||
| + | josef.forward(m) | ||
| + | </ | ||
| + | |||
| + | ++++ | ||
| + | </ | ||