Activitate: Agent Tree Chopper

Tăierea copacilor pentru lemn este o muncă grea, dar necesară în Minecraft dacă doriți să creați obiecte și unelte în modul Survival. Dar puteți automatiza această corvoadă prin cod cu ajutorul agentului nostru! Haideți să învățăm agentul cum să taie un copac de orice înălțime și să se întoarcă înapoi la sol.

Când începeți un nou proiect MakeCode, este adesea o idee bună să planificați ce pași doriți să faceți înainte de a începe să codificați.

Iată ce veți dori să faceți:

  1. Dați-vă seama cât de înalt este copacul:
    • Atâta timp cât există un bloc în fața agentului, continuați să vă deplasați în sus.
    • Țineți evidența înălțimii copacului.
  2. Repetați următoarele de același număr de ori cât este înalt copacul:
    • Distrugeți blocul din fața voastră.
    • Mutați-vă în jos.
  3. Colectați totul.

Ultima activitate a folosit declarațiile ||logic:if then else|| pentru a verifica condițiile și a efectua acțiuni așa cum ați dorit să fie făcute. În această activitate, veți folosi condiționalele într-o buclă ||loops:while||. Agentul va continua să se deplaseze în sus atâta timp cât există un bloc de copac pe care să urce.

Realizați activitatea

Realizați un proiect

  1. Crearea unui nou proiect MakeCode numit Chopper.

  2. Renumiți proiectul existent ||player:on chat command|| la "tp".

  3. Din ||agent:AGENT||, trageți un bloc ||agent:agent teleport to player|| în interiorul ||player:on chat command "tp"||.

  4. Acum, haideți să creăm și o comandă direcțională pentru a ne putea întoarce agentul. Puteți face clic dreapta pe ||player:on chat command "tp"|| și selecta Duplicate pentru a face o copie.

  5. Renumiți duplicatul "lt".

  6. Ștergeți blocul interior pentru acest nou duplicat și înlocuiți ||agent:agent teleport to player|| cu ||agent:agent turn 'left'||.

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

Creați variabila de înălțime

  1. Din ||player:PLAYER||, trageți un bloc ||player:on chat command|| în spațiul de lucru de codare și redenumiți-l "chop".

  2. Vă veți folosi o variabilă pentru a ține evidența înălțimii arborelui. În sertarul ||variables:VARIABLES|| Toolbox, faceți clic pe butonul Make a Variable.

  3. Denumiți noua variabilă height.

Faceți o nouă variabilă numită 'height'

Inițializați înălțimea la zero

  1. Din ||variables:VARIABLES||, trageți în afară ||variables:set|| și fixați-o în interiorul ||player:on chat command "chop"||.

  2. În blocul ||variables:set||, folosiți meniul derulant pentru a selecta height ca variabilă și setați height la 0.

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

Începeți de la baza unui copac

Să presupunem că agentul este plasat cu fața la baza copacului atunci când se dă comanda de tăiere. Folosiți comenzile "tp" și "lt" pentru a plasa agentul pe poziție și apoi, în final, "chop".

Utilizați o buclă ||loops:while||, care este ca o buclă ||loops:repeat|| combinată cu o declarație condițională. Aici, codul va continua atâta timp cât există un bloc în fața agentului. Dacă există un bloc în fața agentului, atunci acesta va continua să urce în arbore.

  1. Din ||loops:LOOPS||, trageți o buclă ||loops:while|| și aruncați-o sub ||variables:set 'height'||. Aceasta ar fi în interiorul ||player:on chat command "chop"||.

  2. Din ||agent:AGENT||, trageți ||agent:agent detect 'block' 'forward'|| și aruncați-l în bucla ||loops:while|| care înlocuiește ||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)) { }})

Mutați-vă în susul copacului și tăiați

În sfârșit, ajungeți să tăiați ceva – sau cel puțin agentul o face!

  1. Din ||variables:VARIABLES||, plasați un bloc ||variables:change|| în interiorul buclei ||loops:while||.

  2. Noul bloc ar trebui să citească ||variables:change 'height' by 1||. Acest lucru va crește variabila înălțime cu 1 de fiecare dată când agentul se mișcă în sus. Acesta este modul în care putem ține evidența înălțimii copacului.

  3. Dacă frunzele sau ramurile sunt deasupra capului agentului, trebuie să le distrugeți pentru a muta agentul în sus. De la ||agent:AGENT||, plasați ||agent:agent destroy|| sub ||variables:change 'height' by 1||. Va trebui să ajustați acest bloc selectând up ca direcție din meniul derulant.

  4. În cele din urmă, faceți ca agentul dvs. să se deplaseze în sus. Luați un bloc ||agent:agent move|| și apoi folosiți meniul derulant pentru a selecta up ca direcție, așa cum ați făcut la pasul anterior.

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

Veniți înapoi în jos

După ce agentul ajunge în vârful copacului (nu mai există un bloc în fața lui), înălțimea copacului va fi stocată în variabila înălțime. Apoi veți dori o altă buclă care va distruge blocul din fața agentului (trunchiul copacului) pe măsură ce agentul se deplasează în jos. Această buclă ar trebui să se execute de atâtea ori câte ori este înălțimea copacului.

    1. Din ||loops:LOOPS||, trageți o buclă ||loops:repeat|| și aruncați-o după buclă ||loops:while|| în ||player:on chat command "chop"|| dumneavoastră.

    2. Din ||variables:VARIABLES||, trageți height și înlocuiți 4 în bucla ||loops:repeat||.

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

    Tăiați în timp ce lăsați

    În acest moment, agentul ar trebui să se afle în vârful unui copac. Trebuie să-l faceți să coboare înapoi, să taie copacul și să colecteze lemnul.

    1. Din ||agent:AGENT||, plasați un ||agent:move|| și un ||agent:destroy|| în interiorul buclei ||loops:repeat||.

    Acum trebuie să adaptați aceste blocuri la situație. Agentul trebuie să se deplaseze în jos și va tăia fiecare bucată de copac care se află în fața sa.

    1. În blocul ||agent:move||, selectați down ca direcție. Agentul se va deplasa în jos. Apoi, agentul ar trebui să distrugă blocul de copac din fața sa. Setările implicite sunt ok pentru .

    În cele din urmă, vrei ca agentul tău să colecteze tot lemnul pe care l-a tăiat.

    1. Din ||agent:AGENT||, plasează ||agent:agent collect all|| după bucla ||loops:repeat||. Acesta este acum ultimul bloc din programul nostru ||player:on chat command|| pentru "chop".

    Program complet

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

    Program partajat: https://makecode.com/_1hFLi6X1qPcJ

    Agent - Tree Chop Start Prep

    Agent - Tree Chop Start Correct Facing

    Agent - Tree Chop Finish

    Provocări

    Ar fi frumos ca agentul să se teleporteze ca parte din ||player:on chat command "chop"||. Este greu de prezis în ce direcție se va afla agentul după ce îl teleportezi. Comenzile direcționale („tp” și „lt”) funcționează, dar o singură comandă ar fi mai eficientă.

    Se poate automatiza acest lucru? După ce ați finalizat aceste două provocări, ar trebui să puteți realiza acest lucru. În primul rând, gândiți-vă la problemă.

    Vreți să:

    1. Teleportați agentul.
    2. Întoarceți agentul până când găsește baza copacului.
    3. Începeți să vă cățărați și să executați codul pe care l-am făcut deja.

    Singurul dezavantaj potențial al acestui plan este că tot va trebui să stați direct la baza copacului pentru ca agentul să pornească de la locul potrivit. S-ar putea să fie nevoie să fie curățate ramurile joase. Poate că, ca bonus, v-ați putea da seama cum să rezolvați și această problemă, dar mai întâi finalizați Provocările 1 și 2.

    Provocarea 1 – Teleportarea agentului și pregătirea unor lucruri pentru Provocarea 2

    1. Puteți face ca agentul să se teleporteze ca parte din ||player:on chat command "chop"||?

    După aceea veți avea nevoie de câteva lucruri pentru a realiza Provocarea 2. Vă rugăm să creați următoarele:

    1. Creați o variabilă numită TurnToTree și setați-o la true.

    2. Creați o buclă while care să-l facă pe agent să se întoarcă la stânga sau la dreapta.

    Testați-vă codul!

    Ce s-a întâmplat? O, nu, ați rămas blocat într-o altă buclă infinită. TurnToTree este true, așa că noua ta buclă while continuă să meargă și să meargă. Prin urmare, agentul dvs. continuă să se învârtă și să se învârtă.

    Stop Code

    Citește mai jos cum să oprești acest lucru…

    Dacă sunteți prins într-o buclă infinită, va trebui să vă opriți codul din fereastra de conectare a codului.

    1. Click pe butonul de oprire din colțul din stânga jos al ferestrei de conectare a codului.

    Stop Code

    1. Reporniți mediul de codare. Faceți clic pe butonul de redare. Dacă butonul de redare nu este activat, atunci codul dvs. nu va rula în Minecraft.

    Play

    1. Salvarea din nou a codului dvs. poate reporni codul, de asemenea, așa că faceți acest lucru pentru o măsură bună. Mai salvați încă o dată și spuneți „da” la mesajul de avertizare.

    Salvare

    Salvare Confirmare

    Acest lucru este în regulă pentru că acum ești pregătit pentru Provocarea 2, dar trebuie să găsești o modalitate de a opri agentul atunci când vede copacul.

    Provocarea 2 – Puneți agentul să se confrunte automat cu copacul

    Acum sunteți gata să rezolvați cea de-a doua sarcină.

    1. Întoarceți agentul până când găsește baza copacului.

    Pentru a face acest lucru, va trebui să setați TurnToTree la falseîn interiorul buclei while, dar aveți nevoie de o condiție pentru aceasta. Vreți ca agentul să se oprească atunci când găsește copacul.

    Nu există un bloc de găsire pentru agent, dar există un bloc de detectare. Poate că acesta ar putea fi util?

    Salvare Confirmare

    Acest bloc returnează true sau false dacă agentul detectează sau găsește un bloc în direcția pe care i-o spuneți.

    Cum ați putea testa această condiție și apoi să opriți agentul să se întoarcă? Trebuie să setați TurnToTree la false, dar unde și cum?

    Experimente

    Aici, nu există reguli… Copiați codul pentru fiecare experiment și schimbați lucrurile pentru a vedea ce fel de rezultate puteți crea. Sunt date sugestii, dar faceți cum doriți!

    Experiment 1 – Mărește dimensiunea găurii

    Agentul lucrează din greu pentru tine! Îl poți face să sape și pentru tine. Introduceți pe chat comanda dig 4 pentru a încerca acest cod.

    Puteți face ca agentul să sape și să plaseze ceva în același timp? Poți mări dimensiunea găurii? În acest moment, este de 2 x 2. Ai putea face ca agentul să sape o gaură de 4 x 4 și să o căptușească cu aur pe măsură ce coboară.

    Agent - Dig 4

    Experiment 2 – Creați un labirint

    Codul acestui experiment are ca scop să vă facă să vă gândiți la modul în care ați putea construi un cod pentru a crea un robot care să facă un tunel. Agentul va accepta de data aceasta două numere. Mai întâi, va săpa în jos și apoi va săpa pe orizontală.

    Introduceți comanda on chat dig 5 4 pentru a încerca acest cod.

    Cum ai putea face ca agentul tău să construiască un labirint subteran? Ce altceva ați putea face cu această gaură subterană pe care o sapă? Ați putea să o umpleți cu lavă sau să puneți niște mobs acolo jos sau chiar să construiți o casă subterană. Ce alte bucăți de cod v-ar putea ajuta să faceți acest lucru?

    Agentul sapă în jos și orizontal

    .

Lasă un răspuns

Adresa ta de email nu va fi publicată.