Cortar árboles para obtener madera es un trabajo duro pero necesario en Minecraft si quieres elaborar objetos y herramientas en el modo Supervivencia. ¡Pero puedes automatizar esta tarea mediante código con la ayuda de nuestro agente! Vamos a enseñarle al agente cómo cortar un árbol de cualquier altura y volver a bajar al suelo.
Cuando empiezas un nuevo proyecto de MakeCode, a menudo es una buena idea planificar los pasos que quieres dar antes de empezar a codificar.
Esto es lo que querrá hacer:
- Averiguar la altura del árbol:
- Mientras haya un bloque delante del agente, siga subiendo.
- Mantén la cuenta de lo alto que es el árbol.
- Repite lo siguiente el mismo número de veces que el árbol es alto:
- Destruye el bloque que tienes delante.
- Muévete hacia abajo.
- Recoge todo.
La última actividad utilizó las sentencias ||logic:if then else||
para comprobar las condiciones y realizar las acciones de la forma que querías. En esta actividad, utilizarás condicionales en un bucle ||loops:while||
. El agente continuará subiendo mientras haya un bloque de árbol al que subir.
- Haz la actividad
- Haz un proyecto
- Crea la variable de altura
- Inicialice la altura a cero
- Empezar en la base de un árbol
- Sube al árbol y corta
- Vuelve a bajar
- Corta mientras sueltas
- Programa completo
- Desafíos
- Desafío 1 – Agente de teletransporte y obtener algunas cosas preparadas para el Desafío 2
- Desafío 2 – Haz que el agente se enfrente al árbol automáticamente
- Experimentos
- Experimento 1 – Aumenta el tamaño del agujero
- Experimento 2 – Crea un laberinto
Haz la actividad
Haz un proyecto
-
Crea un nuevo proyecto MakeCode llamado Chopper.
-
Renumera el existente
||player:on chat command||
a"tp"
. -
Desde
||agent:AGENT||
, arrastra un bloque||agent:agent teleport to player||
dentro de||player:on chat command "tp"||
. -
Ahora, vamos a crear también un comando direccional para poder girar nuestro Agente. Puede hacer clic con el botón derecho del ratón en
||player:on chat command "tp"||
y seleccionar Duplicar para hacer una copia. -
Nombre el duplicado
"lt"
. -
Borra el bloque interior de este nuevo duplicado y sustituye
||agent:agent teleport to player||
por||agent:agent turn 'left'||
.
player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})
Crea la variable de altura
-
Desde
||player:PLAYER||
, arrastra un bloque||player:on chat command||
al Espacio de Trabajo de codificación y renómbralo"chop"
. -
Utilizarás una variable para controlar la altura del árbol. En el cajón de la caja de herramientas
||variables:VARIABLES||
, haga clic en el botón Hacer una variable. -
Nombre la nueva variable
height
.
Inicialice la altura a cero
-
Desde
||variables:VARIABLES||
, arrastre||variables:set||
y encájelo dentro de||player:on chat command "chop"||
. -
En el bloque
||variables:set||
, utiliza el menú desplegable para seleccionarheight
como variable y estableceheight
en0
.
let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0})
Empezar en la base de un árbol
Supongamos que el agente se coloca de cara a la base del árbol cuando se da la orden de cortar. Se utilizan los comandos "tp"
y "lt"
para que el agente se coloque en su sitio y finalmente "chop"
.
Usa un bucle ||loops:while||
, que es como un bucle ||loops:repeat||
combinado con una declaración condicional. Aquí el código continuará mientras haya un bloque delante del agente. Si hay un bloque delante del agente, entonces seguirá moviéndose hacia arriba en el árbol.
-
Desde
||loops:LOOPS||
, arrastra un bucle||loops:while||
y suéltalo debajo de||variables:set 'height'||
. Esto sería dentro de||player:on chat command "chop"||
. -
Desde
||agent:AGENT||
, arrastra||agent:agent detect 'block' 'forward'||
y suéltalo en el bucle||loops:while||
sustituyendo a||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)) { }})
Sube al árbol y corta
Por fin puedes cortar, o al menos el agente lo hace
-
Desde
||variables:VARIABLES||
, coloca un bloque||variables:change||
dentro del bucle||loops:while||
. -
El nuevo bloque debe ser
||variables:change 'height' by 1||
. Esto incrementará la variable de altura en 1 cada vez que el agente se mueva hacia arriba. Así podremos llevar la cuenta de la altura del árbol. -
Si las hojas o las ramas están por encima de la cabeza del agente, hay que destruirlas para que el agente suba. Desde
||agent:AGENT||
, coloca||agent:agent destroy||
debajo de||variables:change 'height' by 1||
. Tendrás que ajustar este bloque seleccionandoup
como dirección en el menú desplegable. -
Por último, haz que tu agente suba. Coge un bloque
||agent:agent move||
, y luego utiliza el menú desplegable para seleccionarup
como dirección como hiciste en el paso 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) }})
Vuelve a bajar
Después de que el agente llegue a la cima del árbol (ya no hay un bloque delante de él) la altura del árbol se almacenará en la variable height. Entonces querrá otro bucle que destruirá el bloque que está delante del agente (el tronco del árbol) a medida que el agente se mueve hacia abajo. Este bucle debe ejecutarse tantas veces como la altura del árbol.
-
Desde
||loops:LOOPS||
, arrastra un bucle||loops:repeat||
, y suéltalo después del bucle||loops:while||
en tu||player:on chat command "chop"||
. -
Desde
||variables:VARIABLES||
, arrastraheight
y sustituye el4
en el bucle||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++) { }})
Corta mientras sueltas
En este punto el agente debería estar en la cima de un árbol. Tienes que conseguir que vuelva a bajar, cortar el árbol y recoger la madera.
- Desde
||agent:AGENT||
, coloca un||agent:move||
y un||agent:destroy||
dentro del bucle||loops:repeat||
.
Ahora tienes que ajustar estos bloques para la situación. El agente necesita moverse hacia abajo e irá cortando cada trozo de árbol que tenga delante.
- En el bloque
||agent:move||
, seleccionadown
como dirección. El agente se moverá hacia abajo. Entonces, el agente debería destruir el bloque de árbol que está delante de él. La configuración por defecto está bien para||agent:destroy||
.
Por último, quieres que tu agente recoja toda la madera que cortó.
- Desde
||agent:AGENT||
, coloca||agent:agent collect all||
después del bucle||loops:repeat||
. Este es ahora el último bloque de nuestro||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 compartido: https://makecode.com/_1hFLi6X1qPcJ
Desafíos
Estaría bien que el agente se teletransportara como parte de ||player:on chat command "chop"||
. Es difícil predecir en qué dirección estará el agente después de teletransportarlo. Los comandos direccionales («tp» y «lt») funcionan, pero un solo comando sería más eficiente.
¿Podemos automatizar esto? Después de completar estos dos retos, deberías ser capaz de lograrlo. Primero, piensa en el problema.
Quieres:
- Teleportar al agente.
- Girar el agente hasta que encuentre la base del árbol.
- Empezar a escalar y ejecutar el código que ya hemos hecho.
El único inconveniente potencial de este plan es que todavía necesitarías estar directamente en la base del árbol para que el agente empiece en el lugar correcto. Puede que haya que despejar las ramas bajas. Tal vez como un bono que podría averiguar cómo solucionar este problema también, pero primero completar Desafíos 1 y 2.
Desafío 1 – Agente de teletransporte y obtener algunas cosas preparadas para el Desafío 2
- ¿Puede tener el agente de teletransporte como parte de
||player:on chat command "chop"||
?
Después de que usted necesitará algunas cosas para lograr el Desafío 2. Por favor, crea lo siguiente:
-
Crea una variable llamada
TurnToTree
y ponla atrue
. -
Crea un bucle while que haga que el agente gire a la izquierda o a la derecha.
¡Prueba tu código!
¿Qué ha pasado? Oh no, estás atrapado en otro bucle infinito. TurnToTree
es true
, así que tu nuevo bucle while sigue y sigue. Por lo tanto, su agente sigue girando y girando.
Lea a continuación cómo detener esto…
Si está atrapado en un bucle infinito, tendrá que detener su código desde la ventana de conexión de código.
- Haga clic en el botón de parada en la esquina inferior izquierda de su ventana de conexión de código.
- Reinicie el entorno de codificación. Haga clic en el botón de reproducción. Si el botón de reproducción no está encendido, entonces tu código no se ejecutará en Minecraft.
- Guardar tu código de nuevo puede reiniciar tu código también, así que hazlo por si acaso. Guarda una vez más y di que sí al mensaje de advertencia.
Esto está bien porque ahora estás preparado para el Desafío 2, pero tienes que encontrar una manera de detener al agente cuando vea el árbol.
Desafío 2 – Haz que el agente se enfrente al árbol automáticamente
Ahora estás preparado para resolver la segunda tarea.
- Gira el agente hasta que encuentre la base del árbol.
Para ello, tendrás que poner TurnToTree
a false
dentro del bucle while, pero necesitas una condición para ello. Quieres que el agente se detenga cuando encuentre el árbol.
No hay bloque de búsqueda para el agente, pero sí hay un bloque de detección. ¿Quizás esto podría ser útil?
Este bloque devuelve true
o false
si el agente detecta o encuentra un bloque en la dirección que le indiques.
¿Cómo podrías probar esta condición y luego evitar que el agente gire? Tienes que poner TurnToTree
en false
, pero ¿dónde y cómo?
Experimentos
Aquí no hay reglas… Copia el código de cada experimento y cambia cosas para ver qué tipo de resultados puedes crear. Se dan sugerencias, ¡pero haz lo que quieras!
Experimento 1 – Aumenta el tamaño del agujero
¡El agente trabaja duro para ti! También puedes hacer que cave por ti. Introduce el comando on chat dig 4 para probar este código.
¿Puedes hacer que el agente cave y coloque algo al mismo tiempo? ¿Puedes aumentar el tamaño del agujero? Ahora mismo es de 2 x 2. Podrías hacer que el agente cavara un agujero de 4 x 4 y lo forrara de oro a medida que va bajando.
Experimento 2 – Crea un laberinto
Este código de experimento tiene como objetivo que pienses en cómo podrías construir un código para crear un robot tunelador. El agente aceptará esta vez dos números. Primero, cava hacia abajo y luego cavará horizontalmente.
Ingresa el comando on chat dig 5 4 para probar este código.
¿Cómo podrías hacer que tu agente construyera un laberinto subterráneo? ¿Qué más podrías hacer con este agujero subterráneo que está cavando? Podrías llenarlo de lava o poner algunos mobs ahí abajo o incluso construir una casa subterránea. ¿Qué otras piezas de código podrían ayudarte a hacer esto?