Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| gf2:agent [2023/10/08 15:04] – marroc | gf2:agent [2024/12/10 07:37] (aktuell) – marroc | ||
|---|---|---|---|
| Zeile 6: | Zeile 6: | ||
| Sobald man mit der Taste '' | Sobald man mit der Taste '' | ||
| - | + | ====Aufgaben==== | |
| - | <WRAP nicebox green> | + | |
| - | + | ||
| - | **Aufgabe A**\\ | + | |
| **Allgemeiner Auftrag:** \\ | **Allgemeiner Auftrag:** \\ | ||
| Probiert in mindestens drei verschiedenen Beispielen die unten aufgelisteten Befehle aus und lasst den Agenten bewegen und bauen. Dazu könnt ihr Euch auch in Zweiergruppen gegenseitig kleine Aufgaben stellen, die der Agent ausführen soll. Tipp: Beginnt mit einer sehr einfachen Aufgabe und stellt Euch dann langsam den grösseren Herausforderungen. | Probiert in mindestens drei verschiedenen Beispielen die unten aufgelisteten Befehle aus und lasst den Agenten bewegen und bauen. Dazu könnt ihr Euch auch in Zweiergruppen gegenseitig kleine Aufgaben stellen, die der Agent ausführen soll. Tipp: Beginnt mit einer sehr einfachen Aufgabe und stellt Euch dann langsam den grösseren Herausforderungen. | ||
| \\ | \\ | ||
| - | \\ | + | <WRAP nicebox green> |
| - | **Auftrag in kleinen Schritten:** \\ | + | ** Aufgabe 1**\\ |
| - | [[gf2:aufgaben2D2|Teilaufträge]] \\ | + | Betrachte das untenstehende Programm und überlege dir, was es macht. |
| - | --> | + | Kopiere es in Minecraft und teste es (' |
| + | |||
| + | <sxh python> | ||
| + | # Grundeinstellungen | ||
| + | agent.set_assist(PLACE_ON_MOVE, | ||
| + | agent.set_item(GOLD_BLOCK, | ||
| + | agent.set_slot(1) | ||
| + | |||
| + | # Programm | ||
| + | agent.move(FORWARD, | ||
| + | agent.turn_left() | ||
| + | agent.move(FORWARD, | ||
| + | agent.turn_left() | ||
| + | agent.move(FORWARD, | ||
| + | agent.turn_left() | ||
| + | agent.move(FORWARD, | ||
| + | </ | ||
| + | |||
| + | **Aufgabe 2** \\ | ||
| + | |||
| + | Ich möchte, dass der Agent ein Quadrat der Seitenlänge 5 baut, doch irgendetwas funktioniert nicht? | ||
| + | Versuche das Programm so zu ändern, dass er wirklich ein Quadrat der Seitenlänge 5 baut. \\ | ||
| + | < | ||
| + | <panel title=" | ||
| + | <sxh python> | ||
| + | # Grundeinstellungen | ||
| + | agent.set_assist(PLACE_ON_MOVE, | ||
| + | agent.set_item(RED_SANDSTONE, | ||
| + | agent.set_slot(1) | ||
| + | agent.set_assist(DESTROY_OBSTACLES, | ||
| + | |||
| + | # Programm für ein Quadrat, welches nicht ausgefüllt ist | ||
| + | agent.move(FORWARD, | ||
| + | agent.turn_left() | ||
| + | agent.move(FORWARD, | ||
| + | agent.turn_left() | ||
| + | agent.move(FORWARD, | ||
| + | agent.turn_left() | ||
| + | agent.move(FORWARD, | ||
| + | </ | ||
| + | < | ||
| + | # Grundeinstellungen | ||
| + | agent.set_assist(PLACE_ON_MOVE, | ||
| + | agent.set_item(RED_SANDSTONE, | ||
| + | agent.set_slot(1) | ||
| + | agent.set_assist(DESTROY_OBSTACLES, | ||
| + | |||
| + | # Programm für ein Quadrat, welches ausgefüllt ist | ||
| + | |||
| + | agent.move(FORWARD, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(BACK, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(FORWARD, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(BACK, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(FORWARD, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(BACK, | ||
| + | agent.move(LEFT, | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | **Aufgabe 3** \\ | ||
| + | |||
| + | Füge deinem Programm eine Variable mit dem Namen '' | ||
| + | < | ||
| + | <panel title=" | ||
| + | < | ||
| + | # Grundeinstellungen | ||
| + | agent.set_assist(PLACE_ON_MOVE, | ||
| + | agent.set_item(RED_SANDSTONE, | ||
| + | agent.set_slot(1) | ||
| + | |||
| + | agent.set_assist(DESTROY_OBSTACLES, | ||
| + | |||
| + | # | ||
| + | seitenlaenge=5 | ||
| + | # Programm für ein Quadrat, welches nicht ausgefüllt ist | ||
| + | agent.move(FORWARD, | ||
| + | agent.turn_left() | ||
| + | agent.move(FORWARD, | ||
| + | agent.turn_left() | ||
| + | agent.move(FORWARD, | ||
| + | agent.turn_left() | ||
| + | agent.move(FORWARD, | ||
| + | |||
| + | # Programm für ein Quadrat, welches ausgefüllt ist | ||
| + | |||
| + | agent.move(FORWARD, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(BACK, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(FORWARD, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(BACK, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(FORWARD, | ||
| + | agent.move(LEFT, | ||
| + | agent.move(BACK, | ||
| + | agent.move(LEFT, | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | **Aufgabe 4** \\ | ||
| + | Erkläre, was der Agent baut, wenn das untenstehende Programm ausgeführt wird. Lassen Sie das Programm ausführen und erstelle eine Skizze. | ||
| + | <sxh python> | ||
| + | agent.set_assist(PLACE_ON_MOVE, | ||
| + | agent.set_item(GOLD_BLOCK, | ||
| + | agent.set_item(GRASS, | ||
| + | agent.set_item(DIAMOND_BLOCK, | ||
| + | |||
| + | distances = [4,6,2] | ||
| + | |||
| + | for i in range(1,4): | ||
| + | agent.set_slot(i) | ||
| + | agent.place(LEFT) | ||
| + | agent.move(FORWARD, | ||
| + | </ | ||
| + | < | ||
| + | <panel title=" | ||
| + | <sxh python> | ||
| + | agent.set_assist(PLACE_ON_MOVE, | ||
| + | # Hier wird aktiviert durch True, dass | ||
| + | #der Agent beim Bewegen hinter sich automatisch baut. | ||
| + | agent.set_item(GOLD_BLOCK, | ||
| + | # Hier wird Gold ins Inventar des | ||
| + | #Agenten in Slot 1 gelegt. | ||
| + | agent.set_item(GRASS, | ||
| + | # Hier wird Gras ins Inventar | ||
| + | #in Slot 2 gelegt. | ||
| + | agent.set_item(DIAMOND_BLOCK, | ||
| + | # und hier Diamanten. | ||
| + | |||
| + | distances = [4,6,2] | ||
| + | #Dies ist eine Liste, die aus drei | ||
| + | #Elementen besteht, der 4, der 6 und | ||
| + | #der 2. Dabei ist 4 auf Listenposition 0, | ||
| + | #die 6 auf Listenposition 1 und die 2 | ||
| + | #auf Listenposition 2. | ||
| + | |||
| + | for i in range(1,4): | ||
| + | #dies ist eine Schleife, die für i=1, | ||
| + | #danach i=2, und zuletzt i=3 setzt. | ||
| + | #Die 4 wird als obere Grenze betrachtet, | ||
| + | #bis und ohne 4. | ||
| + | agent.set_slot(i) | ||
| + | # der i-te Slot im Inventar des | ||
| + | #Agenten wird aktiviert (1. oder 2. | ||
| + | #oder 3. Slot, das heisst Gold, Gras oder | ||
| + | # | ||
| + | agent.place(LEFT) | ||
| + | # der Agent beginnt zu bauen und | ||
| + | #platziert links von sich einen Block. | ||
| + | agent.move(FORWARD, | ||
| + | #Der Agent bewegt sich nach vorne | ||
| + | #und dadurch wird hinter dem Agenten | ||
| + | #gebaut. Wie viel er sich vorwärts bewegt | ||
| + | #ist im entsprechenden Listenelement gespeichert. | ||
| + | # | ||
| + | #das 0.Element ist 4. Danach ist i=2 und | ||
| + | # | ||
| + | #sprich der 6 springen, es wird mit Gras 6 | ||
| + | #vorwärts gebaut und zuletzt bewegt sich der | ||
| + | #Agent noch 2 vorwärts, weil distances[2] den | ||
| + | #Wert 2 gespeichert hat. | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </WRAP> | ||
| \\ | \\ | ||
| Zeile 30: | Zeile 198: | ||
| * Welche Programmierfehler sind passiert, und warum sind diese passiert! | * Welche Programmierfehler sind passiert, und warum sind diese passiert! | ||
| - | </ | + | |
| <callout type=" | <callout type=" | ||
| - | {{fa> | + | {{fa> |
| + | |||
| + | In der folgenden Liste findest du schon viele Agenten-Befehle, | ||
| ==== Den Agenten bewegen ==== | ==== Den Agenten bewegen ==== | ||
| Um den Agenten zu bewegen, gibt es einige einfache Befehle, die sehr nützlich sind. | Um den Agenten zu bewegen, gibt es einige einfache Befehle, die sehr nützlich sind. | ||
| Zeile 101: | Zeile 271: | ||
| </ | </ | ||
| - | |||
| - | ===== Programmierkonzepte in Python ===== | ||
| - | |||
| - | <callout type=" | ||
| - | {{fa> | ||
| - | <button collapse=" | ||
| - | Eine **Variable** ist ein Behälter, in dem Daten gespeichert werden können. Stelle dir z.B. einen Koffer vor, in dem du etwas aufbewahren kannst. Die Variable ist der Koffer und der Wert der Variablen ist der Inhalt dieses Koffers. Eine Variable erstellt man mit dem Gleichheitszeichen: | ||
| - | |||
| - | <code Python> | ||
| - | | ||
| - | </ | ||
| - | |||
| - | Es wurde eine Variable mit dem Namen // | ||
| - | < | ||
| - | |||
| - | In manchen Programmiersprachen muss man bei jeder Variable angeben, welcher Typ von Daten gespeichert werden soll (damit im Speicher des Computers die richtige Menge Platz reserviert werden kann), dies ist in Python nicht der Fall. In derselben Variable kann man eine Ganze Zahl, eine Kommazahl, einen Text, eine Liste etc. speichern. Man muss einfach den " | ||
| - | |||
| - | <code Python> | ||
| - | # Verschidene Datentypen können in derselben Variablen gespeichert werden | ||
| - | a = 1 | ||
| - | print(a+1) | ||
| - | a = "Ein Text" | ||
| - | a = True | ||
| - | </ | ||
| - | |||
| - | Im obigen Beispiel werden der Variablen a verschiedene Werte zugewiesen: | ||
| - | |||
| - | * Zuerst erhält sie den Wert 1, eine natürliche Zahl, ein sogenannter //Integer// (kurz int). | ||
| - | * Dann wird in der Variablen zwei Zeilen später ein sog. //string// ein Stück Text gepeichert. Mit dieser Variable könnte man jetzt nicht mehr rechnen, da darin keine Zahl mehr gepeichert wird. | ||
| - | * Und schliesslich in der letzten Zeile wird der Variablen " | ||
| - | |||
| - | <WRAP nicebox green> | ||
| - | |||
| - | **Aufgabe B** | ||
| - | |||
| - | - Analysiere das untenstehende Programm. Was macht der Agent? | ||
| - | - Welche Variablen beinhaltet das Programm? Identifiziere diese Variablen. (Bemerkung: wir werden weiter später sehen, wie man dieses Beispiel viel eleganter programmieren kann.) | ||
| - | - Erweitere das Programm wie folgt: | ||
| - | - Während des Programmablaufs nehmen bereits vorhandene Variablen einen anderen Wert an. | ||
| - | - Eine weitere Variable wird eingeführt und vom Programm auch genutzt. | ||
| - | |||
| - | <code python> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(SANDSTONE, | ||
| - | |||
| - | schrittgroesse = 4 | ||
| - | ausrichtung = WEST | ||
| - | xKoord = 1 | ||
| - | yKoord = 1 | ||
| - | zKoord = 1 | ||
| - | agent.teleport(pos(xKoord, | ||
| - | agent.move(FORWARD, | ||
| - | agent.teleport(pos(xKoord+1, | ||
| - | agent.move(FORWARD, | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | < | ||
| - | <panel title=' | ||
| - | **Aufgabe 3a** | ||
| - | <code python> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(SANDSTONE, | ||
| - | |||
| - | schrittgroesse = 4 | ||
| - | ausrichtung = WEST | ||
| - | xKoord = 1 | ||
| - | yKoord = 1 | ||
| - | zKoord = 1 | ||
| - | agent.teleport(pos(xKoord, | ||
| - | agent.move(FORWARD, | ||
| - | schrittgroesse = 6 # Beispielsweise hier die Schrittgrösse auf 6 setzen. | ||
| - | agent.teleport(pos(xKoord+1, | ||
| - | agent.move(FORWARD, | ||
| - | </ | ||
| - | |||
| - | **Aufgabe 3b** | ||
| - | <code python> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(SANDSTONE, | ||
| - | |||
| - | schrittgroesse = 4 | ||
| - | ausrichtung = WEST | ||
| - | bewegungserichtung = FORWARD | ||
| - | xKoord = 1 | ||
| - | yKoord = 1 | ||
| - | zKoord = 1 | ||
| - | bewegungsrichtung = FORWARD # Beispielsweise hier eine Bewegungsrichtung definieren. | ||
| - | agent.teleport(pos(xKoord, | ||
| - | agent.move(bewegungsrichtung, | ||
| - | schrittgroesse = 6 # Beispielsweise hier die Schrittgrösse auf 6 setzen. | ||
| - | agent.teleport(pos(xKoord+1, | ||
| - | agent.move(bewegungsrichtung, | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | **Namen für Variablen und Funktionen** {{ : | ||
| - | |||
| - | | **Camelcase (Kamelfall)** | ||
| - | | **Snakecase (Schlangenfall)** | ||
| - | |||
| - | ** Was bringen diese Variablen? ** | ||
| - | |||
| - | Stelle dir vor, du hast ein kleines Programm geschrieben, | ||
| - | |||
| - | <code python> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(SANDSTONE, | ||
| - | |||
| - | agent.move(FORWARD, | ||
| - | agent.turn(LEFT) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(LEFT) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(LEFT) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(LEFT) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(LEFT) | ||
| - | agent.move(FORWARD, | ||
| - | </ | ||
| - | |||
| - | Wie du siehst, wird sehr häufig der Befehl '' | ||
| - | |||
| - | <code Python> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(SANDSTONE, | ||
| - | |||
| - | drehRichtung = LEFT # Alternativ: drehRichtung = RIGHT | ||
| - | |||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | </ | ||
| - | |||
| - | Zusammenfassend lässt sich sagen, dass durch Variablen die Programme (oder Arbeitsabläufe des Agenten in diesem Beispiel) flexiebler einsetzbar und besser anpassbar werden. | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <callout type=" | ||
| - | {{fa> | ||
| - | < | ||
| - | In Minecraft gibt es viele vordefinierte Funktionen, die wir bereits verwendet haben, z.B. die Funktion, welche den Agenten dazu bringt, einen Block zu setzen: In Minecraft gibt es viele vordefinierte Funktionen, die wir bereits verwendet haben, z.B. die Funktion, welche den Agenten dazu bringt, einen Block zu setzen: '' | ||
| - | |||
| - | Oft hilft es auch, eigene Funktionen zu programmieren. Der Vorteil liegt auf der Hand: wenn mehrmals dieselben Anweisungen nacheinander ausgeführt werden sollen, kann man diese als Funktion speichern und diese Funktion dann mehrmals über ihren Namen aufrufen. | ||
| - | |||
| - | Dies wird in Python durch den Befehl '' | ||
| - | |||
| - | Wir können beispielsweise unser Spiralbeispiel als Funktion definieren, und dann viele Spiralen bauen, weil wir die definierte Funktion beliebig oft aufrufen können: | ||
| - | |||
| - | <code python baueSpirale.py> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(SANDSTONE, | ||
| - | |||
| - | def baueSpirale(): | ||
| - | drehRichtung = LEFT # Alternativ: drehRichtung = RIGHT | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | agent.move(FORWARD, | ||
| - | |||
| - | baueSpirale() | ||
| - | agent.move(FORWARD, | ||
| - | baueSpirale() | ||
| - | agent.move(FORWARD, | ||
| - | baueSpirale() | ||
| - | agent.move(FORWARD, | ||
| - | baueSpirale() | ||
| - | agent.move(FORWARD, | ||
| - | </ | ||
| - | |||
| - | <WRAP nicebox green> | ||
| - | |||
| - | **Aufgaben C** | ||
| - | |||
| - | - Überlege dir, was der Agent genau baut, wenn man das oben angegebene Programm ausführt. Bei welcher Zeile des Codes beginnt der Agent mit dem Bauen? | ||
| - | - Mache eine kleine Skizze: wie wird das gebaute Objekt wohl aussehen? Häuschenpapier kann viel helfen... | ||
| - | - Überprüfe deine Überlegung und deine Skizze, indem du das Programm in Minecraft einfügst und ausführst (evt. musst du zunächst den Agenten zu dir teleportieren. Im Chat kannst du das machen mit ''/ | ||
| - | - Gibt es eine Möglichkeit, | ||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe ein Programm, welches ein gefülltes Quadrat der Grösse 5 mal 5 Blöcke aus Gold baut (nutze eventuell die Lösung der Aufgabe 5). Versuche, einen möglichst kurzen Code zu produzieren! | ||
| - | - Füge in deinem Programm zur Aufgabe 6 eine Variable hinzu, sodass man das Baumaterial durch diese Variable festlegen kann. | ||
| - | |||
| - | </ | ||
| - | < | ||
| - | <panel title=' | ||
| - | **Aufgabe 4** | ||
| - | <code python> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(SANDSTONE, | ||
| - | #Spirale kurzes Programm mit while | ||
| - | def baueSpiralewhile(): | ||
| - | drehRichtung = LEFT | ||
| - | zaehler=0 # hier ist ein zähler nötig, da es eine while-Schleife ist. | ||
| - | while ( zaehler< | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | zaehler=zaehler+1 | ||
| - | baueSpiralewhile() | ||
| - | |||
| - | </ | ||
| - | **Aufgabe 5 - 7** | ||
| - | <code python> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | #Linie, Funktion ohne Parameter für Linie aus 5 Blöcken | ||
| - | def linie1(): | ||
| - | agent.set_item(SANDSTONE, | ||
| - | agent.set_slot(1) | ||
| - | agent.move(FORWARD, | ||
| - | linie1() | ||
| - | |||
| - | # Funtion linie2 mit Parameter ' | ||
| - | def linie2(material): | ||
| - | agent.set_item(material, | ||
| - | agent.set_slot(1) | ||
| - | agent.move(FORWARD, | ||
| - | linie2(GOLD_BLOCK) | ||
| - | |||
| - | #leeres Quadrat, nicht gefüllt. | ||
| - | def quadrat(material): | ||
| - | zaehler=0 | ||
| - | while (zaehler < 5): | ||
| - | linie2(material) | ||
| - | agent.turn(LEFT_TURN) | ||
| - | agent.move(FORWARD, | ||
| - | zaehler=zaehler+1 | ||
| - | agent.move(LEFT, | ||
| - | quadrat(DIAMOND_BLOCK) | ||
| - | |||
| - | #voll ausgefülltes Quadrat mit frei wählbarem Material. | ||
| - | def quadrat2(material): | ||
| - | zaehler=0 | ||
| - | while (zaehler < 5): | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | linie2(material) | ||
| - | agent.turn(LEFT_TURN) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(LEFT) | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | linie2(material) | ||
| - | agent.turn(LEFT) | ||
| - | agent.turn(LEFT) | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | zaehler=zaehler+1 | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.move(LEFT, | ||
| - | quadrat2(GREEN_WOOL) | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | < | ||
| - | |||
| - | Oben wird die Variable '' | ||
| - | |||
| - | ==== Funktion mit Parametern ==== | ||
| - | Wenn man mit '' | ||
| - | |||
| - | Das Beispiel unserer Spirale können wir mit Parametern etwas eleganter gestalten: wir übergeben der Funktion die Drehrichtung als Parameter. | ||
| - | |||
| - | <code python spiraleneu.py> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(SANDSTONE, | ||
| - | |||
| - | def baueSpiraleNeu(richtung): | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | |||
| - | baueSpiraleNeu(LEFT) | ||
| - | agent.move(FORWARD, | ||
| - | baueSpiraleNeu(RIGHT) | ||
| - | agent.move(FORWARD, | ||
| - | baueSpiraleNeu(LEFT) | ||
| - | agent.move(FORWARD, | ||
| - | baueSpiraleNeu(RIGHT) | ||
| - | agent.move(FORWARD, | ||
| - | </ | ||
| - | |||
| - | Nun können wir dieselbe Funktion verwenden, um rechtsdrehende und linksdrehende Spiralen zu bauen. Wir übergeben beim Aufruf der Funktion die Drehrichtung (Nun können wir dieselbe Funktion verwenden, um rechtsdrehende und linksdrehende Spiralen zu bauen. Wir übergeben beim Aufruf der Funktion die Drehrichtung ('' | ||
| - | |||
| - | <WRAP nicebox green> | ||
| - | |||
| - | **Aufgaben D** | ||
| - | |||
| - | - Spiralen: | ||
| - | - Studiere das neue Programm für die Spirale. Wird der Agent dieses Mal dasselbe bauen wie vorher? Erkläre. | ||
| - | - Verändere das Programm so, dass der Agent zwei Spiralen aneinander baut, eine nach links drehend und eine nach rechts drehend. | ||
| - | - Linien: | ||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe eine Funktion '' | ||
| - | |||
| - | Notiere die wichtisten drei Erkenntnisse der Aufgaben in eigenen Worten und mit einem Beispiel. Dies ist für eine Prüfungsvorbereitung sehr nützlich! | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | <panel title=' | ||
| - | **Aufgabe 4** | ||
| - | <code python> | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(SANDSTONE, | ||
| - | #Spirale kurzes Programm mit while | ||
| - | def baueSpiralewhile(): | ||
| - | drehRichtung = LEFT | ||
| - | zaehler=0 # hier ist ein zähler nötig, da es eine while-Schleife ist. | ||
| - | while ( zaehler< | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(drehRichtung) | ||
| - | zaehler=zaehler+1 | ||
| - | baueSpiralewhile() | ||
| - | |||
| - | </ | ||
| - | **Aufgaben 1b und 2** | ||
| - | <code python> | ||
| - | #Aufgabe 1b | ||
| - | |||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(BLUE_WOOL, | ||
| - | |||
| - | def baueSpiraleNeu(richtung): | ||
| - | i=0 | ||
| - | while (i<6): | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | i=i+1 | ||
| - | | ||
| - | |||
| - | def baueSpiraleumgekehrt(richtung): | ||
| - | i=0 | ||
| - | while (i<7): | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | i=i+1 | ||
| - | | ||
| - | |||
| - | def baueZusammengesetzeSpirale(richtung): | ||
| - | baueSpiraleNeu(LEFT) | ||
| - | baueSpiraleumgekehrt(RIGHT) | ||
| - | baueZusammengesetzeSpirale(LEFT) | ||
| - | </ | ||
| - | **Aufgabe 2a** | ||
| - | <code python> | ||
| - | # Linie bauen | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.set_assist(DESTROY_OBSTACLES, | ||
| - | agent.set_item(BLUE_WOOL, | ||
| - | |||
| - | #Linie der Länge 5 | ||
| - | def linie(): | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.move(FORWARD, | ||
| - | linie() | ||
| - | |||
| - | #Linie der Länge n | ||
| - | def linie2(n): | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | agent.move(FORWARD, | ||
| - | linie2(7) | ||
| - | |||
| - | #Linie mit unterschiedlichen Blöcken der Länge n. | ||
| - | #Erinnerung % bedeutet Modulo | ||
| - | def linie3(n): | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | while (n>0): | ||
| - | if (n%3==0): | ||
| - | agent.set_item(RED_WOOL, | ||
| - | agent.set_slot(1) | ||
| - | agent.move(FORWARD, | ||
| - | elif (n%3==1): | ||
| - | agent.set_item(BLUE_WOOL, | ||
| - | agent.set_slot(2) | ||
| - | agent.move(FORWARD, | ||
| - | else: | ||
| - | agent.set_item(YELLOW_WOOL, | ||
| - | agent.set_slot(3) | ||
| - | agent.move(FORWARD, | ||
| - | n=n-1 | ||
| - | linie3(7) | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | <callout type=" | ||
| - | {{fa> | ||
| - | < | ||
| - | ==== Listen erstellen ==== | ||
| - | Mit eckigen Klammern kann man in Python eine Liste erstellen. Dabei können die einzelnen Elemente der Liste ganz unterschiedliche Typen haben. Es können sogar selbst wieder Listen sein. Auf die einzelnen Elemente der Liste kann man zugreifen, indem man den Namen der Liste mit eckigen Klammern und dem Index angibt (der Index bezeichnet die Position des Elementes in der Liste - er beginnt bei 0. Gibt man als Index negative Zahlen an, so zählt Python vom letzten Element an rückwärts. D.h. das letzte Element der Liste '' | ||
| - | |||
| - | <code Python> | ||
| - | >>> | ||
| - | >>> | ||
| - | >>> | ||
| - | 2 | ||
| - | >>> | ||
| - | Hallo | ||
| - | >>> | ||
| - | 3.141592 | ||
| - | >>> | ||
| - | </ | ||
| - | |||
| - | Listen verwendet man oft, wenn man viele Daten speichern muss. Statt dass man z.B. zehn Variablen Listen verwendet man oft, wenn man viele Daten speichern muss. Statt dass man z.B. zehn Variablen '' | ||
| - | |||
| - | <WRAP nicebox green> | ||
| - | |||
| - | **Aufgabe E ** | ||
| - | |||
| - | Gegeben ist eine Liste von Baumaterialien: | ||
| - | |||
| - | Schreibe ein Programm, welches den Agenten dazu bringt, eine Linie mit fünf verschieden Blöcken aus den Materialien der Liste zu bauen. Die Reihenfolge der Liste soll dabei eingehalten werden. | ||
| - | |||
| - | Tipps: | ||
| - | |||
| - | * Dein Code beginnt mit '' | ||
| - | * Die Liste muss in deinem Code verwendet werden | ||
| - | * Damit der Agent bauen kann, muss das Inventar zuerst mit den richtigen Materialien gefüllt werden.{{ : | ||
| - | * Verwende unter anderem die Befehle '' | ||
| - | |||
| - | </ | ||
| - | < | ||
| - | <panel title=' | ||
| - | **Aufgabe E** | ||
| - | <code Python> | ||
| - | def linie4(): | ||
| - | materialien=[RED_SANDSTONE, | ||
| - | agent.set_assist(PLACE_ON_MOVE, | ||
| - | i=0 | ||
| - | while (i<5): | ||
| - | agent.set_item(materialien[i], | ||
| - | agent.set_slot(i+1) | ||
| - | agent.move(FORWARD, | ||
| - | i=i+1 | ||
| - | linie4() | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | ==== Der range-Befehl ==== | ||
| - | |||
| - | Sehr häufig möchte man eine regelmässige Liste von Zahlen erstellen: z.B. alle Zahlen von 1 bis 10 oder die Zahlen von 1 bis 100 in 2er-Schritten etc.Sehr häufig möchte man eine regelmässige Liste von Zahlen erstellen: z.B. alle Zahlen von 1 bis 10 oder die Zahlen von 1 bis 100 in 2er-Schritten etc. Dazu ist der range-Befehl sehr praktisch. Dieser kann in drei Varianten genutzt werden:Dazu ist der range-Befehl sehr praktisch. Dieser kann in drei Varianten genutzt werden: | ||
| - | |||
| - | ^ range-Befehl | ||
| - | | '' | ||
| - | | '' | ||
| - | | | | | ||
| - | | | | | ||
| - | | '' | ||
| - | | '' | ||
| - | | | | | ||
| - | | | | | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | <WRAP nicebox green> | ||
| - | |||
| - | **Aufgabe F** | ||
| - | |||
| - | Erstelle mit dem '' | ||
| - | |||
| - | - '' | ||
| - | - '' | ||
| - | - '' | ||
| - | |||
| - | Tipp: Mit dem Befehl '' | ||
| - | |||
| - | </ | ||
| - | |||
| - | ==== Listen abklappern (durchgehen) ==== | ||
| - | |||
| - | Ganz oft will man für alle Elemente in einer Liste dasselbe tun, d.h. man will die Liste " | ||
| - | |||
| - | Dafür gibt es in Python den Befehl '' | ||
| - | |||
| - | <code Python> | ||
| - | def baueSpirale(richtung): | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | agent.move(FORWARD, | ||
| - | </ | ||
| - | |||
| - | Wir sagen Python einfach: Gehe alle Zahlen von 1 bis 6 durch (sage der Variablen z.B. '' | ||
| - | {{ : | ||
| - | |||
| - | <code Python> | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | </ | ||
| - | |||
| - | Damit sieht unser Programm viel kürzer aus: | ||
| - | |||
| - | <code Python> | ||
| - | def baueSpirale(richtung): | ||
| - | for zahl in [1, | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | </ | ||
| - | |||
| - | \\ | ||
| - | Die Liste [1, | ||
| - | {{ : | ||
| - | <code Python> | ||
| - | def baueSpirale(richtung): | ||
| - | for zahl in range(1,7): | ||
| - | agent.move(FORWARD, | ||
| - | agent.turn(richtung) | ||
| - | </ | ||
| - | |||
| - | |||
| - | < | ||
| - | |||
| - | <code Python> | ||
| - | for i in range(10): # i geht die Zahlen von 0 bis 9 durch | ||
| - | | ||
| - | | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | |||
| - | <code Python> | ||
| - | for i in range(k): # i geht die Zahlen von 0 bis k durch | ||
| - | | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | |||
| - | <WRAP nicebox green> | ||
| - | |||
| - | **Aufgabe G** | ||
| - | |||
| - | Schreibe das Programm aus Aufgabe E kürzer. Gehe wie folgt vor: | ||
| - | |||
| - | * Fülle das Inventar des Agenten mit Hilfe des '' | ||
| - | * Baue die Linie mit den fünf Materialien des Inventars mit Hilfe eines '' | ||
| - | |||
| - | </ | ||
| - | |||
| - | <WRAP nicebox green> | ||
| - | |||
| - | **Aufgaben H** | ||
| - | |||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe eine Funktion '' | ||
| - | |||
| - | </ | ||
| - | |||
| - | |||
| - | |||
| - | /* | ||
| - | ^ Listenbefehl | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | */ | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <callout type=" | ||
| - | |||
| - | {{fa> | ||
| - | < | ||
| - | ==== Verzweigungen mit if ==== | ||
| - | {{ : | ||
| - | |||
| - | <code Python> | ||
| - | # Wenn ein Block vor dem und links vom Agenten liegt, | ||
| - | # dreht sich der Agent nach links. Sonst, was bedeutet, | ||
| - | # der Weg ist frei, macht der Agent einen Schritt vorwärts. | ||
| - | |||
| - | if (agent.detect(AgentDetection.BLOCK, | ||
| - | agent.turn(LEFT) | ||
| - | else: | ||
| - | agent.move(FORWARD, | ||
| - | </ | ||
| - | |||
| - | ==== Schleifen mit " | ||
| - | Wir haben bereits die '' | ||
| - | |||
| - | <code Python> | ||
| - | # Solange | ||
| - | # und somit der Weg ist frei, macht der Agent einen Schritt vorwärts. | ||
| - | |||
| - | while (agent.detect(AgentDetection.BLOCK, | ||
| - | agent.place(BACK) | ||
| - | agent.move(FORWARD, | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | |||
| - | </ | ||
| - | |||
| - | While-Schleifen werden verwendet, wenn man nicht weiss, wie oft der Schleifeninhalt wiederholt werden soll und man aus diesem Grund keine for-Schleife verwenden kann. Die Anzahl Wiederholungen kann beispielsweise von einer Eingabe abhängen. While-Schleifen sind können auch als Endlos-Schleife formuliert werden. Schleifenkörper können weitere Schleifen beinhalten, dies sind dann sogenannte Verschachtelte Schleifen. Eine For-Schleife kann eine While-Schleife beinhalten oder auch umgekehrt. | ||
| - | |||
| - | <WRAP nicebox green> | ||
| - | **Aufgabe I** | ||
| - | - Schreibe mit '' | ||
| - | - Schreibe mit '' | ||
| - | - Schreibe mit '' | ||
| - | - Lade das Labyrinth auf deinen Computer und versuche den Algorithmus "Gehe immer so, dass die Mauer rechts von dir ist" zu programmieren. {{ : | ||
| - | </ | ||
| - | /* | ||
| - | <WRAP nicebox green> | ||
| - | **Zusatzaufgabe** | ||
| - | - Um die Aufgaben oben schwieriger zu machen, kann zwischen zwei Materialien abgewechselt werden und als Challange in der zweiten oberen Linie die umgekehrte Materialfolge, | ||
| - | - Schreibe eine Funktion '' | ||
| - | - Schreibe eine Funktion '' | ||
| - | </ | ||
| - | |||
| - | <WRAP nicebox green> | ||
| - | Wie kann man ein Haus bauen? Ist das überhaupt über den Code-Builder so möglich? Eine Idee wäre z.B., dass man einen gefüllten Block macht und ihn dann mit einem kleineren gefüllten Block aus ' | ||
| - | </ | ||
| - | */ | ||
| [[gf2: | [[gf2: | ||