Aktivitet: Agent Tree Chopper

Avverka träd efter trä är ett hårt arbete men nödvändigt i Minecraft om du vill tillverka föremål och verktyg i överlevnadsläget. Men du kan automatisera denna syssla genom kod med hjälp av vår agent! Låt oss lära agenten hur man hugger ner ett träd av valfri höjd och återvänder tillbaka ner till marken.

När du startar ett nytt MakeCode-projekt är det ofta en bra idé att planera vilka steg du vill ta innan du börjar koda.

Här är vad du vill göra:

  1. Finns ut hur högt trädet är:
    • Så länge det finns ett block framför agenten fortsätter du att röra dig uppåt.
    • Håll koll på hur högt trädet är.
  2. Upprepa följande lika många gånger som trädet är högt:
    • Destruera blocket framför dig.
    • Förflytta dig neråt.
  3. Samla ihop allting.

I den senaste aktiviteten användes ||logic:if then else||-anvisningar för att kontrollera villkor och utföra åtgärder på det sätt som du ville att de skulle göras. I den här aktiviteten kommer du att använda villkor i en ||loops:while||-slinga. Agenten kommer att fortsätta att röra sig uppåt så länge det finns ett trädblock att klättra uppför.

Gör aktiviteten

Skapa ett projekt

  1. Skapa ett nytt MakeCode-projekt som heter Chopper.

  2. Namnge det befintliga ||player:on chat command|| till "tp".

  3. Från ||agent:AGENT|| drar du ett ||agent:agent teleport to player||-block in i ||player:on chat command "tp"||.

  4. Nu ska vi också skapa ett riktningskommando så att vi kan vända vår Agent. Du kan högerklicka på ||player:on chat command "tp"|| och välja Duplicera för att göra en kopia.

  5. Nämn duplikatet "lt".

  6. Släpp det inre blocket för detta nya duplikat och ersätt ||agent:agent teleport to player|| med ||agent:agent turn 'left'||.

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

Skapa höjdvariabeln

  1. Från ||player:PLAYER|| drar du ett ||player:on chat command||-block till kodningsarbetsytan och döper om det till "chop".

  2. Du kommer att använda en variabel för att hålla reda på trädets höjd. I lådan ||variables:VARIABLES|| Verktygslåda klickar du på knappen Gör en variabel.

  3. Nämn den nya variabeln height.

Gör en ny variabel som heter 'height'

Initialisera höjden till noll

  1. Från ||variables:VARIABLES|| drar du ut ||variables:set|| och fäster den inuti ||player:on chat command "chop"||.

  2. I blocket ||variables:set|| använder du rullgardinsmenyn för att välja height som variabel och ställer in height till 0.

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

Start vid basen av ett träd

Låt oss anta att agenten placeras med ansiktet mot basen av trädet när huggkommandot ges. Du använder kommandona "tp" och "lt" för att få agenten på plats och slutligen "chop".

Använd en ||loops:while||-slinga, som är som en ||loops:repeat||-slinga kombinerad med ett villkorligt uttalande. Här fortsätter koden så länge det finns ett block framför agenten. Om det finns ett block framför agenten fortsätter den att röra sig uppåt i trädet.

  1. Från ||loops:LOOPS|| drar du ut en ||loops:while||-slinga och släpper den under ||variables:set 'height'||. Detta skulle ligga innanför ||player:on chat command "chop"||.

  2. Från ||agent:AGENT|| drar du ut ||agent:agent detect 'block' 'forward'|| och släpper den i ||loops:while||-slingan som ersätter ||logic:true||.

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)) { }})

Förflytta dig upp i trädet och hugga

Äntligen får du hugga – eller åtminstone agenten gör det!

  1. Från ||variables:VARIABLES|| placerar du ett ||variables:change||-block inuti ||loops:while||-slingan.

  2. Det nya blocket ska vara ||variables:change 'height' by 1||. Detta kommer att öka höjdvariabeln med 1 varje gång agenten rör sig uppåt. På så sätt kan vi hålla reda på trädets höjd.

  3. Om löv eller grenar är ovanför agentens huvud måste du förstöra dem för att kunna flytta agenten uppåt. Från ||agent:AGENT|| placerar du ||agent:agent destroy|| under ||variables:change 'height' by 1||. Du måste justera detta block genom att välja up som riktning från rullgardinsmenyn.

  4. Finnligen kan du få din agent att flytta uppåt. Ta ett ||agent:agent move||-block och använd sedan rullgardinsmenyn för att välja up som riktning som du gjorde i föregående steg.

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) }})

Kom tillbaka ner

När agenten har nått toppen av trädet (det finns inte längre något block framför den) kommer trädets höjd att lagras i variabeln height. Sedan vill du ha en annan slinga som förstör blocket framför agenten (trädstammen) när agenten rör sig nedåt. Denna slinga ska köras lika många gånger som trädets höjd.

  1. Från ||loops:LOOPS|| drar du ut en ||loops:repeat||-slinga och släpper den efter ||loops:while||-slingan i din ||player:on chat command "chop"||.

  2. Från ||variables:VARIABLES|| drar du ut height och ersätter 4 i ||loops:repeat||-slingan.

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++) { }})

Hugga medan du släpper

I det här läget bör agenten stå i toppen av ett träd. Du måste få den att klättra ner igen, hugga trädet och samla in veden.

  1. Från ||agent:AGENT|| placerar du en ||agent:move|| och ||agent:destroy|| inne i ||loops:repeat||-slingan.

Nu måste du justera dessa klossar för situationen. Agenten måste röra sig nedåt och kommer att hugga varje bit av trädet som ligger framför den.

  1. I blocket ||agent:move|| väljer du down som riktning. Agenten kommer att röra sig nedåt. Därefter ska agenten förstöra trädblocket framför den. Standardinställningarna är ok för ||agent:destroy||.

Slutligt vill du att agenten ska samla in allt virke som den huggit.

  1. Från ||agent:AGENT|| placerar du ||agent:agent collect all|| efter ||loops:repeat||-slingan. Detta är nu det sista blocket i vårt ||player:on chat command|| för "chop".

Fullständigt program

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()})

Delat program: https://makecode.com/_1hFLi6X1qPcJ

Agent - Förberedelse av trädslagsstart

Agent - Start av trädslagsstart med korrekt inriktning

Agent - Slutförande av trädslagsstart

Utmaningar

Det skulle vara trevligt om agenten kunde teleportera som en del av ||player:on chat command "chop"||. Det är svårt att förutsäga vilken riktning agenten kommer att vara vänd åt efter att du har teleporterat den. Riktningskommandona (”tp” och ”lt”) fungerar, men ett enda kommando skulle vara effektivare.

Kan vi automatisera detta? När du har klarat de här två utmaningarna bör du kunna åstadkomma detta. Tänk först på problemet.

Du vill:

  1. Telegrafera agenten.
  2. Sväng agenten tills den hittar trädets bas.
  3. Begynna klättringen och kör koden som vi redan har gjort.

Den enda potentiella nackdelen med den här planen är att du fortfarande måste stå direkt vid trädets bas för att agenten ska kunna börja på rätt ställe. Låga grenar kan behöva rensas bort. Kanske kan du som en bonus komma på hur du löser det här problemet också, men först måste du slutföra utmaningarna 1 och 2.

Utmaning 1 – Teleportera agenten och fixa några saker inför utmaning 2

  1. Kan du få agenten att teleportera sig som en del av ||player:on chat command "chop"||?

Efter det kommer du att behöva några saker för att klara av utmaning 2. Skapa följande:

  1. Skapa en variabel som heter TurnToTree och sätt den till true.

  2. Skapa en while-slinga som får agenten att svänga vänster eller höger.

Testa din kod!

Vad hände? Åh nej, du har fastnat i ännu en oändlig loop. TurnToTree är true, så din nya while-slinga bara fortsätter och fortsätter. Därför fortsätter din agent bara att snurra och snurra.

Stoppa kod

Läs nedan hur du stoppar detta…

Om du fastnat i en oändlig slinga måste du stoppa din kod från kodanslutningsfönstret.

  1. Klicka på stoppknappen i det nedre vänstra hörnet av ditt kodanslutningsfönster.

Stoppa kod

  1. Starta om kodningsmiljön. Klicka på uppspelningsknappen. Om uppspelningsknappen inte är på kommer din kod inte att köras i Minecraft.

Play

  1. Spara din kod igen kan också starta om din kod, så gör det för säkerhets skull. Spara en gång till och säg ja till varningsmeddelandet.

Save

Save Confirm

Detta är ok eftersom du nu är förberedd för utmaning 2, men du måste komma på ett sätt att stoppa agenten när han ser trädet.

Utmaning 2 – Få agenten att möta trädet automatiskt

Du är nu redo att lösa den andra uppgiften.

  1. Vänd agenten tills den hittar trädets bas.

För att göra detta måste du ställa in TurnToTree till false inne i while-slingan, men du behöver ett villkor för detta. Du vill att agenten ska stanna när den hittar trädet.

Det finns inget hitta-block för agenten, men det finns ett upptäcka-block. Kanske kan detta vara användbart?

Save Confirm

Detta block returnerar true eller false om agenten upptäcker eller hittar ett block i den riktning du säger till den.

Hur skulle du kunna testa det här villkoret och sedan stoppa agenten från att vända? Du måste ställa in TurnToTree till false, men var och hur?

Experiment

Här finns inga regler… Kopiera koden för varje experiment och ändra på saker och ting för att se vilka resultat du kan skapa. Förslag ges, men gör som du vill!

Experiment 1 – Öka storleken på hålet

Agenten arbetar hårt för dig! Du kan få den att gräva åt dig också. Ange on chat-kommandot dig 4 för att prova den här koden.

Kan du få agenten att gräva och placera något samtidigt? Kan du öka storleken på hålet? Just nu är det 2 x 2. Du kanske kan få agenten att gräva ett 4 x 4 hål och fodra det med guld när det går ner.

Agent - Gräv 4

Experiment 2 – Skapa en labyrint

Den här experimentkoden syftar till att få dig att tänka på hur du skulle kunna bygga en kod för att skapa en robot som gräver tunnlar. Agenten kommer att acceptera två nummer den här gången. Först gräver den neråt och sedan kommer den att gräva horisontellt.

Inför on chat-kommandot dig 5 4 för att prova den här koden.

Hur skulle du kunna få din agent att bygga en underjordisk labyrint? Vad skulle du annars kunna göra med detta underjordiska hål som den gräver? Du skulle kunna fylla det med lava eller placera några mobs där nere eller till och med bygga ett underjordiskt hem. Vilka andra delar av koden kan hjälpa dig att göra detta?

Agent gräver neråt och horisontellt

Lämna ett svar

Din e-postadress kommer inte publiceras.