Raspberry Pi + Python + Minecraft = Entretenimiento asegurado

Raspberry Pi + Python + Minecraft = Entretenimiento asegurado

minecraftEntretenimiento y  conocimiento asegurados, sería el título adecuado , pero es que quedaba demasiado largo ;-).

El caso es que durante los últimos meses, en el marco del proyecto educativo guadatech, hemos estado usando la versión simple del Minecraft, que se puede instalar en la Raspberry Pi,  para  enseñar a los chavales a dar sus primeros pasos en  la programación con Python y los resultados, que mostraremos en este artículo no pueden haber sido más esperanzadores.

Desde que la gente de Mojang tuvo a bien liberar una versión simple del programa junto con una pequeña API en Python para poder "hackearlo" han sido muchos los programadores, de todos los niveles, los que se  han sentido atraídos por esta combinación de juego y tecleo.

 [youtube http://www.youtube.com/watch?v=YsXumCkcxLw&w=560&h=315]

Como en casi todo lo referente a la Raspberry Pi nos hemos aprovechado de la gran comunidad de entusiastas que hay por  detrás escribiendo código y tutoriales.

En el caso de Minecraft en la Rasp tenemos varias fuentes destacables. La primera sería la página de Martin  O'Hanlon (http://www.stuffaboutcode.com/p/minecraft.html )  en la que el autor hace un esfuerzo , yo diría que fanático, por ampliar la API básica , añadiéndole no solo funcionalidades para dibujar figuras geométricas más o menos simples , sino que ha ido más allá llegando a renderizar ciudades enteras.

La otra gran fuente que hemos utilizado ha sido el borrador del libro de @craigargh  que constituye un primer intento de estandarizar la enseñanza de la programación con estas herramientas y el apoyo de codecademy.

Pertrechados con estos aperos empezamos a hacer nuestros pinitos escribiendo programas sencillos como el siguiente en el que los chavales aprendieron el manejo de las funciones haciendo un programa que crea un bosque delante del jugador cuando se ejecuta.

#Este programa hace un bosque basado en un solo arbol usando la variable setBlock

import mcpi.minecraft as minecraft
#connect to Remote Minecraft
mc = minecraft.Minecraft.create()

def growTree(x,y,z):
    #esta funcion hace crecer un arbol en las cordenadas x,y,z  y si esas cordenadas son aire no lo crea 
    follaje =  18
    tronco = 17

    tipoBloqueBase = mc.getBlock (x,y-1,z)
    #Va disminuyendo la cordenada "y" hasta encontrar algo distinto del agua o el  aire
    while tipoBloqueBase == 0 or tipoBloqueBase == 8 or tipoBloqueBase == 9 :
        y = y-1
        tipoBloqueBase = mc.getBlock (x,y-1,z)

    mc.setBlock(x,y,z,tronco)
    mc.setBlock(x,y+1,z,tronco)
    mc.setBlock(x,y+2,z,tronco)
    mc.setBlock(x,y+3,z,tronco) 
    mc.setBlock(x,y+4,z,follaje)
    mc.setBlock(x+1,y+4,z+1,follaje)
    mc.setBlock(x-1,y+4,z-1,follaje)
    mc.setBlock(x+1,y+4,z-1,follaje)
    mc.setBlock(x-1,y+4,z+1,follaje)
    mc.setBlock(x,y+5,z,follaje)
    mc.setBlock(x-1,y+5,z,follaje)
    mc.setBlock(x+1,y+5,z,follaje) 
    mc.setBlock(x,y+5,z,follaje) 
    mc.setBlock(x,y+6,z,follaje)    
    mc.setBlock(x-1,y+3,z,follaje)
    mc.setBlock(x-2,y+3,z,follaje)
    mc.setBlock(x+1,y+3,z,follaje)
    mc.setBlock(x+2,y+3,z,follaje)          
    mc.setBlock(x,y+3,z+1,follaje)  
    mc.setBlock(x,y+3,z-1,follaje)  
    mc.setBlock(x,y+3,z+2,follaje)
    mc.setBlock(x,y+3,z-2,follaje)

def bosque(x,y,z):
    #Crea un bosque haciendo crecer 5 arboles 
    growTree(x,y,z)
    growTree(x+5,y,z)
    growTree(x+10,y,z)
    growTree(x+15,y,z)
    growTree(x+20,y,z)      

pos = mc.player.getTilePos() #Coge la posicion del jugador y la guarda en la variable  pos

x = pos.x
y = pos.y
z = pos.z

bosque(x + 1, y, z) #crea un bosque delante del jugador
[caption id="attachment_7780" align="aligncenter" width="300"]antes de crear árboles en minecraft Antes de la ejecución[/caption]   [caption id="attachment_7785" align="aligncenter" width="300"]despues de crear los árboles en minecraft Tras ejecutar el script, la solución perfecta para los incendios del Verano[/caption]

Resulta sorprendente la cantidad de cosas curiosas que los chavales han creado en este entorno con un poco de código e imaginación :

#import the minecraft.py module from the minecraft directory
import mcpi.minecraft as minecraft
#import minecraft block module
import mcpi.block as block
#import time, so delays can be used
import time
import minecraftstuff

#connect to minecraft
mc = minecraft.Minecraft.create()

#create drawing object
mcd = minecraftstuff.MinecraftDrawing(mc)

playerTilePos = mc.player.getTilePos()
x=playerTilePos.x
y=playerTilePos.y
z=playerTilePos.z

def dibujaPiramide (pos,altura,anchura,largura,tipoBloque): 

    x=pos.x
    y=pos.y
    z=pos.z

    #base
    mc.setBlocks(x, y, z, x+largura, y, z+anchura, block.STONE)

    #puntos de la 1
    puntosA = []
    puntosA.append(minecraft.Vec3 (x,y,z)) #posicion inicial del jugador y vertice de la piramide
    puntosA.append(minecraft.Vec3(x+largura/2,y+altura,z+anchura/2))
    puntosA.append(minecraft.Vec3(x,y,z+anchura))
    #Dibuja los puntos y los une
    mcd.drawFace(puntosA, True, tipoBloque)

    #puntos cara 2
    puntosB = []
    puntosB.append(minecraft.Vec3 (x,y,z))
    puntosB.append(minecraft.Vec3(x+largura/2,y+altura,z+anchura/2))
    puntosB.append(minecraft.Vec3(x+largura,y,z))

    #Dibuja los puntos y los une
    mcd.drawFace(puntosB, True, tipoBloque)

    #puntos de la 3 (copia de la 1, desplazada)
    puntosC = []
    puntosC.append(minecraft.Vec3 (x+largura,y,z))
    puntosC.append(minecraft.Vec3(x+largura/2,y+altura,z+anchura/2))
    puntosC.append(minecraft.Vec3(x+largura,y,z+anchura))
    #Dibuja los puntos y los une
    mcd.drawFace(puntosC, True, tipoBloque)

    #puntos cara 4(copia de la 2 desplazada)
    puntosD = []
    puntosD.append(minecraft.Vec3 (x,y,z+anchura))
    puntosD.append(minecraft.Vec3(x+largura/2,y+altura,z+anchura/2))
    puntosD.append(minecraft.Vec3(x+largura,y,z+anchura))

    #Dibuja los puntos y los une
    mcd.drawFace(puntosD, True, tipoBloque)

#romboide
altura = -10
anchura = 15
largura = 20 
dibujaPiramide (playerTilePos,altura,anchura,largura,block.GLASS.id)
altura = 10
anchura = 15
largura = 20 
dibujaPiramide (playerTilePos,altura,anchura,largura,block.GLASS.id)
[caption id="attachment_7783" align="aligncenter" width="225"] romboides de cristal[/caption]

Y como la ambición humana no tiene límites nos propusimos ir mas lejos e incluso nos atrevimos con una pequeña producción educativa animada que simula el ataque de un virus a una célula:

 [youtube http://www.youtube.com/watch?v=4mFZ5r48I30&w=420&h=315]

Lo más avanzado que hemos hecho ha sido un programa capaz de dibujar sistemas L, cuyo código completo que por su extensión no podemos mostrar aquí puede ser consultado en GitHub.

 [youtube http://www.youtube.com/watch?v=W8h6SpGIHlg&w=420&h=315]

Como se puede apreciar las posibilidades son casi infinitas y los resultados espectaculares.  La combinación de Minecraft y Python permite que vivamos literalmente dentro de las construcciones geométricas o humanas de cualquier tipo. Si con Minecraft podemos recrearlas con Python podemos generarlas de manera sorprendentemente sencilla, siempre que nos encaramemos a hombros de gigantes.

2 comentarios


Marta c c · Hace 2 años

Me encanta vuestra pág. Estoy aprendiendo mucho.acabo de t terminar un curso de apps para móviles, gracias por vuestra pág.

Raspberry Pi + Python + Minecraft = Entretenimiento asegurado - Raspberry Pi | Juegos · Hace 3 años

[…] Leer el tutorial completo | GeekyTheory […]

Deja un comentario