Autor Tema: Pensé que mi dibujante sería útil ¿sugerencias?

0 Usuarios y 1 Visitante están viendo este tema.

13 Febrero, 2025, 06:23 pm
Leído 655 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino

Parece poco probable que se genere una imagen de la misma calidad (estética) de los 1eros juegos de Mario Bros por decir algo, no probé poner sus colores y tamaño pero, se nota.

Intentando comprender el problema, busqué imágenes pequeñas que, se supone, fuera fácil que se generen con ese programa.

Ah, me faltó explicar algo. Cuando se cliquea una imagen, se reproduce en todas las demás, y en ellas muta cierta cantidad de cuadraditos. En ese caso los dibujos pueden perder la simetría, sólo son simétricos al inicio.

Bueno, intenté generar esta bandera:

2 colores + el fondo, 4x5 cuadraditos.

Lograr que se forme una línea vertical completa en un costado, tomó su tiempo. O sea, muchos clics, muchos "lanzamientos".

Pero lograr que se forme la parte roja, parece demasiado poco probable.

Esto pasa por no saber probabilidad, no creí que fuese taaaaaaaaaaaaaan poco probable...

Comprendo que, pueda ser difícil entender qué quiero. Producir imágenes que puedan servir para videojuegos, que tengan cierta calidad. No es lograr que produzca una ya existente, pero me interesa porque, debería poder, no es tan diferente del objetivo ¿o sí?

¿Sugerencias sobre cómo podría ser más útil?

Tenía algunas ideas a aplicar pero me empezaron a parecer inútiles. Por ejemplo, que en cada dibujo, cada cierto tiempo, un cuadradito cambie de color. Sería una aproximación a lograr generar imágenes animadas y quizá ayudaría a ver más imágenes en menos tiempo, pero como casi todo es como amorfo, no creo que ayude mucho.

13 Febrero, 2025, 07:44 pm
Respuesta #1

Nub

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,458
  • País: 00
  • Karma: +0/-0

Parece poco probable que se genere una imagen de la misma calidad (estética) de los 1eros juegos de Mario Bros por decir algo, no probé poner sus colores y tamaño pero, se nota.

Intentando comprender el problema, busqué imágenes pequeñas que, se supone, fuera fácil que se generen con ese programa.

Ah, me faltó explicar algo. Cuando se cliquea una imagen, se reproduce en todas las demás, y en ellas muta cierta cantidad de cuadraditos. En ese caso los dibujos pueden perder la simetría, sólo son simétricos al inicio.

Bueno, intenté generar esta bandera:

2 colores + el fondo, 4x5 cuadraditos.

Lograr que se forme una línea vertical completa en un costado, tomó su tiempo. O sea, muchos clics, muchos "lanzamientos".

Pero lograr que se forme la parte roja, parece demasiado poco probable.

Esto pasa por no saber probabilidad, no creí que fuese taaaaaaaaaaaaaan poco probable...

Comprendo que, pueda ser difícil entender qué quiero. Producir imágenes que puedan servir para videojuegos, que tengan cierta calidad. No es lograr que produzca una ya existente, pero me interesa porque, debería poder, no es tan diferente del objetivo ¿o sí?

¿Sugerencias sobre cómo podría ser más útil?

Tenía algunas ideas a aplicar pero me empezaron a parecer inútiles. Por ejemplo, que en cada dibujo, cada cierto tiempo, un cuadradito cambie de color. Sería una aproximación a lograr generar imágenes animadas y quizá ayudaría a ver más imágenes en menos tiempo, pero como casi todo es como amorfo, no creo que ayude mucho.
No se bien como haces para generar las imagenes, pero creo que seria la misma idea de tocar todas las letras del teclado durante 1 dia seguido y ver si en toda la cadena de caracteres sale algo interesante, ejemplo: uaiwhfaaifjiajfiafjiafjiafjHolaTachikomaiaafjiajfaiuwhnfuhaf399ir9qfkw, es medio improbable que justo en el medio salga "Hola Tachikomaia" en fin, basicamente es eso que dicen del mono infinito tecleando si lo hace por toda la eternidad tal vez escriba El quijote
https://es.wikipedia.org/wiki/Teorema_del_mono_infinito

Creo que no es buena manera de generar imagenes, aun asi si tienes imaginacion puede salir algo interesante, por ejemplo en el principio del video al ver los dibujos me recordo a las skin de cabezas de Minecraft

Luego podrias hacer algo asi para tener la skin completa


Otra cosa que podria ser util, es que los skin de minecraft cada parte del cuerpo van separadas, entonces la cabeza ponele que sean 8x8 pixeles, si haces que generen imagenes 8x8 en algun momento tal vez tengas una cara interesante :laugh: luego ponele que el brazo sea de 3x10 pixeles, haces lo mismo, al final podrias generar skins completas o algo

13 Febrero, 2025, 08:10 pm
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Sabía del mono, pero siendo unos puntitos de colores, no creí que fuese tan improbable.

Supongo que los dibujos "buenos" tienen ciertas reglas, pero tampoco logré mucho pensando cuales son.

Las imágenes se generan poniendo objetos en la pantalla, cuadraditos, y asignándoles colores al azar, no tiene mucha ciencia digamos. Te paso el código pero está un poco desparramado:
Código: [Seleccionar]
// Algunas cosas se cuentan desde 0, otras desde 1;
// se indicará las que se cuenten desde 0, cuando no es obvio;
// las demás son desde 1.
function ConvertirHexEnDec (Hexadecimal) {
return parseInt(Hexadecimal, 16);
}
function ConvertirDecEnHex (Decimal) {
Hexadecimal = Decimal.toString(16).toUpperCase();
if (Hexadecimal.length == 1) {
Hexadecimal = "0"+Hexadecimal;
}
return Hexadecimal;
}
function ActualizarColorDelFondo () {
// Formar el color:
ColorDelFondo = Rojo+Verde+Azul;
// Actualizar el color del objeto:
ColorDelObjetoFondo.setRGB(parseInt(ColorDelFondo, 16));
}
function Iniciar () {
// Cada cuadro será un dibujo, así que esto...
// luego sería MaxDibujo:
MaxCuadro = DibujosPorFila*DibujosPorFila;
// Contando desde 0:
ColumnaCentral0 = (CuadraditosPorFila-1)/2;
// Columna izquierda más cercana al centro:
ColumnaCentralIzquierda0 = Math.floor(ColumnaCentral0-0.5);
// Lo mismo pero derecha:
ColumnaCentralDerecha0 = Math.floor(ColumnaCentral0+1);
// Contando desde 1:
// ColumnaCentralDerecha1 = ColumnaCentralDerecha0+1;
ColumnaCentral1 = (CuadraditosPorFila+1)/2;
MaxCuadradito = CuadraditosPorFila*CuadraditosPorFila;
LargoDeCuadraditos = 384/(CuadraditosPorFila*DibujosPorFila+GrosorDeSeparacionesxC*(DibujosPorFila-1));
// LargoDeCuadraditos = 384/(CuadraditosPorFila*DibujosPorFila+DibujosPorFila-1);
LargoDeDibujos = CuadraditosPorFila*LargoDeCuadraditos;
GrosorDeSeparaciones = GrosorDeSeparacionesxC*LargoDeCuadraditos;
DistintasMutaciones = Math.floor(MaxCuadro/CuadraditosPorFila);
Resto = MaxCuadro%CuadraditosPorFila;
// Agregar y distribuir cuadros (que serán dibujos):
CuadrosColocados = 0;
// Sus columnas y filas se cuentan desde 0:
Columna = 0;
Fila = 0;
do {
CuadrosColocados++;
// mCuadro tiene código.
attachMovie("mCuadro", "Dibujo"+CuadrosColocados, CuadrosColocados);
setProperty ("Dibujo"+CuadrosColocados, _x, LargoDeDibujos*Columna+Columna*GrosorDeSeparaciones);
setProperty ("Dibujo"+CuadrosColocados, _y, LargoDeDibujos*Fila+Fila*GrosorDeSeparaciones);
Columna = Columna+1;
if (Columna == DibujosPorFila) {
Columna = 0;
Fila = Fila+1;
}
// Un ID usado en el botón de los dibujos:
set ("Dibujo"+CuadrosColocados+".ID", CuadrosColocados);
} while (CuadrosColocados<MaxCuadro);
}
fscommand ("fullscreen", "true");
DibujosPorFila = 4;
CuadraditosPorFila = 6;
// Esto es en cuadraditos, por ejemplo 2 significa que...
// mide lo mismo que 2 cuadraditos:
GrosorDeSeparacionesxC = 1;
// Esto se refiere al color de los cuadraditos:
PosiblesColores = [0xFFFFFF, 0xFF0000, 0];
// Para mostrarlos en cuadros de texto:
ShowerDePosibleColor0 = "FFFFFF";
ShowerDePosibleColor1 = "FF0000";
ShowerDePosibleColor2 = "000000";
Numero = 2;
do {
Numero++;
set ("ShowerDePosibleColor"+Numero, "Ninguno");
} while (Numero<9);
//
ColorSugerido1 = 0xFFFFFF;
ColorSugerido2 = 0;
ColorSugerido3 = 0xFF0000;
ColorSugerido4 = 0x00FF00;
ColorSugerido5 = 0x0000FF;
ColorSugerido6 = 0xFFFF00;
ColorSugerido7 = 0x00FFFF;
ColorSugerido8 = 0xFF00FF;
ColoresRequeridos = 3;
ColorDelFondo = "999999";
ColorDelObjetoFondo = new Color(Fondo);
ColorDelObjetoFondo.setRGB(parseInt(ColorDelFondo, 16));
// Para se puedan cambiar las opciones:
Frame = 2;
Iniciar();

Código en mCuadro:
Código: [Seleccionar]
// Agregar, distribuir cuadraditos y asignarles un color,
// de modo que queden coloreados simétricamente;
// espejo así ( | ):
CuadraditosColocados = 0;
// Sus columnas y filas se cuentan desde 0:
Columna = 0;
Fila = 0;
trace ("Asignando colores para un nuevo dibujo");
do {
CuadraditosColocados = CuadraditosColocados+1;
attachMovie("mCuadradito", "Cuadradito"+CuadraditosColocados, CuadraditosColocados);
setProperty ("Cuadradito"+CuadraditosColocados, _x, Columna*_level0.LargoDeCuadraditos);
setProperty ("Cuadradito"+CuadraditosColocados, _y, Fila*_level0.LargoDeCuadraditos);
setProperty ("Cuadradito"+CuadraditosColocados, _width, _level0.LargoDeCuadraditos);
setProperty ("Cuadradito"+CuadraditosColocados, _height, _level0.LargoDeCuadraditos);
ColorDeCuadradito = new Color("Cuadradito"+CuadraditosColocados);
// Si el cuadradito está a la izquierda o en el centro:
if (Columna<_level0.ColumnaCentralDerecha0) {
// Asignar color al azar:
ColorDeCuadradito.setRGB(_level0.PosiblesColores[random(_level0.PosiblesColores.length)]);
// Incrementar el contador de cuadraditos de ese color:
Resumen = "Color"+ColorDeCuadradito;
set (Resumen, eval(Resumen)+1);
} else {
// trace ("Tiene simetría el "+CuadraditosColocados);
// Asignar el mismo color que su simétrico:
CuadraditoReflejo = (2*(Fila+1)-1)*_level0.CuadraditosPorFila+1-CuadraditosColocados;
ColoraReflejar = new Color("Cuadradito"+CuadraditoReflejo);
ColorDeCuadradito.setRGB(ColoraReflejar.getRGB());
}
Columna++;
if (Columna == _level0.CuadraditosPorFila) {
Columna = 0;
Fila = Fila+1;
// CuadraditoCentralDeLaFila = (_level0.CuadraditosPorFila*Fila+1+_level0.CuadraditosPorFila*(Fila+1))/2;
}
} while (CuadraditosColocados<_level0.MaxCuadradito);
// El dibujo debe tener la cantidad de colores indicada por...
// _level0.ColoresRequeridos. Por eso, y por practicidad,
// se asignará a cuadraditos al azar (evitando reelegirlos),
// esa cantidad de colores (ordenados al azar). Por ejemplo...
// a uno se le asignará el color nro 3, a otro el 1, etc.
// También se intentará conservar la simetría,
// así que los elegidos sólo estarán en el centro o en la...
// izquierda, en cuyo caso se copiará a la derecha:
// Reordenar al azar los colores para elegirlos sin repeticiones:
ColoresReordenados = _level0.PosiblesColores.concat();
Color1aReubicarse = ColoresReordenados.length-1;
while (Color1aReubicarse > 0) {
Color2aReubicarse = random(Color1aReubicarse+1);
SaveDelColor1 = ColoresReordenados[Color1aReubicarse];
ColoresReordenados[Color1aReubicarse] = ColoresReordenados[Color2aReubicarse];
ColoresReordenados[Color2aReubicarse] = SaveDelColor1;
Color1aReubicarse--;
}
// Asignar la cantidad requerida:
ColoresAsignados = 0;
MaxColumnaElegible1 = Math.floor(_level0.ColumnaCentral1);
do {
// Elegir cuadradito al azar:
ColumnaElegida = random(MaxColumnaElegible1)+1;
// Esto es contando desde 0 por eficiencia al calcular:
FilaElegida = random(_level0.CuadraditosPorFila);
CuadraditoElegido = ColumnaElegida+_level0.CuadraditosPorFila*FilaElegida;
trace ("CuadraditoElegido: "+CuadraditoElegido);
// Esto puede cambiar:
ElegidoValido = "Sí";
// Ver si ya fue elegido:
PunteroDeElegidos = 0;
while (ColoresAsignados>PunteroDeElegidos) {
PunteroDeElegidos++;
trace ("Comparando con el "+PunteroDeElegidos+", que es: "+eval("Elegido"+PunteroDeElegidos));
if (eval("Elegido"+PunteroDeElegidos) == CuadraditoElegido) {
trace ("Repetido");
// Ya elegido, repetir el proceso para elegir otro:
ElegidoValido = "No";
// Terminar este loop:
PunteroDeElegidos = ColoresAsignados;
}
}
if (ElegidoValido == "Sí") {
ColoresAsignados++;
// Guardar en la lista al cuadradito elegido:
set ("Elegido"+ColoresAsignados, CuadraditoElegido);
trace ("El recién elegido fue guardado en: Elegido"+ColoresAsignados);
// Asignarle el color:
ColorDeCuadradito = new Color("Cuadradito"+CuadraditoElegido);
ColorDeCuadradito.setRGB(ColoresReordenados[ColoresAsignados-1]);
trace ("Se le asignó el color "+ColoresReordenados[ColoresAsignados-1]);
trace ("La cantidad de colores asignada es "+ColoresAsignados);
// Si el cuadradito no está en la columna central:
if (ColumnaElegida != _level0.ColumnaCentral1) {
// Se refleja:
CuadraditoReflejo = (2*(FilaElegida+1)-1)*_level0.CuadraditosPorFila+1-CuadraditoElegido;
trace ("CuadraditoReflejo: "+CuadraditoReflejo);
ColorDelReflejo = new Color("Cuadradito"+CuadraditoReflejo);
ColorDelReflejo.setRGB(ColorDeCuadradito.getRGB());
}
}
} while (ColoresAsignados<_level0.ColoresRequeridos);
// El botón queda del mismo tamaño que este dibujo:
setProperty (Boton, _width, getProperty(this, _width));
setProperty (Boton, _height, getProperty(this, _height));

Botones en cuadros (para mutar dibujos):
Código: [Seleccionar]
on (release) {
// Los dibujos serán como el de encima de este botón:
// Dibujo a modificar, esto irá aumentando:
Dibujo = 1;
// Usado más adelante:
ModificacionesRequeridas = 1;
// Repetir para el dibujo 1, 2, etc:
while (Dibujo < _level0.MaxCuadro+1) {
// Este if es porque el dibujo a copiar no necesita...
// ser modificado, eso sería como sustituirse por él mismo:
if (Dibujo != _parent.ID) {
Cuadradito = 0;
// Repetir hasta que todo cuadradito se haya copiado:
do {
Cuadradito++;
ColoraCopiar = new Color("_parent.Cuadradito"+Cuadradito);
ColoraSustituirse = new Color("_level0.Dibujo"+Dibujo+".Cuadradito"+Cuadradito);
ColoraSustituirse.setRGB(ColoraCopiar.getRGB());
} while (Cuadradito<_level0.MaxCuadradito);
// Los dibujos mutarán:
// De cada dibujo copia, variarán cuadraditos al azar,
// de 1 hasta CuadraditosPorFila,
// aumentando por dibujo hacia derecha y abajo.
// Pero la cantidad de colores en el dibujo...
// debe mantenerse, así que si se eligen los...
// únicos cuadraditos que tienen cierto color...
// (por ejemplo si son los únicos verdes),
// entonces la elección debe repetirse.
GrupoValido = "No confirmado";
// Repetir hasta que el grupo elegido sea válido:
do {
// Repetir hasta elegir...
// la cantidad requerida de cuadraditos:
CuadraditosElegidos = 0;
do {
// Cuando se elige un cuadradito al azar,
// puede que sea uno ya elegido.
// Para evitarlo, los elegidos se guardan...
// en una lista, y cuando se elige otro...
// se mira que no esté en la lista,
// sino se elige otro:
trace("Se elegirá un cuadradito del dibujo "+Dibujo);
NroDeCuadraditoElegido = random(_level0.MaxCuadradito)+1;
trace("El nro: "+NroDeCuadraditoElegido);
trace("Se verá si ya fue elegido.");
// Esto puede cambiar:
ElegidoValido = "Sí";
PunteroDeElegidos = 1;
// Ver si NroDeCuadraditoElegido está en la lista de elegidos:
while (PunteroDeElegidos <= CuadraditosElegidos) {
trace("Comparando con el nro "+PunteroDeElegidos+" de la lista de elegidos.");
if (NroDeCuadraditoElegido == eval("CuadraditoElegido"+PunteroDeElegidos)) {
trace("Ya fue elegido, se volverá a elegir otro en su lugar.");
ElegidoValido = "No";
// Para que no siga mirando la lista:
PunteroDeElegidos = CuadraditosElegidos+1;
}
PunteroDeElegidos++;
}
if (ElegidoValido == "Sí") {
CuadraditosElegidos++;
trace("Ok, la cantidad de cuadraditos elegidos es "+CuadraditosElegidos);
// Agregar el cuadradito a la lista de elegidos:
set("CuadraditoElegido"+CuadraditosElegidos, NroDeCuadraditoElegido);
}
} while (CuadraditosElegidos<ModificacionesRequeridas);
trace("Grupo completado, se verá que sea válido");
// Obtener el color del 1er cuadradito elegido:
ColorDelElegido = new Color("_level0.Dibujo"+Dibujo+".Cuadradito"+CuadraditoElegido1);
ColorDelElegido = ColorDelElegido.getRGB();
// Ver si otro de los elegidos tiene un color distinto a ese:
PunteroDeElegidos = 2;
while (PunteroDeElegidos <= CuadraditosElegidos) {
// Obtener color del elegido indicado por el puntero:
ColorDelIndicado = new Color("_level0.Dibujo"+Dibujo+".Cuadradito"+eval("CuadraditoElegido"+PunteroDeElegidos));
ColorDelIndicado = ColorDelIndicado.getRGB();
if (ColorDelElegido != ColorDelIndicado) {
trace ("Los colores de los elegidos son distintos, el grupo es válido");
GrupoValido = "Sí";
// Para que no siga mirando la lista:
PunteroDeElegidos = CuadraditosElegidos+1;
}
PunteroDeElegidos++;
}
if (GrupoValido == "No confirmado") {
trace ("Los colores de los elegidos son iguales, se verá si son iguales a alguno no elegido");
// Comparar el color con los no elegidos:
CuadraditoaComparar = 1;
// Esto es para evitar que se comparen con ellos mismos:
PrimerElegidoNoComparado = 1;
do {
if (CuadraditoaComparar != eval("CuadraditoElegido"+PrimerElegidoNoComparado)) {
// El cuadradito a comparar no es uno de los elegidos,
// compararlo entonces:
// Obtener color del indicado por el puntero:
ColoraComparar = new Color("_level0.Dibujo"+Dibujo+".Cuadradito"+CuadraditoaComparar);
ColoraComparar = ColoraComparar.getRGB();
if (ColorDelElegido == ColoraComparar) {
// Los colores que se comparan son iguales,
// los elegidos no son los únicos con ese color,
// el grupo elegido es válido.
trace("Los cuadraditos no son los únicos con su color, el grupo es válido");
GrupoValido = "Sí";
// Para que no siga mirando la lista:
CuadraditoaComparar = _level0.MaxCuadradito;
}
} else {
// Se iba a comparar consigo mismo,
// saltearlo y aumetar el PrimerElegidoNoComparado:
PrimerElegidoNoComparado++;
}
CuadraditoaComparar++;
} while (CuadraditoaComparar < _level0.MaxCuadradito);
}
// Esto es sólo para que los mensajes sean más claros:
if (GrupoValido == "No confirmado") {
trace("El grupo no es válido, se volverá a elegir");
}
} while (GrupoValido == "No confirmado");
// Repetir hasta que el dibujo tenga...
// la cantidad requerida de colores:
trace("Variando colores de los elegidos.");
do {
NrodeElegidoaModificar = 0;
// Repetir hasta haber modificado...
// la cantidad requerida:
do {
NrodeElegidoaModificar++;
CuadraditoaCambiar = "_level0.Dibujo"+Dibujo+".Cuadradito"+eval("CuadraditoElegido"+NrodeElegidoaModificar);
ColoraSustituirse = new Color(CuadraditoaCambiar);
// A esto lo convierto a String porque...
// lo debo comparar con un string y es más fácil así:
SavedeColoraSustituirse = ""+(ColoraSustituirse.getRGB());
// trace ("SavedeColoraSustituirse: "+SavedeColoraSustituirse);
// Repetir mientras el color no cambie:
do {
NuevoColor = _level0.PosiblesColores[random(_level0.PosiblesColores.length)];
trace ("NuevoColor: "+NuevoColor);
} while (NuevoColor == SavedeColoraSustituirse);
ColoraSustituirse.setRGB(NuevoColor);
trace("El color del cuadradito "+eval("CuadraditoElegido"+NrodeElegidoaModificar)+" era "+SavedeColoraSustituirse+" y ahora es "+NuevoColor);
} while (NrodeElegidoaModificar < CuadraditosElegidos);
trace("Se modificaron todos los elegidos.");
trace("Contando cuántos colores tiene el dibujo.");
ColoresDelDibujo = 0;
NrodeCuadraditoaChequear = 0;
do {
NrodeCuadraditoaChequear++;
// Captar color del cuadradito:
ColoraChequear = new Color("_level0.Dibujo"+Dibujo+".Cuadradito"+NrodeCuadraditoaChequear);
ColoraChequear = ColoraChequear.getRGB();
// Esto puede cambiar:
ColorDistinto = "Sí";
// Ver si el color captado está en la lista:
PunteroDeColores = 0;
while (PunteroDeColores < ColoresDelDibujo) {
PunteroDeColores++;
if (ColoraChequear == eval("ColorEnLista"+PunteroDeColores)) {
trace ("El color ya está en la lista.");
ColorDistinto = "No";
// Para que no siga mirando la lista:
PunteroDeColores = ColoresDelDibujo;
}
}
// Si el color no está en la lista:
if (ColorDistinto == "Sí") {
// Agregarlo:
ColoresDelDibujo++;
set("ColorEnLista"+ColoresDelDibujo, ColoraChequear);
trace("El cuadradito "+NrodeCuadraditoaChequear+" fue el 1ero de un color no anotado: "+ColoraChequear);
trace("La cantidad de colores captada hasta ahora es "+ColoresDelDibujo);
}
} while (NrodeCuadraditoaChequear < _level0.MaxCuadradito && ColoresDelDibujo < _level0.ColoresRequeridos);
} while (ColoresDelDibujo < _level0.ColoresRequeridos);
}
Dibujo++;
if (ModificacionesRequeridas <= _level0.Resto) {
ModificacionesRequeridas = Math.floor((Dibujo-1)/(_level0.DistintasMutaciones+1))+1;
} else {
    ModificacionesRequeridas = Math.floor((Dibujo-1-_level0.Resto*(_level0.DistintasMutaciones+1))/(_level0.DistintasMutaciones))+1+_level0.Resto
}
}
}

No sé si falta alguna parte importante.

Podría ser que las mutaciones puedan mejorarse. Hace tiempo que no vicho eso. Mi idea fue que si los dibujos tienen 5 cuadraditos de largo, en el dibujo de más arriba  izquierda mutara sólo uno, en el de abajo derecha 5, y en el medio fuese intermedio, incrementando.