Tagliare gli alberi per il legno è un lavoro duro ma necessario in Minecraft se vuoi creare oggetti e strumenti in modalità Survival. Ma è possibile automatizzare questo lavoro attraverso il codice con l’aiuto del nostro agente! Insegniamo all’agente come abbattere un albero di qualsiasi altezza e tornare a terra.
Quando si inizia un nuovo progetto MakeCode, è spesso una buona idea pianificare i passi che si vogliono fare prima di iniziare a codificare.
Ecco cosa vorrai fare:
- Capire quanto è alto l’albero:
- Finché c’è un blocco davanti all’agente, continua a salire.
- Tenere traccia di quanto è alto l’albero.
- Ripetere quanto segue lo stesso numero di volte che l’albero è alto:
- Distruggere il blocco davanti a voi.
- Spostati verso il basso.
- Raccogli tutto.
L’ultima attività ha usato le istruzioni ||logic:if then else||
per controllare le condizioni ed eseguire le azioni come volevi tu. In questa attività, userete i condizionali in un ciclo ||loops:while||
. L’agente continuerà a muoversi verso l’alto finché ci sarà un blocco di albero da scalare.
- Fai l’attività
- Fai un progetto
- Crea la variabile altezza
- Inizializza height a zero
- Inizia alla base di un albero
- Salire sull’albero e tagliare
- Torna giù
- Schiaccia mentre lasci cadere
- Completa il programma
- Challenges
- Sfida 1 – Teletrasporto agente e prepara alcune cose per la Sfida 2
- Sfida 2 – Fare in modo che l’agente affronti l’albero automaticamente
- Esperimenti
- Esperimento 1 – Aumenta la dimensione del buco
- Esperimento 2 – Creare un labirinto
Fai l’attività
Fai un progetto
-
Crea un nuovo progetto MakeCode chiamato Chopper.
-
Rinomina il
||player:on chat command||
esistente a"tp"
. -
Da
||agent:AGENT||
, trascina un blocco||agent:agent teleport to player||
dentro||player:on chat command "tp"||
. -
Ora, creiamo anche un comando direzionale così possiamo girare il nostro Agent. Puoi cliccare con il tasto destro del mouse su
||player:on chat command "tp"||
e selezionare Duplica per fare una copia. -
Rinomina il duplicato
"lt"
. -
Cancella il blocco interno per questo nuovo duplicato e sostituisci
||agent:agent teleport to player||
con||agent:agent turn 'left'||
.
player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})
Crea la variabile altezza
-
Da
||player:PLAYER||
, trascina un blocco||player:on chat command||
nell’area di lavoro di codifica e rinominalo"chop"
. -
Si userà una variabile per tenere traccia dell’altezza dell’albero. Nel cassetto
||variables:VARIABLES||
degli strumenti, clicca sul pulsante Crea una variabile. -
Nomina la nuova variabile
height
.
Inizializza height a zero
-
Da
||variables:VARIABLES||
, trascina fuori||variables:set||
e inseriscila dentro||player:on chat command "chop"||
. -
Nel blocco
||variables:set||
, usa il menu a tendina per selezionareheight
come variabile e impostaheight
a0
.
let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0})
Inizia alla base di un albero
Prevediamo che l’agente sia posizionato di fronte alla base dell’albero quando viene dato il comando chop. Si usano i comandi "tp"
e "lt"
per mettere l’agente in posizione e poi finalmente "chop"
.
Utilizzate un ciclo ||loops:while||
, che è come un ciclo ||loops:repeat||
combinato con una dichiarazione condizionale. Qui il codice continuerà finché ci sarà un blocco davanti all’agente. Se c’è un blocco davanti all’agente, allora continuerà a risalire l’albero.
-
Da
||loops:LOOPS||
, trascinate fuori un ciclo||loops:while||
e lasciatelo sotto||variables:set 'height'||
. Questo sarebbe all’interno di||player:on chat command "chop"||
. -
Da
||agent:AGENT||
, trascina fuori||agent:agent detect 'block' 'forward'||
e rilascialo nel ciclo||loops:while||
sostituendo||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)) { }})
Salire sull’albero e tagliare
Finalmente, si arriva a fare qualche taglio – o almeno lo fa l’agente!
-
Da
||variables:VARIABLES||
, mettere un blocco||variables:change||
dentro il ciclo||loops:while||
. -
Il nuovo blocco dovrebbe leggere
||variables:change 'height' by 1||
. Questo aumenterà la variabile altezza di 1 ogni volta che l’agente si muove verso l’alto. Questo è il modo in cui possiamo tenere traccia dell’altezza dell’albero. -
Se le foglie o i rami sono sopra la testa dell’agente, è necessario distruggerli per spostare l’agente in alto. Da
||agent:AGENT||
, mettete||agent:agent destroy||
sotto||variables:change 'height' by 1||
. Dovrai regolare questo blocco selezionandoup
come direzione dal menu a tendina. -
Finalmente, fai salire il tuo agente. Prendi un blocco
||agent:agent move||
, e poi usa il menu a tendina per selezionareup
come direzione come hai fatto nel passo precedente.
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) }})
Torna giù
Dopo che l’agente raggiunge la cima dell’albero (non c’è più un blocco davanti a lui) l’altezza dell’albero sarà memorizzata nella variabile altezza. Poi vorrete un altro ciclo che distruggerà il blocco davanti all’agente (il tronco dell’albero) man mano che l’agente scende. Questo ciclo dovrebbe essere eseguito tante volte quanto l’altezza dell’albero.
-
Da
||loops:LOOPS||
, trascinate fuori un ciclo||loops:repeat||
e lasciatelo dopo il ciclo||loops:while||
nel vostro||player:on chat command "chop"||
. -
Da
||variables:VARIABLES||
, trascina fuoriheight
e sostituisci il4
nel ciclo||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++) { }})
Schiaccia mentre lasci cadere
A questo punto l’agente dovrebbe essere in piedi in cima ad un albero. Devi fare in modo che scenda, tagli l’albero e raccolga la legna.
- Da
||agent:AGENT||
, metti un||agent:move||
e||agent:destroy||
dentro il ciclo||loops:repeat||
.
Ora devi adattare questi blocchi alla situazione. L’agente ha bisogno di muoversi verso il basso e taglierà ogni pezzo dell’albero che si trova davanti a lui.
- Nel blocco
||agent:move||
, selezionatedown
come direzione. L’agente si muoverà verso il basso. Poi, l’agente dovrebbe distruggere il blocco dell’albero davanti a sé. Le impostazioni di default vanno bene per||agent:destroy||
.
Finalmente, vuoi che il tuo agente raccolga tutta la legna che ha tagliato.
- Da
||agent:AGENT||
, metti||agent:agent collect all||
dopo il ciclo||loops:repeat||
. Questo è ora l’ultimo blocco nel nostro||player:on chat command||
per"chop"
.
Completa il 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()})
Programma condiviso: https://makecode.com/_1hFLi6X1qPcJ
Challenges
Sarebbe bello avere il teletrasporto dell’agente come parte di ||player:on chat command "chop"||
. È difficile prevedere in quale direzione sarà rivolto l’agente dopo averlo teletrasportato. I comandi direzionali (“tp” e “lt”) funzionano, ma un solo comando sarebbe più efficiente.
Si può automatizzare? Dopo aver completato queste due sfide, dovreste essere in grado di farlo. Per prima cosa, pensa al problema.
Vuoi:
- Teletrasportare l’agente.
- Tornare l’agente finché non trova la base dell’albero.
- Iniziare la scalata ed eseguire il codice che abbiamo già fatto.
L’unico potenziale svantaggio di questo piano è che dovresti ancora stare direttamente alla base dell’albero affinché l’agente inizi nel posto giusto. Potrebbe essere necessario eliminare i rami bassi. Forse come bonus potresti capire come risolvere anche questo problema, ma prima completa le Sfide 1 e 2.
Sfida 1 – Teletrasporto agente e prepara alcune cose per la Sfida 2
- Puoi far teletrasportare l’agente come parte di
||player:on chat command "chop"||
?
Dopo di che avrai bisogno di alcune cose per realizzare la Sfida 2. Crea quanto segue:
-
Crea una variabile chiamata
TurnToTree
e impostala atrue
. -
Crea un ciclo while che faccia girare l’agente a sinistra o a destra.
Testate il vostro codice!
Che cosa è successo? Oh no, sei bloccato in un altro ciclo infinito. TurnToTree
è true
, quindi il vostro nuovo ciclo while continua ad andare e andare. Pertanto, il tuo agente continua a girare e girare.
Leggi qui sotto come fermare questo…
Se sei bloccato in un loop infinito, dovrai fermare il tuo codice dalla finestra di connessione del codice.
- Clicca il pulsante stop nell’angolo in basso a sinistra della tua finestra di connessione al codice.
- Riavvia l’ambiente di codifica. Clicca sul pulsante play. Se il pulsante play non è acceso, allora il tuo codice non verrà eseguito in Minecraft.
- Salvare nuovamente il tuo codice può riavviare anche il tuo codice, quindi fallo per buona misura. Salvate ancora una volta e rispondete al messaggio di avvertimento.
Questo va bene perché ora sei preparato per la sfida 2, ma devi trovare un modo per fermare l’agente quando vede l’albero.
Sfida 2 – Fare in modo che l’agente affronti l’albero automaticamente
Sei ora pronto a risolvere il secondo compito.
- Ruota l’agente finché non trova la base dell’albero.
Per fare questo, dovrai impostare TurnToTree
a false
dentro il ciclo while, ma ti serve una condizione per questo. Vuoi che l’agente si fermi quando trova l’albero.
Non c’è un blocco di ricerca per l’agente, ma c’è un blocco di rilevamento. Forse questo potrebbe essere utile?
>
Questo blocco restituisce true
o false
se l’agente rileva o trova un blocco nella direzione che gli dici.
Come potresti testare questa condizione e poi fermare l’agente dal girare? Devi impostare TurnToTree
su false
, ma dove e come?
Esperimenti
Qui non ci sono regole… Copia il codice di ogni esperimento e cambia le cose per vedere che tipo di risultati puoi creare. I suggerimenti sono dati, ma fai come vuoi!
Esperimento 1 – Aumenta la dimensione del buco
L’agente lavora duro per te! Puoi fargli scavare anche per te. Inserisci il comando in chat dig 4 per provare questo codice.
Puoi fare in modo che l’agente scavi e metta qualcosa allo stesso tempo? Puoi aumentare la dimensione del buco? In questo momento è 2 x 2. Potresti fare in modo che l’agente scavi un buco 4 x 4 e lo rivesta d’oro man mano che scende.
Esperimento 2 – Creare un labirinto
Questo codice di esperimento ha lo scopo di farti pensare a come potresti costruire del codice per creare un robot scavatore di tunnel. Questa volta l’agente accetta due numeri. Prima scava verso il basso e poi scava orizzontalmente.
Inserisci il comando in chat dig 5 4 per provare questo codice.
Come potresti far costruire al tuo agente un labirinto sotterraneo? Cos’altro potresti fare con questo buco sotterraneo che sta scavando? Potresti riempirlo di lava o metterci dei mob o anche costruire una casa sotterranea. Quali altri pezzi di codice potrebbero aiutarti a fare questo?