Sekání stromů kvůli dřevu je v Minecraftu těžká práce, ale je nezbytná, pokud chcete vyrábět předměty a nástroje v režimu přežití. S pomocí našeho agenta však můžete tuto práci automatizovat pomocí kódu! Naučme agenta, jak pokácet strom libovolné výšky a vrátit se zpět na zem.
Když začínáte nový projekt MakeCode, je často dobré naplánovat si, jaké kroky chcete provést, než začnete kódovat.
Takto budete chtít postupovat:
- Zjistěte, jak je strom vysoký:
- Pokud je před agentem blok, pokračujte nahoru.
- Sleduj, jak je strom vysoký:
- Zopakuj následující postup tolikrát, kolikrát je strom vysoký:
- Znič blok před sebou.
- Přesuň se dolů.
- Sbírej vše.
Poslední činnost používala příkazy ||logic:if then else||
ke kontrole podmínek a provádění akcí tak, jak jsi chtěl. V této aktivitě budete používat podmíněné příkazy ve smyčce ||loops:while||
. Agent bude pokračovat v pohybu vzhůru, dokud bude existovat blok stromu, na který je třeba vylézt.
- Provedení aktivity
- Vytvoření projektu
- Vytvořte proměnnou výška
- Initializujte height na nulu
- Začněte u základny stromu
- Přesuňte se na strom a sekejte
- Vraťte se dolů
- Sekejte při tom
- Dokončete program
- Výzvy
- Výzva 1 – Teleport agenta a připrav některé věci pro Výzvu 2
- Úkol 2 – nechat agenta automaticky čelit stromu
- Experimenty
- Experiment 1 – Zvětšete velikost díry
- Experiment 2 – Vytvoření bludiště
Provedení aktivity
Vytvoření projektu
-
Vytvořte nový projekt MakeCode s názvem Chopper.
-
Přejmenujte stávající
||player:on chat command||
na"tp"
. -
Za
||agent:AGENT||
přetáhněte blok||agent:agent teleport to player||
dovnitř||player:on chat command "tp"||
. -
Nyní vytvoříme také směrový příkaz, abychom mohli našeho agenta otočit. Klikněte pravým tlačítkem myši na
||player:on chat command "tp"||
a vyberte Duplikovat, abyste vytvořili kopii. -
Duplikát pojmenujte
"lt"
. -
Vnitřní blok pro tento nový duplikát odstraňte a
||agent:agent teleport to player||
nahraďte||agent:agent turn 'left'||
.
player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})
Vytvořte proměnnou výška
-
Z bloku
||player:PLAYER||
přetáhněte blok||player:on chat command||
do kódovacího pracovního prostoru a přejmenujte jej na"chop"
. -
Proměnnou budete používat pro sledování výšky stromu. V zásuvce
||variables:VARIABLES||
Toolbox klikněte na tlačítko Make a Variable. -
Novou proměnnou pojmenujte
height
.
Initializujte height na nulu
-
Z bloku
||variables:VARIABLES||
vytáhněte||variables:set||
a přichyťte ji uvnitř||player:on chat command "chop"||
. -
V bloku
||variables:set||
vyberte pomocí rozbalovací nabídky jako proměnnouheight
a nastavteheight
na0
.
let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0})
Začněte u základny stromu
Předpokládejme, že agent je při zadání příkazu kácení umístěn čelem k základně stromu. Použijte příkazy "tp"
a "lt"
, abyste dostali agenta na místo, a nakonec příkaz "chop"
.
Použijete smyčku ||loops:while||
, což je něco jako smyčka ||loops:repeat||
kombinovaná s podmíněným příkazem. Zde bude kód pokračovat tak dlouho, dokud bude před agentem blok. Pokud je před agentem blok, bude pokračovat v pohybu po stromě.
-
Z
||loops:LOOPS||
vytáhněte smyčku||loops:while||
a pusťte ji pod||variables:set 'height'||
. To by bylo uvnitř||player:on chat command "chop"||
. -
Z
||agent:AGENT||
vytáhněte||agent:agent detect 'block' 'forward'||
a pusťte ji do smyčky||loops:while||
nahrazující||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)) { }})
Přesuňte se na strom a sekejte
Konečně se můžete pustit do sekání – nebo to alespoň dělá agent!“
-
Za
||variables:VARIABLES||
umístěte blok||variables:change||
dovnitř smyčky||loops:while||
. -
Nový blok by měl znít
||variables:change 'height' by 1||
. Tím se proměnná výška zvýší o 1 pokaždé, když se agent pohne nahoru. Takto můžeme sledovat výšku stromu. -
Jsou-li listy nebo větve nad hlavou agenta, je třeba je zničit, aby se agent mohl posunout nahoru. Z
||agent:AGENT||
umístěte||agent:agent destroy||
pod||variables:change 'height' by 1||
. Tento blok budete muset upravit tak, že v rozevírací nabídce vyberete jako směrup
. -
Nakonec přimějte agenta k pohybu nahoru. Uchopte blok
||agent:agent move||
a poté pomocí rozevírací nabídky vyberte jako směrup
stejně jako v předchozím kroku.
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) }})
Vraťte se dolů
Poté, co agent dosáhne vrcholu stromu (před ním již není žádný blok), bude výška stromu uložena do proměnné výška. Pak budete chtít další smyčku, která při pohybu agenta dolů zničí blok před agentem (kmen stromu). Tato smyčka by měla proběhnout tolikrát, kolikrát je výška stromu.
-
Z
||loops:LOOPS||
vytáhněte smyčku||loops:repeat||
a pusťte ji za smyčku||loops:while||
ve svém||player:on chat command "chop"||
. -
Z
||variables:VARIABLES||
vytáhněteheight
a nahraďte jím4
ve smyčce||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++) { }})
Sekejte při tom
V tuto chvíli by měl agent stát na vrcholu stromu. Musíte ho přimět, aby slezl zpět dolů, pokácel strom a sebral dřevo.
- Za
||agent:AGENT||
umístěte||agent:move||
a||agent:destroy||
dovnitř smyčky||loops:repeat||
.
Nyní musíte tyto bloky přizpůsobit situaci. Agent se musí pohybovat dolů a bude sekat každý kus stromu, který je před ním.
- V bloku
||agent:move||
vyberte jako směrdown
. Agent se bude pohybovat dolů. Poté by měl agent zničit blok stromu, který je před ním. Výchozí nastavení pro||agent:destroy||
je v pořádku.
Nakonec chcete, aby váš agent posbíral všechno dřevo, které pokácel.
- Z
||agent:AGENT||
umístěte||agent:agent collect all||
za smyčku||loops:repeat||
. To je nyní poslední blok v našem||player:on chat command||
pro"chop"
.
Dokončete 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()})
Sdílený program: https://makecode.com/_1hFLi6X1qPcJ
Výzvy
Bylo by hezké, kdyby se agent teleportoval jako součást ||player:on chat command "chop"||
. Je těžké předvídat, kterým směrem bude agent po teleportaci směřovat. Směrové příkazy („tp“ a „lt“) fungují, ale jeden příkaz by byl efektivnější.
Dá se to zautomatizovat? Po splnění těchto dvou úkolů byste toho měli být schopni dosáhnout. Nejprve se zamyslete nad problémem.
Chcete:
- Teleportovat agenta.
- Otáčet agenta, dokud nenajde základnu stromu.
- Začít šplhat a spustit kód, který jsme již vytvořili.
Jedinou možnou nevýhodou tohoto plánu je, že byste stále museli stát přímo u základny stromu, aby agent začal na správném místě. Možná bude nutné odstranit nízké větve. Možná bys jako bonus mohl přijít na to, jak vyřešit i tento problém, ale nejprve splň Výzvy 1 a 2.
Výzva 1 – Teleport agenta a připrav některé věci pro Výzvu 2
- Můžeš nechat agenta teleportovat v rámci
||player:on chat command "chop"||
?“
Poté budeš potřebovat některé věci pro splnění Výzvy 2. V rámci Výzvy 2 budeš muset vyřešit i tento problém. Vytvořte následující:
-
Vytvořte proměnnou
TurnToTree
a nastavte ji natrue
. -
Vytvořte smyčku while, která způsobí, že se agent otočí doleva nebo doprava.
Vyzkoušejte svůj kód!
Co se stalo? Ale ne, zasekli jste se v další nekonečné smyčce. TurnToTree
je true
, takže vaše nová smyčka while se stále opakuje a opakuje. Proto se váš agent stále točí a točí.
Níže si přečtěte, jak to zastavit…
Pokud jste uvízli v nekonečné smyčce, musíte svůj kód zastavit z okna pro připojení kódu.
- Klepněte na tlačítko stop v levém dolním rohu okna připojení kódu.
- Znovu spusťte kódovací prostředí. Klepněte na tlačítko přehrát. Pokud tlačítko přehrávání není zapnuté, váš kód se v Minecraftu nespustí.
- Znovu uložení kódu může váš kód také restartovat, takže to pro jistotu udělejte. Uložte kód ještě jednou a na varovnou zprávu odpovězte ano.
To je v pořádku, protože nyní jste připraveni na úkol 2, ale musíte vymyslet způsob, jak agenta zastavit, až uvidí strom.
Úkol 2 – nechat agenta automaticky čelit stromu
Nyní jste připraveni vyřešit druhý úkol.
- Otočte agenta, dokud nenajde základnu stromu.
K tomu budete muset uvnitř cyklu while nastavit TurnToTree
na false
, ale potřebujete k tomu podmínku. Chcete, aby se agent zastavil, až najde strom.
Pro agenta neexistuje blok find, ale existuje blok detect. Možná by to mohlo být užitečné?“
Tento blok vrací true
nebo false
, pokud agent detekuje nebo najde blok ve směru, který mu řeknete.
Jak byste mohli tuto podmínku otestovat a pak agenta zastavit, aby se neotočil? Musíte nastavit TurnToTree
na false
, ale kde a jak?“
Experimenty
Tady nejsou žádná pravidla… Zkopírujte kód pro jednotlivé experimenty a měňte věci, abyste zjistili, jaké výsledky můžete vytvořit. Návrhy jsou uvedeny, ale dělejte si, co chcete!
Experiment 1 – Zvětšete velikost díry
Agent pro vás tvrdě pracuje! Můžeš ho přimět, aby kopal i za tebe. Zadejte na chatu příkaz dig 4 a vyzkoušejte tento kód.
Dokážete agenta přimět, aby kopal a zároveň něco umístil? Dokážete zvětšit velikost díry? Právě teď je to 2 x 2. Mohl bys agenta přimět, aby vykopal díru 4 x 4 a vyložil ji zlatem, jakmile půjde dolů.
Experiment 2 – Vytvoření bludiště
Tento kód experimentu má za cíl přimět vás přemýšlet o tom, jak byste mohli sestavit nějaký kód pro vytvoření tunelovacího robota. Agent tentokrát přijme dvě čísla. Nejprve bude kopat dolů a poté bude kopat vodorovně.
Zadejte na chatu příkaz dig 5 4 a vyzkoušejte tento kód.
Jak byste mohli přimět agenta, aby postavil podzemní bludiště? Co dalšího byste mohli udělat s touto podzemní dírou, kterou kope? Mohl bys ji vyplnit lávou nebo tam umístit nějaké moby nebo dokonce postavit podzemní dům. Jaké další části kódu by ti s tím mohly pomoci?“
.