Poder Atractor de Meteoritos
Conocimientos necesarios
Comandos básicos de la API de Minecraft
- Comandos iniciales
- mc.player.getTilePos()
- mc.getBlock(), mc.setBlock()
Conceptos teóricos de programación
- Librería
- Variable
- Variable tipo contador
- Bucle while
- Instrucción condicional if
Vídeos
Vídeo-demo
Vídeo-tutorial
Objetivo
Introducción a un nuevo tipo de dato: los conjuntos.
Definiremos los conjuntos como una colección no ordenada y sin elementos repetidos. Los usos básicos de éstos incluyen verificación de pertenencia y eliminación de entradas duplicadas.
En nuestro ejemplo, veremos cómo almacenar dentro de un conjunto un cierto número de identificadores de bloques de Minecraft. Serán los identificadores correspondientes a bloques “blandos”. Algunos ejemplos de estos son: aire, agua, lava, hierba, hojas, flores …
Llamaremos “blandos” a aquellos bloques que puedan ser atravesados por los meteoritos.
Código final
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import mcpi.minecraft as minecraft mc = minecraft.Minecraft.create() import time while True: x, y, z = mc.player.getTilePos() b = mc.getBlock(x, y-1, z) listaBloquesEspeciales = [0, 6, 8, 9, 10, 11, 18, 30, 31, 32, 37, 38, 39, 40, 81, 83] if b != 0: c = 255 while mc.getBlock(x, c-1, z) in listaBloquesEspeciales: time.sleep(0.02) # Control velocidad meteorito mc.setBlock(x,c,z,0) # 0 = aire c = c-1 mc.setBlock(x,c,z,152) # 152 = bloque de redstone mc.setBlock(x,c-1,z,46) # 46 = dinamita |
Desarrollo de la actividad
Explicación y visualización de vídeo demo
Con ayuda del vídeo demostrativo realizaremos una explicación de lo que queremos realizar.
Planificación de la actividad
Buscaremos aquellas cosas que necesitemos:- Id de bloques
- Instrucciones de Python que pensamos necesitar
- Bloque más alto de Minecraft
- …
Metodología
De lo más particular a lo más general- Caída de un bloque (meteorito) hasta los pies del jugador
- Rutina para hacer explotar el meteorito
- Repetición mediante bucle de juego
- Pausar la caída de meteoritos mientras el jugador esté volando
- Evitar que los meteoritos caigan sobre hierba, flores, agua, árboles …
Discusión en grupo sobre propuestas de variantes y mejoras
Al terminar el ejercicio es seguro que los alumnos ya habrán realizado diversas propuestas de mejora y ampliación del script de Python. Podremos terminar la actividad ordenando las diferentes propuestas y llevando a cabo algunas de ellas.
Desarrollo del código paso a paso
Paso 1
Para empezar estudiaremos los pasos a seguir para lograr que un bloque de Redstone caiga desde lo más alto del cielo hasta nuestros pies. Veremos cómo controlar la velocidad de la roca mediante la librería time.
1 2 3 4 5 6 7 8 9 10 | import mcpi.minecraft as minecraft mc = minecraft.Minecraft.create() import time x, y, z = mc.player.getTilePos() c = 255 while c != y: time.sleep(0.02) # Control velocidad meteorito mc.setBlock(x,c,z,0) # 0 = aire c = c-1 mc.setBlock(x,c,z,152) # 152 = bloque de redstone |
Paso 2
Veremos cómo hacer para que el bloque de Redstone explote. Utilizaremos un bloque de dinamita que permanecerá oculto debajo del meteorito una vez haya caído al suelo.
1 2 3 4 5 6 7 8 9 10 11 | import mcpi.minecraft as minecraft mc = minecraft.Minecraft.create() import time x, y, z = mc.player.getTilePos() c = 255 while c != y: time.sleep(0.02) # Control velocidad meteorito mc.setBlock(x,c,z,0) # 0 = aire c = c-1 mc.setBlock(x,c,z,152) # 152 = bloque de redstone mc.setBlock(x,c-1,z,46) # 46 = dinamita |
Paso 3
Crearemos un bucle de juego para que la caída de meteoritos sea constante.
1 2 3 4 5 6 7 8 9 10 11 12 | import mcpi.minecraft as minecraft mc = minecraft.Minecraft.create() import time while True: x, y, z = mc.player.getTilePos() c = 255 while c != y: time.sleep(0.02) # Control velocidad meteorito mc.setBlock(x,c,z,0) # 0 = aire c = c-1 mc.setBlock(x,c,z,152) # 152 = bloque de redstone mc.setBlock(x,c-1,z,46) # 46 = dinamita |
Paso 4
En este paso añadiremos una condición para que la caída de meteoritos se detenga cuando el jugador esté volando. Esto lo hacemos para evitar que un meteorito quede suspendido en el aire. Además evitaremos que se desvele el “truco” de colocar un bloque de dinamita debajo del meteorito.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import mcpi.minecraft as minecraft mc = minecraft.Minecraft.create() import time while True: x, y, z = mc.player.getTilePos() b = mc.getBlock(x, y-1, z) if b != 0: c = 255 while c != y: time.sleep(0.02) # Control velocidad meteorito mc.setBlock(x,c,z,0) # 0 = aire c = c-1 mc.setBlock(x,c,z,152) # 152 = bloque de redstone mc.setBlock(x,c-1,z,46) # 46 = dinamita |
Paso 5
En este paso alcanzamos el objetivo de la actividad: la introducción a los tipos de datos de conjuntos. Tras definir el concepto de los conjuntos crearemos uno que almacene los id de los bloques “blandos” de Minecraft (hierba, hojas, agua, …). Con esto lograremos que el meteorito pueda atravesar dichos materiales hasta tocar el suelo sólido. De este modo podremos evitar que el meteorito quede suspendido en lo alto de un árbol o flotando sobre el agua. Esta instrucción permite crear el conjunto necesario:
listaBloquesEspeciales = [0, 6, 8, 9, 10, 11, 18, 30, 31, 32, 37, 38, 39, 40, 81, 83]
Durante la caída del meteorito iremos comprobando si este se encuentra dentro del conjunto de los bloques blandos. Si es así, haremos que el meteorito prosiga su caída. La siguiente instrucción permite realizar esta comprobación:
while mc.getBlock(x, c-1, z) in listaBloquesEspeciales:
Ahora, el meteorito no se detiene en los pies del jugador sino que lo hace al llegar al primer bloque sólido (o no blando). Esto tiene un efecto añadido interesante cuando el jugador esté en una cueva o mina, el meteorito no atravesará el techo de esta. El personaje podrá escuchar como toda una serie de meteoritos van impactando sobre su cabeza hasta llegar a perforar todo el techo de la cavidad.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import mcpi.minecraft as minecraft mc = minecraft.Minecraft.create() import time while True: x, y, z = mc.player.getTilePos() b = mc.getBlock(x, y-1, z) listaBloquesEspeciales = [0, 6, 8, 9, 10, 11, 18, 30, 31, 32, 37, 38, 39, 40, 81, 83] if b != 0: c = 255 while mc.getBlock(x, c-1, z) in listaBloquesEspeciales: time.sleep(0.02) # Control velocidad meteorito mc.setBlock(x,c,z,0) # 0 = aire c = c-1 mc.setBlock(x,c,z,152) # 152 = bloque de redstone mc.setBlock(x,c-1,z,46) # 46 = dinamita |