Raspberry Pi + Python + Minecraft = Entretenimiento asegurado

Raspberry Pi + Python + Minecraft = Entretenimiento asegurado
minecraft

Entretenimiento 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.