Bomen omhakken voor hout is hard werken maar noodzakelijk in Minecraft als je voorwerpen en gereedschap wilt maken in de Survival modus. Maar je kunt dit karwei automatiseren door middel van code met de hulp van onze agent! Laten we de agent leren hoe hij een boom van elke hoogte kan omhakken en weer naar de grond kan terugkeren.
Wanneer je een nieuw MakeCode-project begint, is het vaak een goed idee om te plannen welke stappen je wilt nemen voordat je begint met coderen.
Dit is wat je wilt doen:
- Bepaal hoe hoog de boom is:
- Zolang er een blok voor de agent staat, blijf je omhoog bewegen.
- Benieuwd hoe hoog de boom is.
- Houd het volgende even vaak vol als de boom hoog is:
- Vernietig het blok dat voor je staat.
- Voer u naar beneden.
- Verzamel alles.
In de vorige activiteit werden ||logic:if then else||
-statements gebruikt om voorwaarden te controleren en acties uit te voeren zoals u dat wilde. In deze activiteit, zult u conditionals in een ||loops:while||
lus gebruiken. De agent zal omhoog blijven gaan zolang er een blok boom is om in te klimmen.
- Doe de activiteit
- Maak een project
- Maak de hoogtevariabele
- Initialiseer de hoogte op nul
- Begin aan de voet van een boom
- Verplaats de boom en hak
- Kom weer naar beneden
- Hakken terwijl je laat vallen
- Voltooi programma
- Challenges
- Challenge 1 – Teleporteer de agent en maak wat dingen klaar voor uitdaging 2
- Challenge 2 – Laat de agent automatisch naar de boom kijken
- Experimenten
- Experiment 1 – Vergroot het gat
- Experiment 2 – Maak een doolhof
Doe de activiteit
Maak een project
-
Maak een nieuw MakeCode-project met de naam Chopper.
-
Renaam het bestaande
||player:on chat command||
naar"tp"
. -
Sleep vanuit
||agent:AGENT||
een||agent:agent teleport to player||
-blok naar||player:on chat command "tp"||
. -
Nu gaan we ook een richtingscommando maken, zodat we onze Agent kunnen omdraaien. Klik met de rechtermuisknop op
||player:on chat command "tp"||
en selecteer Dupliceren om een kopie te maken. -
Naam het duplicaat
"lt"
. -
Verwijder het binnenblok voor dit nieuwe duplicaat en vervang
||agent:agent teleport to player||
door||agent:agent turn 'left'||
.
player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})
Maak de hoogtevariabele
-
Van
||player:PLAYER||
, sleep een||player:on chat command||
blok naar de coderingswerkruimte en hernoem het"chop"
. -
U gaat een variabele gebruiken om de hoogte van de boom bij te houden. Klik in de
||variables:VARIABLES||
-gereedschapskist op de knop Maak een variabele. -
Noem de nieuwe variabele
height
.
Initialiseer de hoogte op nul
-
Vanuit
||variables:VARIABLES||
, sleept u||variables:set||
naar buiten en klikt u deze vast binnen||player:on chat command "chop"||
. -
Selecteer in het blok
||variables:set||
met behulp van het vervolgkeuzemenuheight
als variabele en stelheight
in op0
.
let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0})
Begin aan de voet van een boom
Laten we aannemen dat de agent met het gezicht naar de voet van de boom is geplaatst wanneer het hakcommando wordt gegeven. U gebruikt de "tp"
en "lt"
commando’s om de agent op zijn plaats te krijgen en dan tenslotte "chop"
.
Gebruik een ||loops:while||
lus, dat is als een ||loops:repeat||
lus gecombineerd met een voorwaardelijke verklaring. Hier gaat de code door zolang er een blok voor de agent staat. Als er een blok voor de agent staat, dan zal deze verder gaan in de boom.
-
Vanuit
||loops:LOOPS||
, sleep een||loops:while||
lus en plaats deze onder||variables:set 'height'||
. Dit zou binnen||player:on chat command "chop"||
moeten zijn. -
Vanuit
||agent:AGENT||
, sleept u||agent:agent detect 'block' 'forward'||
en laat deze vallen in de||loops:while||
-lus die||logic:true||
vervangt.
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)) { }})
Verplaats de boom en hak
Eindelijk kunt u gaan hakken, althans de agent doet dat!
-
Van
||variables:VARIABLES||
, plaats een||variables:change||
blok in de||loops:while||
lus. -
Het nieuwe blok moet
||variables:change 'height' by 1||
zijn. Dit verhoogt de hoogtevariabele met 1 elke keer dat de agent omhoog beweegt. Zo kunnen we de hoogte van de boom bijhouden. -
Als er zich bladeren of takken boven het hoofd van de agent bevinden, moet u deze vernietigen om de agent omhoog te verplaatsen. Vanaf
||agent:AGENT||
plaatst u||agent:agent destroy||
onder||variables:change 'height' by 1||
. U moet dit blok aanpassen doorup
als richting te selecteren in het vervolgkeuzemenu. -
Finitief, laat uw agent naar boven bewegen. Pak een
||agent:agent move||
-blok en selecteerup
als richting in het vervolgkeuzemenu, net als in de vorige stap.
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 weer naar beneden
Nadat de agent de top van de boom heeft bereikt (er staat geen blok meer voor), wordt de hoogte van de boom opgeslagen in de variabele height. Dan wil je nog een lus die het blok voor de agent (de boomstam) zal vernietigen als de agent naar beneden beweegt. Deze lus moet net zo vaak worden uitgevoerd als de hoogte van de boom.
-
Vanuit
||loops:LOOPS||
sleep je een||loops:repeat||
lus, en zet deze na de||loops:while||
lus in je||player:on chat command "chop"||
. -
Van
||variables:VARIABLES||
, sleepheight
naar buiten en vervang de4
in de||loops:repeat||
-lus.
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++) { }})
Hakken terwijl je laat vallen
Op dit punt zou de agent boven in een boom moeten staan. Hij moet weer naar beneden klimmen, in de boom hakken en het hout verzamelen.
- Vanuit
||agent:AGENT||
, plaats een||agent:move||
en||agent:destroy||
binnen de||loops:repeat||
loop.
Nu moet je deze blokken aanpassen aan de situatie. De agent moet naar beneden bewegen en zal elk stuk van de boom dat voor hem staat omhakken.
- In het
||agent:move||
-blok kiest udown
als richting. De agent zal naar beneden bewegen. Dan moet de agent de boom ervoor vernietigen. De standaardinstellingen zijn goed voor||agent:destroy||
.
Tot slot wilt u dat uw agent al het hout verzamelt dat hij heeft gehakt.
- Van
||agent:AGENT||
, plaats||agent:agent collect all||
na de||loops:repeat||
lus. Dit is nu het laatste blok in onze||player:on chat command||
voor"chop"
.
Voltooi programma
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()})
Gedeeld programma: https://makecode.com/_1hFLi6X1qPcJ
Challenges
Het zou leuk zijn om de agent te laten teleporteren als onderdeel van ||player:on chat command "chop"||
. Het is moeilijk te voorspellen welke richting de agent op zal gaan nadat je hem geteleporteerd hebt. De richtingscommando’s (“tp” en “lt”) werken, maar één commando zou efficiënter zijn.
Kunnen we dit automatiseren? Na het voltooien van deze twee uitdagingen, zou je in staat moeten zijn om dit te bereiken. Denk eerst na over het probleem.
Je wilt:
- Teleporteer de agent.
- Draai de agent tot hij de basis van de boom vindt.
- Begin met klimmen en voer de code uit die we al hebben gemaakt.
Het enige potentiële nadeel aan dit plan is dat je nog steeds direct aan de basis van de boom moet staan om de agent op de juiste plaats te laten beginnen. Lage takken moeten misschien worden verwijderd. Misschien kun je als bonus uitzoeken hoe je dit probleem kunt oplossen, maar voltooi eerst uitdaging 1 en 2.
Challenge 1 – Teleporteer de agent en maak wat dingen klaar voor uitdaging 2
- Kun je de agent laten teleporteren als onderdeel van
||player:on chat command "chop"||
?
Daarna heb je nog wat dingen nodig om uitdaging 2 te voltooien. Maak het volgende:
-
Maak een variabele genaamd
TurnToTree
en stel deze in optrue
. -
Maak een while-lus die de agent naar links of rechts laat draaien.
Test je code!
Wat is er gebeurd? Oh nee, je zit vast in weer een oneindige lus. TurnToTree
is true
, dus je nieuwe while-lus blijft maar doorgaan en doorgaan. Daarom blijft uw agent maar draaien en draaien.
Lees hieronder hoe u dit kunt stoppen…
Als u vastzit in een oneindige lus, moet u uw code stoppen vanuit het codeconnectievenster.
- Klik op de knop Stop in de linkerbenedenhoek van uw code-verbindingsvenster.
- Start de codeeromgeving opnieuw. Klik op de afspeelknop. Als de afspeelknop niet aan staat, wordt uw code niet in Minecraft uitgevoerd.
- Het opnieuw opslaan van uw code kan uw code ook opnieuw opstarten, dus doe dat voor de zekerheid. Sla nog een keer op en zeg ja tegen het waarschuwingsbericht.
Dit is goed, want nu ben je voorbereid op uitdaging 2, maar je moet een manier bedenken om de agent te stoppen als hij de boom ziet.
Challenge 2 – Laat de agent automatisch naar de boom kijken
U bent nu klaar om de tweede taak op te lossen.
- Draai de agent tot hij de basis van de boom vindt.
Om dit te doen, moet u TurnToTree
op false
zetten binnen de while-lus, maar u hebt hiervoor een voorwaarde nodig. Je wilt dat de agent stopt als hij de boom gevonden heeft.
Er is geen vind-blok voor de agent, maar er is wel een detect-blok. Misschien kan dit nuttig zijn?
Dit blok geeft true
of false
terug als de agent een blok detecteert of vindt in de richting die jij aangeeft.
Hoe kun je deze conditie testen en dan de agent laten stoppen met draaien? Je moet TurnToTree
op false
zetten, maar waar en hoe?
Experimenten
Hier zijn geen regels… Kopieer de code voor elk experiment en verander de dingen om te zien wat voor resultaten je kunt maken. Er worden suggesties gegeven, maar doe wat u wilt!
Experiment 1 – Vergroot het gat
De agent werkt hard voor je! Je kunt hem ook voor jou laten graven. Voer het on chat commando dig 4 in om deze code uit te proberen.
Kunt u de agent laten graven en iets plaatsen tegelijkertijd? Kun je de grootte van het gat vergroten? Op dit moment is het 2 x 2. Je zou de agent een gat van 4 x 4 kunnen laten graven en het met goud laten bedekken als het naar beneden gaat.
Experiment 2 – Maak een doolhof
Deze experimentele code is bedoeld om je aan het denken te zetten over hoe je een code zou kunnen maken om een tunnelrobot te maken. De agent zal deze keer twee getallen accepteren. Eerst graaft hij naar beneden en dan horizontaal.
Voer het on chat commando dig 5 4 in om deze code uit te proberen.
Hoe zou je je agent een ondergronds doolhof kunnen laten bouwen? Wat zou je nog meer kunnen doen met dit ondergrondse gat dat hij aan het graven is? Je zou het kunnen vullen met lava, of er wat monsters neerzetten, of zelfs een ondergronds huis bouwen. Met welke andere stukjes code zou je dit kunnen doen?