Hay 4x4 dibujos.
Luego, cuando el usuario cliquea un dibujo, se transmite a los demás pero con algunas mutaciones. Los de arriba-izquierda mutan menos y los de abajo-derecha mutan más (el cálculo para determinar cuántos mutan en cada dibujo me lo dijeron matemáticos, no lo entiendo bien, pero no importa aquí).
Creo que funciona bien, aquí está el código del clic:
Nota: Es importante diferenciar cuadro de cuadradito: Los cuadros son los dibujos separados con verde, los cuadraditos son digamos los píxeles (pero más grandes que un pixel) que contiene cada dibujo.
Código
on (release) { // Los dibujos serán como el de encima de este botón: Dibujo = 1; 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 cuadraditos al azar, // de 1 hasta CuadraditosPorFila, // aumentando por dibujo hacia derecha y abajo: // Repetir hasta que se haya variado esa cantidad... // de cuadraditos: CuadraditosModificados = 0; do { // Para evitar que se modifique uno ya modificado, // los modificados se guardan en una lista, // y cuando se va a modificar uno se mira... // que no esté en la lista, sino se elige otro: do { trace("Se modificará un cuadradito del dibujo "+Dibujo); Repetido = "No"; NroDeCuadraditoaCambiar = random(_level0.MaxCuadradito)+1; trace("El nro: "+NroDeCuadraditoaCambiar); trace("Se verá si ya fue modificado."); PunteroParaLista = 1; // Ver si NroDeCuadraditoaCambiar está en la lista de modificados: while (PunteroParaLista <= CuadraditosModificados) { trace("Comparando con el nro "+PunteroParaLista+" de la lista de modificados."); if (NroDeCuadraditoaCambiar == eval("CuadraditoModificado"+PunteroParaLista)) { Repetido = "Sí"; PunteroParaLista = CuadraditosModificados+1; trace("Ya fue modificado, se elegirá otro."); } PunteroParaLista++; } } while (Repetido == "Sí"); CuadraditoaCambiar = "_level0.Dibujo"+Dibujo+".Cuadradito"+NroDeCuadraditoaCambiar; trace("Ya se eligió uno no modificado, es: "+CuadraditoaCambiar); 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 = _parent.PosiblesColores[random(_parent.PosiblesColores.length)]; } while (NuevoColor == SavedeColoraSustituirse); ColoraSustituirse.setRGB(NuevoColor); // trace ("NuevoColor: "+NuevoColor); CuadraditosModificados++; // Agregar el cuadradito a la lista de modificados: set("CuadraditoModificado"+CuadraditosModificados, NroDeCuadraditoaCambiar); } while (CuadraditosModificados<ModificacionesRequeridas); } 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 } } }
Quiero agregar que cada dibujo resultante deba tener cierta cantidad de colores (3 en este caso), ni más ni menos. Eso implica que si los cuadraditos elegidos a modificarse son los únicos que tienen cierto color, deben elegirse otros (porque si cambian de color, habría menos colores, por ser los únicos que tenían ese color). Y eso, creo, implica que ya no conviene modificarlos a penas se seleccionan, porque si no son una elección válida entonces habría que volverlos al color anterior y eso parece más complicado y menos eficiente que irlos guardando en una lista y modificarlos recién cuando esté completa.
Tengo más o menos la idea de cómo hacerlo pero son tantos while (o no sé evitarlos) que me lié. El pseudocódigo yo diría que es:
Código:
Repetir
Si el dibujo (de turno, D) a sustituirse no es el que se está copiando,
sustituirlo por el que se está copiando ("pegárselo" encima).
Repetir
Repetir
Seleccionar un cuadradito del dibujo D.
Si ese ya fue elegido, volver a elegir un cuadradito de D (contador--).
hasta que se haya elegido la cantidad requerida.
Si los elegidos no son válidos,
elegirlos de nuevo (indicar que este loop reinicie ¿resetar contador?).
hasta que se haya elegido un grupo válido.
Repetir
Repetir
Modificar el color de uno de los cuadraditos elegidos y llevar la cuenta de cuántos colores tiene el dibujo.
hasta que se haya modificado el color de todos los elegidos.
Si el dibujo no tiene la cantidad requerida de colores,
modificar los colores de nuevo (indicar que este loop reinicie).
hasta que el dibujo tenga la cantidad requerida de colores.
hasta que se haya aplicado a todo dibujo.
Código
Un lío. Nótese que estoy cambiando algunos nombres por lo de que debe eligirse un grupo y chequearse que sirvan en vez de modificar colores enseguida.
on (release) { // Los dibujos serán como el de encima de este botón: Dibujo = 1; 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 1ero elegir cuales, // porque puede que la elección no sea válida, // en cuyo caso habría que resetearlos. // La elección no es válida si los elegidos tienen el mismo color y son los únicos con ese. // A continuación se eligen para 1 dibujo, pero esto se está repitiendo en un loop mayor: CuadraditosElegidos = 0; do { Repetir = "No"; // Para evitar que se elija uno ya elegido, // los elegidos se guardan en una lista, // y cuando se va a elegir uno se mira... // que no esté en la lista, sino se elige otro: do { trace("Se elegirá un cuadradito del dibujo "+Dibujo); Repetido = "No"; CuadraditoElegido = random(_level0.MaxCuadradito)+1; trace("El nro: "+CuadraditoElegido); trace("Se verá si ya fue elegido:"); PunteroParaLista = 1; // Ver si CuadraditoElegido está en la lista de elegidos: while (PunteroParaLista <= CuadraditosElegidos) { trace("Comparando con el nro "+PunteroParaLista+" de la lista de elegidos."); if (CuadraditoElegido == eval("CuadraditoElegido"+PunteroParaLista)) { Repetido = "Sí"; // Esto es para que ya no mire la lista: PunteroParaLista = CuadraditosElegidos; trace("Ya fue elegido antes, se elegirá otro."); } PunteroParaLista++; } } while (Repetido == "Sí"); CuadraditosElegidos++; // Repetir hasta que se haya variado esa cantidad... // de cuadraditos: CuadraditosaModificarse = 0; do { // Para evitar que se modifique uno ya modificado, // los modificados se guardan en una lista, // y cuando se va a modificar uno se mira... // que no esté en la lista, sino se elige otro: do { trace("Se modificará un cuadradito del dibujo "+Dibujo); Repetido = "No"; NroDeCuadraditoaCambiar = random(_level0.MaxCuadradito)+1; trace("El nro: "+NroDeCuadraditoaCambiar); trace("Se verá si ya fue modificado."); PunteroParaLista = 1; // Ver si NroDeCuadraditoaCambiar está en la lista de modificados: while (PunteroParaLista <= CuadraditosaModificarse) { trace("Comparando con el nro "+PunteroParaLista+" de la lista de modificados."); if (NroDeCuadraditoaCambiar == eval("CuadraditoModificado"+PunteroParaLista)) { Repetido = "Sí"; PunteroParaLista = CuadraditosaModificarse+1; trace("Ya fue modificado, se elegirá otro."); } PunteroParaLista++; } } while (Repetido == "Sí");
Intentaré transformar el pseudocódigo en código, pero ¿se puede simplificar? ¿consejos?