Seite anzeigenÄltere VersionenLinks hierherNach oben Diese Seite ist nicht editierbar. Sie können den Quelltext sehen, jedoch nicht verändern. Kontaktieren Sie den Administrator, wenn Sie glauben, dass hier ein Fehler vorliegt. ===== Der Agent ===== {{ :gf2:fetch.png?200|}} Um das Programmieren mit Python in Minecraft Education einfacher zu erlernen, steht jedem Lernenden neben der Spielfigur, welche die Position des Spielers samt Inventar und Handlung im Spiel darstellt, auch ein sogenannter Agent zur Verfügung. Der Agent selbst kann durch Programmieren gesteuert werden. Dafür gibt es verschiedene Befehle. Jeder Spieler hat nur einen Agenten und das Gute ist, Agenten können nicht verschwinden («sterben»);-)! Wir können den Agenten mit Hilfe von Befehlen/Programmen steuern und so dafür sorgen, dass er Arbeiten für uns erledigt. Er kann beispielsweise Dinge für uns bauen, oder Gegenstände einsammeln etc. Sobald man mit der Taste ''C'' den Code-Editor zum Programmieren öffnet, erscheint in der Minecraft-Welt der Agent. Es handelt sich um einen kleinen Roboter bzw. um eine kleine Spielfigur, die man mit den Agent-Befehlen steuern kann. Der Agent ist genau ein Block hoch. Einige der Befehle für den Agenten sind samt Kommentar und einem Beispiel unten aufgelistet. \\ Damit der Agent bauen kann, muss sein **Inventar** befüllt werden. Dieses Inventar des Agenten ist separat vom Spieler und kann per Rechtsklick auf den Agenten eingesehen und verändert werden. Man kann es auch durch Programmierung und den Befehl ''agent.set_item'' verändern (siehe weiter unten). ====Aufgaben==== **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. \\ <WRAP nicebox green> ** Aufgabe 1**\\ Betrachte das untenstehende Programm und überlege dir, was es macht. Kopiere es in Minecraft und teste es ('c' drücken und dann in "Python" einfügen). <sxh python> # Grundeinstellungen agent.set_assist(PLACE_ON_MOVE, True) agent.set_item(GOLD_BLOCK, 64, 1) agent.set_slot(1) # Programm agent.move(FORWARD,5) agent.turn_left() agent.move(FORWARD,5) agent.turn_left() agent.move(FORWARD,5) agent.turn_left() agent.move(FORWARD,5) </sxh> **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. \\ <accordion> <panel title="Lösungen"> <sxh python> # Grundeinstellungen agent.set_assist(PLACE_ON_MOVE, True) agent.set_item(RED_SANDSTONE, 64, 1) agent.set_slot(1) agent.set_assist(DESTROY_OBSTACLES,True) # Programm für ein Quadrat, welches nicht ausgefüllt ist agent.move(FORWARD,5) agent.turn_left() agent.move(FORWARD,5) agent.turn_left() agent.move(FORWARD,5) agent.turn_left() agent.move(FORWARD,5) </sxh> <sxh> # Grundeinstellungen agent.set_assist(PLACE_ON_MOVE, True) agent.set_item(RED_SANDSTONE, 64, 1) agent.set_slot(1) agent.set_assist(DESTROY_OBSTACLES,True) # Programm für ein Quadrat, welches ausgefüllt ist agent.move(FORWARD,5) agent.move(LEFT, 1) agent.move(BACK,5) agent.move(LEFT,1) agent.move(FORWARD,5) agent.move(LEFT, 1) agent.move(BACK,5) agent.move(LEFT, 1) agent.move(FORWARD,5) agent.move(LEFT, 1) agent.move(BACK,5) agent.move(LEFT, 1) </sxh> </panel> </accordion> **Aufgabe 3** \\ Füge deinem Programm eine Variable mit dem Namen ''Seitenlaenge'' hinzu, sodass du über diese Variable steuern kannst, wie gross dein Quadrat wird. <accordion> <panel title="Lösungen"> <sxh> # Grundeinstellungen agent.set_assist(PLACE_ON_MOVE, True) agent.set_item(RED_SANDSTONE, 64, 1) agent.set_slot(1) agent.set_assist(DESTROY_OBSTACLES,True) #Variablen seitenlaenge=5 # Programm für ein Quadrat, welches nicht ausgefüllt ist agent.move(FORWARD,seitenlaenge) agent.turn_left() agent.move(FORWARD,seitenlaenge) agent.turn_left() agent.move(FORWARD,seitenlaenge) agent.turn_left() agent.move(FORWARD,seitenlaenge) # Programm für ein Quadrat, welches ausgefüllt ist agent.move(FORWARD,seitenlaenge) agent.move(LEFT, 1) agent.move(BACK,seitenlaenge) agent.move(LEFT,1) agent.move(FORWARD,seitenlaenge) agent.move(LEFT, 1) agent.move(BACK,seitenlaenge) agent.move(LEFT, 1) agent.move(FORWARD,seitenlaenge) agent.move(LEFT, 1) agent.move(BACK,seitenlaenge) agent.move(LEFT, 1) </sxh> </panel> </accordion> **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, True) agent.set_item(GOLD_BLOCK, 64, 1) agent.set_item(GRASS, 64, 2) agent.set_item(DIAMOND_BLOCK, 64, 3) distances = [4,6,2] for i in range(1,4): agent.set_slot(i) agent.place(LEFT) agent.move(FORWARD, distances[i-1]) </sxh> <accordion> <panel title="Lösungen"> <sxh python> agent.set_assist(PLACE_ON_MOVE, True) # Hier wird aktiviert durch True, dass #der Agent beim Bewegen hinter sich automatisch baut. agent.set_item(GOLD_BLOCK, 64, 1) # Hier wird Gold ins Inventar des #Agenten in Slot 1 gelegt. agent.set_item(GRASS, 64, 2) # Hier wird Gras ins Inventar #in Slot 2 gelegt. agent.set_item(DIAMOND_BLOCK, 64, 3) # 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 #Diamanten) agent.place(LEFT) # der Agent beginnt zu bauen und #platziert links von sich einen Block. agent.move(FORWARD, distances[i-1]) #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. #distances[0] heisst er bewegt sich 4 vorwärts, #das 0.Element ist 4. Danach ist i=2 und #distances[1] wird zum ersten Listenelement, #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. </sxh> </panel> </accordion> </WRAP> \\ ---- **Welche Erkenntnisse sollen gewonnen werden?**\\ * Wie kann ich den Agenten durch ein Pyhtonprogramm bewegen? * Wie kann ich den Agenten etwas bauen lassen und was ist dabei zu beachten? * Was muss beim Programmieren des Agenten in bezug auf folgende Aspekte beachtet werden: * Was muss beim Verwenden von Kooridnaten beachtet werden? * Was muss beim Befüllen des Inventars des Agenten beachtet werden? * Welche Voreinstellungen in den ersten Codezeilen sind nützlich? * Welche Programmierfehler sind passiert, und warum sind diese passiert! <callout type="primary" title="Einige Agentenbefehle im Überblick"> {{fa>angle-double-down}}<button collapse="coll1" type="link">Bereich ausklappen/einklappen </button> <collapse id="coll1"> In der folgenden Liste findest du schon viele Agenten-Befehle, jedoch kann auch über den Code-Builder über das Menu links auch direkt per drag and drop Codezeilen eingefügt und dann angepasst werden. Diese Befehle werden im Codebuilder (Editor) eingebeben und werden vom Agenten nach dem der In der folgenden Liste findest du schon viele Agenten-Befehle, jedoch kann auch über den Code-Builder über das Menu links auch direkt per drag and drop Codezeilen eingefügt und dann angepasst werden. Diese Befehle werden im Codebuilder (Editor) eingebeben und werden vom Agenten nach dem der "PlayPlay"-Button geklickt wurde, ausgeführt. Wichtig ist, dass der Codebuilder in einer neu erschaffenen Welt gestartet werden muss, um überhaupt einen Agenten entstehen zu lassen!-Button geklickt wurde, ausgeführt. Wichtig ist, dass der Codebuilder in einer neu erschaffenen Welt gestartet werden muss, um überhaupt einen Agenten entstehen zu lassen! ==== Den Agenten bewegen ==== Um den Agenten zu bewegen, gibt es einige einfache Befehle, die sehr nützlich sind. ^ Befehl ^ Beispiel ^ Kurzerklärung ^ | ''agent.move(Richtung, Anz.Felder)'' | ''agent.move(BACK,3)'' | Agent bewegt sich um die Anzahl Felder in die gewünschte Richtung (FORWARD, BACK, LEFT, RIGHT, UP, DOWN) | | ''agent.turn(Richtung)'' | ''agent.turn(LEFT)'' | Agent dreht sich um 90 Grad in die gewünschte Richtung (LEFT, RIGHT) | ^ Den Agenten teleportieren ^ ^ ^ | ''agent.teleport(Position, Himmelsrichtung) '' | ''agent.teleport(pos(10,5,2),WEST)'' | ''pos'' teleportiert bezüglich der Position des Agenten | | ''agent.teleport(world(3,10,5), NORD)'' | ''world'' | teleportiert absolut bezüglich der Weltkoordinaten | | ''agent.teleport_to_player() '' | Der Agent wird an die Position des Spielers teleportiert, d.h. der Agent wird, egal wo er ist, zum Spieler versetzt, ohne dabei den Raum zu durchqueren. || Bemerkung: Wenn von einer Richtung die Rede ist, kann meist zwischen FORWARD, BACK, LEFT, RIGHT, UP, DOWN gewählt werden. Im Zusammenhang mit Himmelsrichtung dann EAST, WEST, NORTH, SOUTH.Bemerkung: Wenn von einer Richtung die Rede ist, kann meist zwischen FORWARD, BACK, LEFT, RIGHT, UP, DOWN gewählt werden. Im Zusammenhang mit Himmelsrichtung dann EAST, WEST, NORTH, SOUTH. ==== Das Inventar des Agenten ==== Wie bereits genannt, kann das Inventar des Agenten manuell über den Rechtsklick und das Inventar des Spielers aufgefüllt werden. Es kann aber auch über die Funktion ''agent.set_item'' ein auffüllen vom Inventar vorgenommen werden. Erinnerung: Der Agent kann nur bauen, wenn das Inventar nicht leer ist! ein auffüllen vom Inventar vorgenommen werden. Erinnerung: Der Agent kann nur bauen, wenn das Inventar nicht leer ist! ^ Befehl ^ Beispiel ^ Kurzerklärung ^ | ''agent.set_item(Material, Anzahl, Slot) '' | ''agent.set_item(GRASS, 6, 1) '' | 6 Grasblöcke in den ersten Slot des Inventars legen. | | ''agent.drop_all(Richtung)'' | ''agent.drop_all(FORWARD)'' | Das ganze Agenten-Inventar kann auch wieder geleert werden, um so eventuell neu befüllt zu werden. Dies geschieht über die Funktion agent.drop_all(Richtung). Die Blöcke werden dann in der angegebenen Richtung neben dem Agenten sichtbar schweben und verschwinden nach einiger Zeit, falls diese nicht eingesammelt werden. Im Beispiel wird hier das Inventar so geleert, dass die gesamten Materialien vor dem Agenten liegen. | | ''agent.transfer(Von Slot, zu Slot, Anzahl) '' | ''agent.transfer(5, 1, 2) '' | Das Agenten-Inventar kann auch umgeordnet werden, indem Materialien von einem Slot in einen anderen gelegt werden. | /* <code python> agent.get_item_count(Slotnummer) </code> <code python> agent.get_item_count(1) </code> Durch diesen Befehl kann herausgefunden werden, wie viele Materialblöcke noch im angegeben Slot vroahnden sind. */ ==== Der Agent baut und arbeitet für uns ==== Neben dem Bewegen kann der Agent auch für uns bauen. Auch hier gibt es einige praktische Grundbefehle.Neben dem Bewegen kann der Agent auch für uns bauen. Auch hier gibt es einige praktische Grundbefehle. ^ Befehl ^ Beispiel ^ Kurzerklärung ^ | ''agent.place(Richtung)'' | ''agent.place(FORWARD)'' | Der Agent plaziert vor sich einen Block. Er nimmt das Material immer aus dem aktiven Slot. Falls dies nicht der gewünschte Slot ist, kann durch ''agent.set_slot(Slotnummer)'' dieser gewechselt werden. | | ''agent.set_slot(Slotnummer)'' | ''agent.set_slot(2)'' | Der aktive Slot wird gewählt, aus dem dann das Material genommen wird. | | ''agent.set_assist(assist, on-off)'' | ''agent.set_assist(PLACE_ON_MOVE,True)'' | Setzt man ''PLACE_ON_MOVE'' auf wahr (True), dann baut der Agent während er sich bewegt. | | ''agent.set_assist(assist, on-off)'' | ''agent.set_assist(DESTROY_OBSTACLES,True)'' | Setzt man ''DESTROY_OBSTACLES'' auf wahr (True), dann zerstört er die Hindernissse, während er baut. | Der Parameter assist kann folgende Werte annehmen:Der Parameter assist kann folgende Werte annehmen: * ''PLACE_ON_MOVE'' was bedeutet, dass der Agent mit jeder Bewegung baut. * ''PLACE_FROM_ANY_SLOT'' heisst, wenn der aktive Inventarslot kein Material beinhaltet, wird das gesamte Inventar durchsucht und so zu einem gefüllten Slot wechseln und weiterfahren. * ''DESTROY_OBSTACLES'' wird gebraucht, um zu vermeiden, dass der Agent durch Hindernisse blockiert wird. Der Agent kann durch Blöcke, Tiere oder anderes blockiert sein und nicht vorwärts kommen. Durch diese Funktion und diesen Parameter kann ddas Hindernis aus dem Weg geräumt, sprich zerstört werden. Der Parameter on-off kann folgede Werte annehmen:Der Parameter on-off kann folgede Werte annehmen: * ''True'', dadurch ist die Funktino agent.set_assist aktiviert. * ''False'', durch diesen Parameterwert wird die Funktion deaktiviert. Der Agent wird mit diesem Befehl bei jeder Bewegung bauen. Im gegebenen Beispiel oben baut der Agent bei jeder Bewegung einen Block aus den aktiven Slot.Der Agent wird mit diesem Befehl bei jeder Bewegung bauen. Im gegebenen Beispiel oben baut der Agent bei jeder Bewegung einen Block aus den aktiven Slot. Ein Beispiel wäre das Folgende. Hier wird der Agent zuerst einen GRASS-Block in sein Inventar in Slot 1 nehmen, sich danach um 4 Felder vorwärts bewegen, anschliessend einen Block vor sich hin setzen, nach links drehen und von sich aus gesehen 5 Felder rückwärts bewegen.Ein Beispiel wäre das Folgende. Hier wird der Agent zuerst einen GRASS-Block in sein Inventar in Slot 1 nehmen, sich danach um 4 Felder vorwärts bewegen, anschliessend einen Block vor sich hin setzen, nach links drehen und von sich aus gesehen 5 Felder rückwärts bewegen. <code python> agent.set_item(GRASS, 5, 1) agent.move(FORWARD,4) agent.place(FORWARD) agent.turn_left() agent.move(BACK,5) </code> Durch ein Rechtsklick auf den Agenten ist klar, dass es noch 4 GRASS-Blöcke in Slot 1 hat. Einer wurde ja begraucht.Durch ein Rechtsklick auf den Agenten ist klar, dass es noch 4 GRASS-Blöcke in Slot 1 hat. Einer wurde ja begraucht. </collapse> </callout> [[gf2:start|Zurück zur Übersicht]] gf2/agent.txt Zuletzt geändert: 2024/12/10 07:37von marroc