Aktivität: Agent Tree Chopper

Bäume für Holz zu hacken ist harte Arbeit, aber notwendig in Minecraft, wenn du Objekte und Werkzeuge im Survival-Modus herstellen willst. Aber mit Hilfe unseres Agenten kannst du diese Arbeit durch Code automatisieren! Bringen wir dem Agenten bei, wie er einen Baum beliebiger Höhe fällen und wieder auf den Boden zurückkehren kann.

Wenn du ein neues MakeCode-Projekt beginnst, ist es oft eine gute Idee, die Schritte zu planen, die du unternehmen willst, bevor du mit der Programmierung beginnst.

Hier ist, was du tun willst:

  1. Finde heraus, wie hoch der Baum ist:
    • Solange sich ein Block vor dem Agenten befindet, gehe weiter nach oben.
    • Beobachte, wie hoch der Baum ist.
  2. Wiederhole die folgenden Schritte so oft, wie der Baum hoch ist:
    • Zerstöre den Block vor dir.
    • Gehen Sie nach unten.
  3. Sammeln Sie alles ein.

Bei der letzten Aktivität wurden ||logic:if then else||Anweisungen verwendet, um Bedingungen zu prüfen und Aktionen so auszuführen, wie Sie es wollten. In dieser Aufgabe werden Sie Bedingungen in einer ||loops:while|| Schleife verwenden. Der Agent fährt fort, sich nach oben zu bewegen, solange es einen Baumblock zu erklimmen gibt.

Die Aktivität ausführen

Ein Projekt erstellen

  1. Erstelle ein neues MakeCode-Projekt mit dem Namen Chopper.

  2. Umbenenne das bestehende ||player:on chat command|| in "tp".

  3. Ziehen Sie von ||agent:AGENT|| einen ||agent:agent teleport to player||-Block in ||player:on chat command "tp"||.

  4. Erstellen wir nun auch einen Richtungsbefehl, damit wir unseren Agenten umdrehen können. Klicken Sie mit der rechten Maustaste auf ||player:on chat command "tp"|| und wählen Sie Duplizieren, um eine Kopie zu erstellen.

  5. Benennen Sie das Duplikat "lt".

  6. Löschen Sie den inneren Block für dieses neue Duplikat und ersetzen Sie ||agent:agent teleport to player|| durch ||agent:agent turn 'left'||.

player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})

Erstellen Sie die Höhenvariable

  1. Ziehen Sie aus ||player:PLAYER|| einen ||player:on chat command||-Block in den Codierungsarbeitsbereich und benennen Sie ihn in "chop".

  2. Sie werden eine Variable verwenden, um die Höhe des Baums zu verfolgen. Klicken Sie in der Schublade ||variables:VARIABLES|| Toolbox auf die Schaltfläche „Variable erstellen“.

  3. Benennen Sie die neue Variable height.

Erstellen Sie eine neue Variable mit dem Namen

Initialisieren Sie die Höhe auf Null

  1. Ziehen Sie aus ||variables:VARIABLES|| die Variable ||variables:set|| heraus und fangen Sie sie in ||player:on chat command "chop"|| ein.

  2. Wählen Sie im Block ||variables:set|| über das Dropdown-Menü height als Variable aus und setzen Sie height auf 0.

let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0})

An der Basis eines Baumes beginnen

Angenommen, der Agent befindet sich mit Blick auf die Basis des Baumes, wenn der Befehl zum Hacken gegeben wird. Du verwendest die Befehle "tp" und "lt", um deinen Agenten in Position zu bringen und dann schließlich "chop".

Verwenden Sie eine ||loops:while||-Schleife, die wie eine ||loops:repeat||-Schleife mit einer bedingten Anweisung kombiniert ist. Hier wird der Code so lange fortgesetzt, wie ein Block vor dem Agenten steht. Wenn sich ein Block vor dem Agenten befindet, bewegt er sich im Baum weiter nach oben.

  1. Ziehen Sie aus ||loops:LOOPS|| eine ||loops:while||-Schleife heraus und legen Sie sie unter ||variables:set 'height'|| ab. Dies wäre innerhalb von ||player:on chat command "chop"||.

  2. Von ||agent:AGENT|| ziehst du ||agent:agent detect 'block' 'forward'|| heraus und legst es in der ||loops:while||-Schleife ab, die ||logic:true|| ersetzt.

let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0 while (agent.detect(AgentDetection.Block, FORWARD)) { }})

Bewege dich den Baum hinauf und hacke

Endlich kommst du dazu, etwas zu hacken – oder zumindest tut es der Agent!

  1. Von ||variables:VARIABLES|| platziere einen ||variables:change||-Block innerhalb der ||loops:while||-Schleife.

  2. Der neue Block sollte ||variables:change 'height' by 1|| lauten. Dadurch wird die Höhenvariable jedes Mal um 1 erhöht, wenn sich der Agent nach oben bewegt. Auf diese Weise können wir die Höhe des Baums verfolgen.

  3. Wenn sich Blätter oder Äste über dem Kopf des Agenten befinden, müssen Sie sie zerstören, um den Agenten nach oben zu bewegen. Von ||agent:AGENT|| aus platzieren Sie ||agent:agent destroy|| unter ||variables:change 'height' by 1||. Sie müssen diesen Block anpassen, indem Sie up als Richtung aus dem Dropdown-Menü auswählen.

  4. Bringen Sie schließlich Ihren Agenten dazu, nach oben zu gehen. Nehmen Sie einen ||agent:agent move||-Block und wählen Sie dann im Dropdown-Menü up als Richtung aus, wie Sie es im vorherigen Schritt getan haben.

let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0 while (agent.detect(AgentDetection.Block, FORWARD)) { height += 1 agent.destroy(UP) agent.move(UP, 1) }})

Kommen Sie wieder nach unten

Nachdem der Agent die Spitze des Baumes erreicht hat (es befindet sich kein Block mehr vor ihm), wird die Höhe des Baumes in der Variablen height gespeichert. Dann wird eine weitere Schleife benötigt, die den Block vor dem Agenten (den Baumstamm) zerstört, während der Agent sich nach unten bewegt. Diese Schleife sollte so oft laufen wie die Höhe des Baumes.

  1. Ziehen Sie aus ||loops:LOOPS|| eine ||loops:repeat||-Schleife heraus und legen Sie sie nach der ||loops:while||-Schleife in Ihrem ||player:on chat command "chop"|| ab.

  2. Ziehen Sie aus ||variables:VARIABLES|| ein height heraus und ersetzen Sie das 4 in der ||loops:repeat||-Schleife.

let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0 while (agent.detect(AgentDetection.Block, FORWARD)) { height += 1 agent.destroy(UP) agent.move(UP, 1) } for (let i = 0; i < height; i++) { }})

Hacken Sie beim Fallenlassen

Zu diesem Zeitpunkt sollte der Agent auf der Spitze eines Baumes stehen. Du musst ihn dazu bringen, wieder nach unten zu klettern, den Baum zu fällen und das Holz einzusammeln.

  1. Baue von ||agent:AGENT|| aus einen ||agent:move|| und einen ||agent:destroy|| in die ||loops:repeat||-Schleife ein.

Nun musst du diese Blöcke an die Situation anpassen. Der Agent muss sich nach unten bewegen und wird jedes Stück des Baumes vor ihm abhacken.

  1. Wählen Sie im ||agent:move||-Block down als Richtung. Der Agent wird sich nach unten bewegen. Dann sollte der Agent den Baumblock vor ihm zerstören. Die Standardeinstellungen sind für ||agent:destroy|| in Ordnung.

Schließlich soll der Agent das gesamte Holz einsammeln, das er gehackt hat.

  1. Aus ||agent:AGENT|| platziere ||agent:agent collect all|| nach der ||loops:repeat||-Schleife. Dies ist nun der letzte Block in unserem ||player:on chat command|| für "chop".

Vollständiges Programm

let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0 while (agent.detect(AgentDetection.Block, FORWARD)) { height += 1 agent.destroy(UP) agent.move(UP, 1) } for (let i = 0; i < height; i++) { agent.move(DOWN, 1) agent.destroy(FORWARD) } agent.collectAll()})

Gemeinsames Programm: https://makecode.com/_1hFLi6X1qPcJ

Agent - Tree Chop Start Prep

Agent - Tree Chop Start Correct Facing

Agent - Tree Chop Finish

Herausforderungen

Es wäre schön, wenn der Agent als Teil von ||player:on chat command "chop"|| teleportieren könnte. Es ist schwer vorherzusagen, in welche Richtung der Agent gehen wird, nachdem man ihn teleportiert hat. Die Richtungsbefehle („tp“ und „lt“) funktionieren, aber ein einziger Befehl wäre effizienter.

Kann man das automatisieren? Nachdem Sie diese beiden Aufgaben gelöst haben, sollten Sie in der Lage sein, dies zu bewerkstelligen. Denken Sie zunächst über das Problem nach.

Sie wollen:

  1. Den Agenten teleportieren.
  2. Den Agenten drehen, bis er die Basis des Baumes findet.
  3. Mit dem Klettern beginnen und den Code ausführen, den wir bereits erstellt haben.

Der einzige potenzielle Nachteil dieses Plans ist, dass Sie immer noch direkt an der Basis des Baumes stehen müssen, damit der Agent an der richtigen Stelle startet. Niedrige Äste müssten eventuell entfernt werden. Vielleicht findest du als Bonus heraus, wie du auch dieses Problem lösen kannst, aber schließe zuerst die Herausforderungen 1 und 2 ab.

Herausforderung 1 – Teleportiere den Agenten und bereite einige Dinge für Herausforderung 2 vor

  1. Kannst du den Agenten als Teil von ||player:on chat command "chop"|| teleportieren lassen?

Danach brauchst du einige Dinge, um Herausforderung 2 zu erfüllen. Bitte erstelle folgendes:

  1. Erstelle eine Variable namens TurnToTree und setze diese auf true.

  2. Erstelle eine while-Schleife, die den Agenten nach links oder rechts drehen lässt.

Teste deinen Code!

Was ist passiert? Oh nein, du steckst in einer weiteren Endlosschleife fest. TurnToTree ist true, also läuft deine neue while-Schleife immer weiter und weiter. Deshalb dreht sich Ihr Agent immer weiter und weiter.

Code stoppen

Lesen Sie unten, wie Sie das stoppen können…

Wenn Sie in einer Endlosschleife gefangen sind, müssen Sie Ihren Code über das Codeverbindungsfenster stoppen.

  1. Klicken Sie auf die Stopp-Schaltfläche in der unteren linken Ecke des Code-Verbindungsfensters.

Code anhalten

  1. Starten Sie die Codierungsumgebung neu. Klicken Sie auf die Schaltfläche „Play“. Wenn die Schaltfläche „Abspielen“ nicht aktiviert ist, wird dein Code in Minecraft nicht ausgeführt.

Abspielen

  1. Das erneute Speichern deines Codes kann deinen Code ebenfalls neu starten, also mach das sicherheitshalber. Speichern Sie ein weiteres Mal und bejahen Sie die Warnmeldung.

Speichern

Speichern Bestätigen

Das ist in Ordnung, denn jetzt bist du für Herausforderung 2 vorbereitet, aber du musst einen Weg finden, den Agenten aufzuhalten, wenn er den Baum sieht.

Herausforderung 2 – Lass den Agenten automatisch auf den Baum zugehen

Du bist jetzt bereit, die zweite Aufgabe zu lösen.

  1. Drehe den Agenten so lange, bis er die Basis des Baumes findet.

Dazu musst du TurnToTree innerhalb der while-Schleife auf false setzen, aber du brauchst dafür eine Bedingung. Du willst, dass der Agent anhält, wenn er den Baum findet.

Es gibt keinen Find-Block für den Agenten, aber es gibt einen Detect-Block. Vielleicht könnte dieser nützlich sein?

Bestätigung speichern

Dieser Block gibt true oder false zurück, wenn der Agent einen Block in der von Ihnen angegebenen Richtung entdeckt oder findet.

Wie könnten Sie diese Bedingung testen und dann den Agenten vom Drehen abhalten? Du musst TurnToTree auf false setzen, aber wo und wie?

Experimente

Hier gibt es keine Regeln… Kopiere den Code für jedes Experiment und ändere die Dinge, um zu sehen, was für Ergebnisse du erzielen kannst. Es werden Vorschläge gemacht, aber mach, was du willst!

Experiment 1 – Erhöhe die Größe des Lochs

Der Agent arbeitet hart für dich! Du kannst ihn auch dazu bringen, für dich zu graben. Gib den Chat-Befehl dig 4 ein, um diesen Code auszuprobieren.

Kannst du den Agenten dazu bringen, gleichzeitig zu graben und etwas zu platzieren? Kannst du die Größe des Lochs vergrößern? Im Moment ist es 2 x 2. Du könntest den Agenten dazu bringen, ein 4 x 4-Loch zu graben und es mit Gold zu füllen, während es nach unten geht.

Agent - Dig 4

Experiment 2 – Erstelle ein Labyrinth

Dieser Experimentiercode soll dich dazu bringen, darüber nachzudenken, wie du einen Code für einen Tunnelroboter erstellen kannst. Der Agent nimmt dieses Mal zwei Zahlen an. Zuerst gräbt er nach unten und dann waagerecht.

Gebe den Chat-Befehl dig 5 4 ein, um diesen Code auszuprobieren.

Wie könntest du deinen Agenten dazu bringen, ein unterirdisches Labyrinth zu bauen? Was könnte man sonst noch mit dem unterirdischen Loch machen, das er gräbt? Du könntest es mit Lava füllen oder ein paar Mobs dort unten unterbringen oder sogar ein unterirdisches Haus bauen. Welche anderen Codestücke könnten dir dabei helfen?

Agent gräbt nach unten und horizontal

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.