Rąbanie drzew na drewno to ciężka praca, ale konieczna w Minecrafcie, jeśli chcesz wytwarzać przedmioty i narzędzia w trybie Survival. Ale możesz zautomatyzować ten obowiązek poprzez kod z pomocą naszego agenta! Nauczmy agenta, jak ścinać drzewa o dowolnej wysokości i wracać z powrotem na ziemię.
Gdy zaczynasz nowy projekt MakeCode, często dobrym pomysłem jest zaplanowanie kroków, które chcesz wykonać, zanim zaczniesz kodować.
Oto, co będziesz chciał zrobić:
- Zorientuj się, jak wysokie jest drzewo:
- Dopóki przed agentem znajduje się blok, przesuwaj się w górę.
- Zapamiętaj, jak wysokie jest drzewo.
- Powtarzaj poniższe czynności tyle razy, ile drzewo jest wysokie:
- Zniszcz blok przed sobą.
- Przesuń się w dół.
- Zbierz wszystko.
W ostatniej aktywności użyto instrukcji ||logic:if then else||
do sprawdzania warunków i wykonywania akcji w sposób, w jaki chciałeś je wykonać. W tym ćwiczeniu użyjesz instrukcji warunkowych w pętli ||loops:while||
. Agent będzie poruszał się w górę tak długo, jak długo będzie istniał blok drzewa do wspięcia.
- Wykonaj ćwiczenie
- Zrób projekt
- Utwórz zmienną wysokości
- Initialize height to zero
- Start u podstawy drzewa
- Przesuń się w górę drzewa i posiekaj
- Powróć na dół
- Chop while you drop
- Kompletny program
- Wyzwania
- Wyzwanie 1 – Teleportuj agenta i przygotuj kilka rzeczy do Wyzwania 2
- Wyzwanie 2 – Spraw, aby agent automatycznie stanął przed drzewem
- Doświadczenia
- Eksperyment 1 – Zwiększ rozmiar dziury
- Eksperyment 2 – Create a Maze
Wykonaj ćwiczenie
Zrób projekt
-
Utwórz nowy projekt MakeCode o nazwie Chopper.
-
Zmień nazwę istniejącego
||player:on chat command||
na"tp"
. -
Z
||agent:AGENT||
przeciągnij blok||agent:agent teleport to player||
wewnątrz||player:on chat command "tp"||
. -
Teraz stwórzmy również polecenie kierunkowe, abyśmy mogli obrócić naszego Agenta. Możesz kliknąć prawym przyciskiem myszy na
||player:on chat command "tp"||
i wybrać Duplikuj, aby utworzyć kopię. -
Nadaj duplikatowi nazwę
"lt"
. -
Usuń wewnętrzny blok dla tego nowego duplikatu i zastąp
||agent:agent teleport to player||
przez||agent:agent turn 'left'||
.
player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})
Utwórz zmienną wysokości
-
Z
||player:PLAYER||
przeciągnij blok||player:on chat command||
do obszaru roboczego kodowania i zmień jego nazwę na"chop"
. -
Użyjesz zmiennej do śledzenia wysokości drzewa. W szufladzie
||variables:VARIABLES||
Toolbox kliknij przycisk Make a Variable. -
Nadaj nowej zmiennej nazwę
height
.
Initialize height to zero
-
From
||variables:VARIABLES||
, drag out||variables:set||
and snap it inside||player:on chat command "chop"||
. -
W bloku
||variables:set||
za pomocą menu rozwijanego wybierzheight
jako zmienną i ustawheight
na0
.
let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0})
Start u podstawy drzewa
Załóżmy, że w momencie wydania polecenia chop agent jest ustawiony przodem do podstawy drzewa. Używasz poleceń "tp"
i "lt"
, aby ustawić agenta na miejscu, a na koniec "chop"
.
Użyj pętli ||loops:while||
, która jest jak pętla ||loops:repeat||
połączona z instrukcją warunkową. Tutaj kod będzie kontynuowany tak długo, jak długo będzie istniał blok przed agentem. Jeśli przed agentem znajduje się blok, to będzie się on poruszał w górę drzewa.
-
Z
||loops:LOOPS||
przeciągnij pętlę||loops:while||
i upuść ją pod||variables:set 'height'||
. Byłoby to wewnątrz||player:on chat command "chop"||
. -
Z
||agent:AGENT||
przeciągnij||agent:agent detect 'block' 'forward'||
i upuść ją do pętli||loops:while||
zastępującej||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)) { }})
Przesuń się w górę drzewa i posiekaj
Wreszcie masz okazję trochę porąbać – a przynajmniej robi to agent!
-
Z
||variables:VARIABLES||
umieść blok||variables:change||
wewnątrz pętli||loops:while||
. -
Nowy blok powinien mieć treść
||variables:change 'height' by 1||
. Dzięki temu zmienna height będzie zwiększana o 1 za każdym razem, gdy agent przesunie się w górę. W ten sposób będziemy mogli śledzić wysokość drzewa. -
Jeśli liście lub gałęzie znajdują się nad głową agenta, musisz je zniszczyć, aby przesunąć agenta w górę. Z
||agent:AGENT||
, umieść||agent:agent destroy||
poniżej||variables:change 'height' by 1||
. Będziesz musiał dostosować ten blok, wybierającup
jako kierunek z menu rozwijanego. -
Wreszcie spraw, by twój agent ruszył w górę. Chwyć blok
||agent:agent move||
, a następnie użyj menu rozwijanego, aby wybraćup
jako kierunek, tak jak zrobiłeś to w poprzednim 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) }})
Powróć na dół
Po tym, jak agent osiągnie szczyt drzewa (nie ma już bloku przed nim), wysokość drzewa zostanie zapisana w zmiennej height. Następnie będziesz chciał wykonać kolejną pętlę, która zniszczy blok przed agentem (pień drzewa), gdy agent będzie poruszał się w dół. Ta pętla powinna być uruchamiana tyle razy, ile wynosi wysokość drzewa.
-
Z
||loops:LOOPS||
przeciągnij pętlę||loops:repeat||
i upuść ją po pętli||loops:while||
w swoim||player:on chat command "chop"||
. -
Z
||variables:VARIABLES||
przeciągnijheight
i zastąp4
w pętli||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++) { }})
Chop while you drop
W tym momencie agent powinien stać na szczycie drzewa. Musisz sprawić, by wspiął się z powrotem na dół, posiekał drzewo i zebrał drewno.
- Z
||agent:AGENT||
umieść||agent:move||
i||agent:destroy||
wewnątrz pętli||loops:repeat||
.
Teraz musisz dostosować te klocki do sytuacji. Agent musi poruszać się w dół i będzie rąbał każdy kawałek drzewa, który znajduje się przed nim.
- W bloku
||agent:move||
wybierzdown
jako kierunek. Agent będzie poruszał się w dół. Następnie agent powinien zniszczyć blok drzewa, który znajduje się przed nim. Domyślne ustawienia są ok dla||agent:destroy||
.
Na koniec chcesz, aby Twój agent zebrał całe drewno, które porąbał.
- Z
||agent:AGENT||
, umieść||agent:agent collect all||
po pętli||loops:repeat||
. Jest to teraz ostatni blok w naszym||player:on chat command||
dla"chop"
.
Kompletny 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()})
Wspólny program: https://makecode.com/_1hFLi6X1qPcJ
Wyzwania
Miło by było, gdyby agent teleportował się w ramach ||player:on chat command "chop"||
. Trudno jest przewidzieć, w którą stronę będzie zwrócony agent po teleportacji. Komendy kierunkowe („tp” i „lt”) działają, ale jedna komenda byłaby bardziej efektywna.
Czy możemy to zautomatyzować? Po wykonaniu tych dwóch zadań, powinieneś być w stanie to osiągnąć. Najpierw zastanów się nad problemem.
Chcesz:
- Teleportować agenta.
- Obrócić agenta, aż znajdzie podstawę drzewa.
- Rozpocząć wspinaczkę i uruchomić kod, który już wykonaliśmy.
Jedyną potencjalną wadą tego planu jest to, że nadal musiałbyś stać bezpośrednio u podstawy drzewa, aby agent zaczął działać we właściwym miejscu. Niskie gałęzie mogą wymagać oczyszczenia. Być może w ramach bonusu dowiesz się, jak naprawić również ten problem, ale najpierw ukończ Wyzwania 1 i 2.
Wyzwanie 1 – Teleportuj agenta i przygotuj kilka rzeczy do Wyzwania 2
- Czy agent może się teleportować w ramach
||player:on chat command "chop"||
?
Potem będziesz potrzebował kilku rzeczy do wykonania Wyzwania 2. Proszę utworzyć następujące elementy:
-
Utwórz zmienną o nazwie
TurnToTree
i ustaw ją natrue
. -
Utwórz pętlę while, która sprawi, że agent będzie skręcał w lewo lub w prawo.
Sprawdź swój kod!
Co się stało? O nie, utknąłeś w kolejnej nieskończonej pętli. TurnToTree
jest true
, więc twoja nowa pętla while po prostu idzie i idzie. Dlatego twój agent po prostu kręci się i kręci.
Przeczytaj poniżej, jak to zatrzymać…
Jeśli zostałeś złapany w nieskończoną pętlę, będziesz musiał zatrzymać swój kod z okna łączenia kodu.
- Kliknij przycisk zatrzymania w lewym dolnym rogu okna połączenia z kodem.
- Restartuj środowisko kodowania. Kliknij przycisk odtwarzania. Jeśli przycisk odtwarzania nie jest włączony, to twój kod nie zostanie uruchomiony w Minecraft.
- Zapisanie kodu ponownie może również zrestartować twój kod, więc zrób to na wszelki wypadek. Zapisz jeszcze raz i powiedz „tak” na komunikat ostrzegawczy.
To dobrze, bo teraz jesteś przygotowany do Wyzwania 2, ale musisz wymyślić sposób na zatrzymanie agenta, gdy zobaczy drzewo.
Wyzwanie 2 – Spraw, aby agent automatycznie stanął przed drzewem
Jesteś teraz gotowy do rozwiązania drugiego zadania.
- Obracaj agenta, aż znajdzie podstawę drzewa.
Aby to zrobić, będziesz musiał ustawić TurnToTree
na false
wewnątrz pętli while, ale potrzebujesz do tego warunku. Chcesz, aby agent zatrzymał się, gdy znajdzie drzewo.
Nie ma bloku znajdowania dla agenta, ale jest blok wykrywania. Może to by się przydało?
Ten blok zwraca true
lub false
, jeśli agent wykryje lub znajdzie blok w kierunku, który mu wskażesz.
Jak mógłbyś przetestować ten warunek, a następnie zatrzymać agenta przed obracaniem się? Musisz ustawić TurnToTree
na false
, ale gdzie i jak?
Doświadczenia
Tutaj nie ma żadnych reguł… Skopiuj kod dla każdego z eksperymentów i zmień go, aby zobaczyć, jakie rezultaty możesz uzyskać. Sugestie są podane, ale rób jak chcesz!
Eksperyment 1 – Zwiększ rozmiar dziury
Agent ciężko dla Ciebie pracuje! Możesz sprawić, aby kopał również dla Ciebie. Wpisz na czacie polecenie dig 4, aby wypróbować ten kod.
Czy możesz sprawić, aby agent kopał i umieszczał coś w tym samym czasie? Czy możesz zwiększyć rozmiar dziury? W tej chwili jest to 2 x 2. Możesz sprawić, by agent wykopał dziurę 4 x 4 i wyłożył ją złotem, gdy będzie schodzić w dół.
Eksperyment 2 – Create a Maze
Ten kod eksperymentu ma na celu skłonienie Cię do zastanowienia się, jak mógłbyś zbudować kod do stworzenia robota tunelującego. Tym razem agent przyjmie dwie liczby. Najpierw będzie kopał w dół, a następnie będzie kopał poziomo.
Wprowadź na czacie polecenie dig 5 4, aby wypróbować ten kod.
Jak mógłbyś skłonić swojego agenta do zbudowania podziemnego labiryntu? Co jeszcze mógłbyś zrobić z tą podziemną dziurą, którą właśnie kopie? Mógłbyś wypełnić ją lawą lub umieścić tam kilka mobów, a nawet zbudować podziemny dom. Jakie inne kawałki kodu mogłyby ci w tym pomóc?
.