Chopping trees for wood is hard work but necessary in Minecraft if you want to craft objects and tools in Survival mode. Mas você pode automatizar esta tarefa através do código com a ajuda do nosso agente! Vamos ensinar ao agente como cortar uma árvore de qualquer altura e voltar para o chão.
Quando você começa um novo projeto MakeCode, muitas vezes é uma boa idéia planejar quais passos você quer dar antes de começar a codificar.
Aqui está o que vai querer fazer:
- Digure a altura da árvore:
- Desde que haja um bloco à frente do agente, continue a subir.
- Diga-me a altura da árvore.
- Repetir o mesmo número de vezes que a árvore é alta:
- Destrua o bloco à sua frente.
- Mover para baixo.
- Colher tudo.
A última actividade usada ||logic:if then else||
Afirmações para verificar as condições e executar as acções da forma que você queria que fossem feitas. Nesta atividade, você usará condicionadores em um laço de ||loops:while||
. O agente continuará subindo enquanto houver um bloco de árvore para subir.
- Faça a atividade
- Faça um projeto
- Criar a variável altura
- Initializar altura a zero
- Inicie na base de uma árvore
- Move a árvore e corte
- Volte para baixo
- Cortar enquanto você solta
- Programa completo
- Desafios
- Desafio 1 – Teleportar Agente e Obter Algumas Coisas Preparadas para o Desafio 2
- Desafio 2 – Faça o agente encarar a árvore automaticamente
- Experimentos
- Experimento 1 – Aumentar o Tamanho do Furo
- Experiment 2 – Create a Maze
Faça a atividade
Faça um projeto
-
Crie um novo projeto MakeCode chamado Chopper.
-
Renomeie o existente
||player:on chat command||
a"tp"
. -
De
||agent:AGENT||
, arraste um bloco||agent:agent teleport to player||
dentro de||player:on chat command "tp"||
. - >
Agora, vamos também criar um comando direcional para que possamos dar a volta ao nosso Agente. Você pode clicar com o botão direito em
||player:on chat command "tp"||
e selecionar Duplicado para fazer uma cópia. -
Renomear o duplicado
"lt"
. -
Eliminar o bloco interno deste novo duplicado e substituir
||agent:agent teleport to player||
por||agent:agent turn 'left'||
.
player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})
Criar a variável altura
-
De
||player:PLAYER||
, arraste um bloco||player:on chat command||
para o espaço de trabalho de codificação e renomeie-o"chop"
. -
Utilizará uma variável para manter o controle da altura da árvore. Na gaveta
||variables:VARIABLES||
Toolbox, clique no botão Make a Variable. -
Nome a nova variável
height
.
Initializar altura a zero
-
De
||variables:VARIABLES||
, arraste para fora||variables:set||
e encaixe-a dentro de||player:on chat command "chop"||
. -
No bloco
||variables:set||
, use o menu suspenso para selecionarheight
como a variável e definirheight
para0
.
let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0})
Inicie na base de uma árvore
Vamos assumir que o agente é colocado de frente para a base da árvore quando o comando chop é dado. Você usa os comandos "tp"
e "lt"
para colocar o seu agente no lugar e depois finalmente "chop"
.
Utiliza um laço ||loops:while||
, que é como um laço ||loops:repeat||
combinado com uma declaração condicional. Aqui o código continuará enquanto houver um bloco em frente ao agente. Se houver um bloco na frente do agente, então ele continuará subindo na árvore.
-
De
||loops:LOOPS||
, arraste um laço||loops:while||
e solte-o sob||variables:set 'height'||
. Isto seria dentro de||player:on chat command "chop"||
. -
De
||agent:AGENT||
, arraste para fora um||agent:agent detect 'block' 'forward'||
e solte-o no||loops:while||
loop substituindo||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)) { }})
Move a árvore e corte
Finalmente, você pode fazer algum corte – ou pelo menos o agente faz!
-
De
||variables:VARIABLES||
, coloque um bloco de||variables:change||
dentro do laço de||loops:while||
. -
O novo bloco deve ler-se
||variables:change 'height' by 1||
. Isto aumentará a variável altura em 1 cada vez que o agente se mover para cima. É assim que podemos acompanhar a altura da árvore. -
Se as folhas ou ramos estiverem acima da cabeça do agente, você precisa destruí-los para mover o agente para cima. A partir de
||agent:AGENT||
, coloque||agent:agent destroy||
abaixo de||variables:change 'height' by 1||
. Você precisará ajustar este bloco selecionandoup
como direção a partir do menu suspenso. -
Finalmente, faça com que o seu agente se mova para cima. Pegue um bloco
||agent:agent move||
, e então use o menu suspenso para selecionarup
como a direção como você fez no passo anterior.
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) }})
Volte para baixo
Depois que o agente alcançar o topo da árvore (não há mais um bloco na frente dela) a altura da árvore será armazenada na altura variável. Então você vai querer outro loop que vai destruir o bloco na frente do agente (o tronco da árvore) à medida que o agente se mover para baixo. Este loop deverá ser executado tantas vezes quanto a altura da árvore.
-
De
||loops:LOOPS||
, arraste um loop de||loops:repeat||
, e solte-o após o loop de||loops:while||
no seu||player:on chat command "chop"||
. -
De
||variables:VARIABLES||
, arraste para foraheight
e substitua o4
no||loops:repeat||
loop.
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++) { }})
Cortar enquanto você solta
Neste ponto o agente deve estar de pé no topo de uma árvore. Você precisa fazer com que ele volte a descer, cortar a árvore e recolher a madeira.
- >
- De
||agent:AGENT||
, coloque um||agent:move||
e||agent:destroy||
dentro do||loops:repeat||
loop.
Agora você precisa ajustar estes blocos para a situação. O agente precisa se mover para baixo e estará cortando cada pedaço da árvore que está na frente dele.
- No bloco
||agent:move||
, selecionedown
como a direção. O agente irá se mover para baixo. Então, o agente deverá destruir o bloco da árvore que está na frente dele. As configurações padrão são ok para||agent:destroy||
.
Finalmente, você quer que seu agente colete toda a madeira que cortou.
- De
||agent:AGENT||
, coloque||agent:agent collect all||
após o laço||loops:repeat||
. Este é agora o último bloco do nosso||player:on chat command||
para"chop"
.
Programa completo
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()})
Programa partilhado: https://makecode.com/_1hFLi6X1qPcJ
Desafios
Seria bom ter o teleporte do agente como parte de ||player:on chat command "chop"||
. É difícil prever em que direção o agente estará voltado depois de você teleportar. Os comandos direcionais (“tp” e “lt”) funcionam, mas um comando seria mais eficiente.
Podemos automatizar isto? Depois de completar estes dois desafios, você deve ser capaz de realizar isto. Primeiro, pense no problema.
Você quer:
- Teleporte o agente.
- Vire o agente até encontrar a base da árvore.
- Begin climbing and run the code we already made.
A única desvantagem potencial deste plano é que você ainda precisaria ficar diretamente na base da árvore para que o agente começasse no lugar certo. Os ramos baixos podem precisar de ser limpos. Talvez como um bônus você possa descobrir como corrigir esse problema também, mas primeiro complete os Desafios 1 e 2.
Desafio 1 – Teleportar Agente e Obter Algumas Coisas Preparadas para o Desafio 2
- Pode você ter o teleporte do agente como parte de
||player:on chat command "chop"||
?
Depois disso você precisará de algumas coisas para realizar o Desafio 2. Por favor, crie o seguinte:
-
Crie uma variável chamada
TurnToTree
e defina esta paratrue
. -
Crie um loop while que faça o agente virar para a esquerda ou direita.
Teste o teu código!
O que aconteceu? Oh não, você está preso em outro loop infinito. TurnToTree
é true
, por isso o teu novo loop continua a andar e a andar. Portanto, seu agente continua girando e girando.
Leia abaixo como parar isto…
Se você estiver preso em um loop infinito, você precisará parar seu código a partir da janela de conexão de código.
- Clique no botão stop no canto inferior esquerdo da sua janela de conexão de código.
- Reinicie o ambiente de codificação. Clique no botão play. Se o botão play não estiver ligado, então seu código não será executado no Minecraft.
- Saving your code again can restart your code as well, so make that for good measure. Poupe mais uma vez e diga sim à mensagem de aviso.
Isso é bom porque agora você está preparado para o Desafio 2, mas você precisa descobrir uma maneira de parar o agente quando ele vir a árvore.
Desafio 2 – Faça o agente encarar a árvore automaticamente
Agora você está pronto para resolver a segunda tarefa.
- Vire o agente até encontrar a base da árvore.
Para fazer isso, você precisará definir TurnToTree
para false
dentro do loop while, mas você precisa de uma condição para isso. Você quer que o agente pare quando encontrar a árvore.
Não há um bloco de localização para o agente, mas há um bloco de detecção. Talvez isto possa ser útil?
Este bloco retorna true
ou false
se o agente detecta ou encontra um bloco na direção que você diz.
Como você poderia testar esta condição e depois impedir que o agente gire? Você precisa definir TurnToTree
para false
, mas onde e como?
Experimentos
Aqui, não há regras… Copie o código para cada experimento e mude as coisas ao redor para ver que tipo de resultados você pode criar. As sugestões são dadas, mas faça o que quiser!
Experimento 1 – Aumentar o Tamanho do Furo
O agente trabalha duro para você! Você pode conseguir que ele cava para você também. Digite o comando no chat cavar 4 para experimentar este código.
Pode fazer o agente cavar e colocar algo ao mesmo tempo? Você pode aumentar o tamanho do buraco? Agora mesmo, são 2 x 2. Você pode fazer o agente cavar um buraco de 4 x 4 e alinhá-lo com ouro à medida que ele vai descendo.
Experiment 2 – Create a Maze
Este código de experimento tem como objetivo fazer você pensar sobre como você pode construir algum código para criar um robô escavador de túneis. O agente vai aceitar dois números desta vez. Primeiro, ele cavará para baixo e depois cavará horizontalmente.
Entrar o comando on chat cavar 5 4 para experimentar este código.
Como você poderia fazer o seu agente construir um labirinto subterrâneo? O que mais você poderia fazer com este buraco subterrâneo que ele está cavando? Você poderia enchê-lo com lava ou colocar algumas mobs lá embaixo ou até mesmo construir uma casa subterrânea. Que outras peças de código poderiam ajudá-lo a fazer isso?