Aktywność: Agent Rębak do drzew

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ć:

  1. Zorientuj się, jak wysokie jest drzewo:
    • Dopóki przed agentem znajduje się blok, przesuwaj się w górę.
    • Zapamiętaj, jak wysokie jest drzewo.
  2. Powtarzaj poniższe czynności tyle razy, ile drzewo jest wysokie:
    • Zniszcz blok przed sobą.
    • Przesuń się w dół.
  3. 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

  1. Utwórz nowy projekt MakeCode o nazwie Chopper.

  2. Zmień nazwę istniejącego ||player:on chat command|| na "tp".

  3. Z ||agent:AGENT|| przeciągnij blok ||agent:agent teleport to player|| wewnątrz ||player:on chat command "tp"||.

  4. 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ę.

  5. Nadaj duplikatowi nazwę "lt".

  6. 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

  1. Z ||player:PLAYER|| przeciągnij blok ||player:on chat command|| do obszaru roboczego kodowania i zmień jego nazwę na "chop".

  2. Użyjesz zmiennej do śledzenia wysokości drzewa. W szufladzie ||variables:VARIABLES|| Toolbox kliknij przycisk Make a Variable.

  3. Nadaj nowej zmiennej nazwę height.

Make a new variable named 'height'

Initialize height to zero

  1. From ||variables:VARIABLES||, drag out ||variables:set|| and snap it inside ||player:on chat command "chop"||.

  2. W bloku ||variables:set|| za pomocą menu rozwijanego wybierz height jako zmienną i ustaw height na 0.

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.

  1. 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"||.

  2. 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!

  1. Z ||variables:VARIABLES|| umieść blok ||variables:change|| wewnątrz pętli ||loops:while||.

  2. 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.

  3. 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ąc up jako kierunek z menu rozwijanego.

  4. 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.

  1. Z ||loops:LOOPS|| przeciągnij pętlę ||loops:repeat|| i upuść ją po pętli ||loops:while|| w swoim ||player:on chat command "chop"||.

  2. Z ||variables:VARIABLES|| przeciągnij height i zastąp 4 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.

  1. 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.

  1. W bloku ||agent:move|| wybierz down 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ł.

  1. 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

Agent - Tree Chop Start Prep

Agent - Tree Chop Start Correct Facing

Agent - Tree Chop Finish

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:

  1. Teleportować agenta.
  2. Obrócić agenta, aż znajdzie podstawę drzewa.
  3. 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

  1. 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:

  1. Utwórz zmienną o nazwie TurnToTree i ustaw ją na true.

  2. 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.

Zatrzymaj kod

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.

  1. Kliknij przycisk zatrzymania w lewym dolnym rogu okna połączenia z kodem.

Zatrzymaj kod

  1. Restartuj środowisko kodowania. Kliknij przycisk odtwarzania. Jeśli przycisk odtwarzania nie jest włączony, to twój kod nie zostanie uruchomiony w Minecraft.

Play

  1. 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.

Zapisz

Zapisz Potwierdź

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.

  1. 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?

Zapisz Potwierdź

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ół.

Agent - Dig 4

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?

Agent kopie w dół i w poziomie

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.