Código
Repetir Si se puede variar VariaciónConChequeoNormal Si se capta simetría repetir pero VariaciónConChequeoExtra sino repetir normalmente sino despintar mientras no se capte un dibujo ok
Básicamente, en un caso tengo que hacer unos chequeos extra que normalmente no, así que no quiero hacerlos si es innecesario, pero quiero evitar poner ese if en el código que siento que es innecesario (*), y por cómo es el código es complicado... ¿Basado en eso se les ocurre algo?
Me refiero a algo así:
Código
Repetir Si se puede variar Si no se captó simetría VariaciónConChequeoNormal sino VariaciónConChequeoExtra fin del si Si se capta simetría Marcar que se detectó simetría y repetir sino Marcar que no se detectó simetría y repetir sino despintar mientras no se capte un dibujo ok
Esto:
Código:
Si no se captó simetría
VariaciónConChequeoNormal
sino
VariaciónConChequeoExtra
fin del si
Si en vez de VariaciónConChequeoExtra se pudiera poner un do parecido al original, tal vez... Lo pensaré.
Aquí una explicación más detallada:
Intento que un programa genere todos los dibujos de X*X cuadraditos en blanco y negro, que cumplan ciertas condiciones, X va aumentando. Las condiciones son:
// debe tener algún cuadradito pintado en cada columna y fila,
// no debe haber muchos pintados aislados,
// no debe ser simétrico (espejo vertical | ) a alguno ya mostrado,
// y no debe tener demasiados cuadraditos despintados (contando desde el MinPintado, que se cuenta desde arriba a la derecha, como un texto).
El conteo de aislados, cuando se pinta un cuadradito, no es completo porque no es necesario, porque como se pintan desde abajo a la izquierda, nunca habrá uno pintado a la derecha ni abajo, como se explica aquí (más abajo está el código completo):
// Debido a que al pintar un cuadradito...
// los de abajo y el de la derecha estarán despintados,
// sólo se miran el de la izquierda y los de arriba:
Eso es el chequeo normal.
Cuando se capta que un dibujo es simétrico a uno ya hecho, para evitar que se generen posibles otros simétricos se modifica el cuadradito más derecho de la fila donde se detectó la falla, en vez de modificar el cuadradito de más abajo o donde fuera normalmente. Esto es bueno, pero al hacerlo se requiere un chequeo extra de los aislados, porque en este caso puede que haya pintados abajo.
Son suposiciones sobre este programa, un error que me ha parecido detectar, no es que lo tenga del todo claro.
He pensado, como puse arriba, en crear 2 funciones para los 2 tipos de variaciones, pero no quiero usar un if, siento que no es necesario.
Código
// En este programa hay cuadraditos nombrados así: // 123 // 456 // 789 // Se irán pintando diferentes combinaciones y... // su tamaño se reducirá a medida que... // la cantidad por fila y columna aumente. // Para que un dibujo se muestre... // debe tener algún cuadradito pintado en cada columna y fila, // no debe haber muchos pintados aislados, // no debe ser simétrico (espejo vertical | ) a alguno ya mostrado, // y no debe tener demasiados cuadraditos despintados // (contando desde el MinPintado). // Ver frame 2 por más información. // // CuadraditosPorFila es también porColumna. // Debido a que en cierto chequeo se asume que... // si el cuadradito no está en la parte inferior ni... // superior entonces está en una fila intermedia, // conviene que CuadraditosPorFila comience siendo >1; // aumenta 1 antes de aplicarse: CuadraditosPorFila = 2; // Usada en Variar: function ObtenerColumnayFila () { Fila = Math.ceil(Puntero/CuadraditosPorFila); // trace ("Su Fila según el cálculo es: "+Fila); Columna = (Puntero-1)%CuadraditosPorFila+1; // trace ("Su Columna: "+Columna); // Esto se usa para evitar repeticiones... // de concatenaciones y simplificarlas: ColumnaRelevante = "PintadosenC"+Columna; FilaRelevante = "PintadosenF"+Fila; } // Usada en ParteDeContarEtc: function PosibleIncrementoDeContiguosPintados () { // ¿El contiguo indicado está pintado? if (eval("Cuadradito"+Fila3+"_"+Columna3) == 0) { // Sí, aumentar contador: ContiguosPintados++; // trace ("De ese contiguo ("+Fila2+"_"+Columna2+"), su contiguo "+Fila3+"_"+Columna3+" está pintado; por ahora se vió que tiene "+ContiguosPintados+" contiguos pintados."); } } // Usada en ContarContiguosDeContiguoAlNewPintado y ContarContiguosDeContiguoAlNewDespintado: function ParteDeContarEtc () { ContiguosPintados = 0; // trace("Analizando su inferior derecho."); Fila3 = Fila2+1; Columna3 = Columna2+1; PosibleIncrementoDeContiguosPintados(); // trace("Analizando su inferior."); Columna3--; PosibleIncrementoDeContiguosPintados(); // trace("Analizando su inferior izquierdo."); Columna3--; PosibleIncrementoDeContiguosPintados(); // trace("Analizando su derecho."); Columna3 = Columna3+2; Fila3--; PosibleIncrementoDeContiguosPintados(); // trace("Analizando su izquierdo."); Columna3 = Columna3-2; PosibleIncrementoDeContiguosPintados(); // trace("Analizando su superior derecho."); Columna3 = Columna3+2; Fila3--; PosibleIncrementoDeContiguosPintados(); // trace("Analizando su superior."); Columna3--; PosibleIncrementoDeContiguosPintados(); // trace("Analizando su superior izquierdo."); Columna3--; PosibleIncrementoDeContiguosPintados(); } // Usada en Variar: function ContarContiguosDeContiguoAlNewPintado () { // ¿El contiguo indicado está pintado? // trace ("Analizando Cuadradito"+Fila2+"_"+Columna2+": "+eval("Cuadradito"+Fila2+"_"+Columna2)); if (eval("Cuadradito"+Fila2+"_"+Columna2) == 0) { // Sí, el recién pintado no está aislado: ElRecienPintadoEstaAislado = "No"; // trace ("Está pintado; el recién pintado no está aislado."); // Se contarán los contiguos de este (contiguo al recién...). ParteDeContarEtc(); // trace ("Ese contiguo ("+Fila2+"_"+Columna2+") al recién pintado tiene "+ContiguosPintados+" contiguos pintados."); // ¿Estaba aislado? if (ContiguosPintados == 1) { // Sí, reducir el contador: CuadraditosAislados--; // trace ("El contiguo al recién pintado sólo tiene 1 contiguo pintado, estaba aislado, ahora hay "+CuadraditosAislados+" aislados."); } } else { // trace ("No está pintado."); } } // Usada en Variar: function ContarContiguosDeContiguoAlNewDespintado () { // ¿El contiguo indicado está pintado? // trace ("Analizando Cuadradito"+Fila2+"_"+Columna2+": "+eval("Cuadradito"+Fila2+"_"+Columna2)); if (eval("Cuadradito"+Fila2+"_"+Columna2) == 0) { // Sí, el recién despintado no estaba aislado: ElRecienDespintadoEstabaAislado = "No"; // trace ("Está pintado; el recién despintado no estaba aislado."); // Se contarán los contiguos de este (contiguo al recién...). ParteDeContarEtc(); // trace ("Ese contiguo ("+Fila2+"_"+Columna2+") al recién despintado tiene "+ContiguosPintados+" contiguos pintados."); // ¿Está aislado? if (ContiguosPintados == 0) { // Sí, aumentar el contador: CuadraditosAislados++; // trace ("El contiguo al recién despintado quedó aislado, ahora hay "+CuadraditosAislados+" aislados."); } } else { // trace ("No está pintado."); } } // En F3 se repite: function Variar () { // Repetir mientras no se produzca un dibujo ok: do { // Esto para modificar la variable que indica el color, // que es 0 o 1: ReferenciaAlColoraModificar = "ColordeCuadradito"+Puntero; ColoraModificar = eval(ReferenciaAlColoraModificar); // Esto para el color real: NuevoColor = new Color("Cuadradito"+Puntero); // ¿El cuadradito puede cambiar de color? if (ColoraModificar>0) { // Sí, hacer los cambios: // En la variable: set (ReferenciaAlColoraModificar, ColoraModificar-1); // Del color real: NuevoColor.setRGB(0); // trace (" Se pintó el cuadradito "+Puntero); // Asignarle el color de la 2nda manera: ObtenerColumnayFila(); set ("Cuadradito"+Fila+"_"+Columna, 0); // Incrementar contador de cuadraditos pintados en...: // la columna y fila donde se pintó: set (ColumnaRelevante, eval(ColumnaRelevante)+1); set (FilaRelevante, eval(FilaRelevante)+1); // Actualizar cantidad de cuadraditos pintados aislados: // De cada pintado al lado del recién pintado, // se verá si estaba aislado, // en cuyo caso disminuirá el contador. // Si no hay pintados al lado del nuevo, aumentará. // trace ("Se actualizará el contador de pintados aislados:"); // Esta variable puede cambiar, se refiere al recién pintado: ElRecienPintadoEstaAislado = "Sí"; // Para analizar a su izquierdo: Fila2 = Fila; Columna2 = Columna-1; // Si su izquierdo existe y está pintado, // entonces el actual no está aislado, // y se mira si el izquierdo de ese estaba aislado: // Cuántos de sus contiguos están pintados. // Si la cantidad es 1, estaba aislado, // el contador de Aislados baja. // Debido a que al pintar un cuadradito... // los de abajo y el de la derecha estarán despintados, // sólo se miran el de la izquierda y los de arriba: ContarContiguosDeContiguoAlNewPintado(); // Para analizar a su izquierdo de arriba: Fila2--; ContarContiguosDeContiguoAlNewPintado(); // Para analizar al de arriba: Columna2++; ContarContiguosDeContiguoAlNewPintado(); // Para analizar a su derecho de arriba: Columna2++; ContarContiguosDeContiguoAlNewPintado(); if (ElRecienPintadoEstaAislado == "Sí") { // trace("El recién pintado está aislado"); CuadraditosAislados++; } // trace(" El dibujo tiene "+CuadraditosAislados+" cuadraditos aislados"); // Actualizar contador de despintados // (contando desde MinPintado) CuadraditosDespintados--; // Para juzgar: // ¿El dibujo tiene cuadraditos pintados en toda columna y fila? Puntero2 = 0; // Esto puede que cambie: CuadraditoenCadaFyC = "Sí"; do { Puntero2 = Puntero2+1; // ¿La columna Puntero2 no tiene algún cuadradito pintado? if (eval("PintadosenC"+Puntero2)<1) { CuadraditoenCadaFyC = "No"; } else if (eval("PintadosenF"+Puntero2)<1) { // La fila Puntero2 no tiene algún cuadradito pintado. CuadraditoenCadaFyC = "No"; } } while (CuadraditoenCadaFyC == "Sí" && Puntero2<CuadraditosPorFila); // ¿El dibujo tiene cuadraditos pintados en toda columna y fila? if (CuadraditoenCadaFyC == "No") { // No, no mostrarlo y hacer otro: // trace (" No ocupa cada F y C, salteándolo."); DibujosPequeños++; // Actualizar MinCuadraditoPintado si corresponde: if (Puntero<MinCuadraditoPintado) { MinCuadraditoPintado = Puntero; // trace(Puntero); // Como ahora se cuenta un cuadradito extra, // que estaba despintado, el contador aumenta: CuadraditosDespintados++; // Si se llegó al punto en que los dibujos... // pueden ser simétricos a unos ya hechos: if (Puntero<CuadraditoCentraloCD) { // En el próximo dibujo se pintará el superior derecho: Puntero = CuadraditosPorFila; } else { // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; } } else { // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; } } else if (CuadraditosAislados>MaxCuadraditosAislados) { // trace (" Tiene demasiados cuadraditos pintados aislados: "+CuadraditosAislados+" salteándolo."); DibujosAislados++; // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; } else if (MinCuadraditoPintado<CuadraditoCentraloCD) { // El dibujo puede ser simétrico... // a otro ya mostrado. ¿Lo es? // Esto puede cambiar: DibujoEsSimetrico = "No"; // Captar valor (colores) de cada fila; // si alguno es menor al inverso, sí: PunteroDeFilas = 0; do { PunteroDeFilas++; PunteroDeColumnas = 0; PunteroInverso = CuadraditosPorFila; do { PunteroDeColumnas++; Valor = eval("Cuadradito"+PunteroDeFilas+"_"+PunteroDeColumnas); ValorInverso = eval("Cuadradito"+PunteroDeFilas+"_"+PunteroInverso); // trace("Valor: "+Valor); // trace("ValorInverso: "+ValorInverso); if (Valor<ValorInverso) { DibujoEsSimetrico = "Sí"; FilaFallada = PunteroDeFilas; PunteroDeFilas = CuadraditosPorFila; break; } else if (Valor>ValorInverso) { // Es ok: PunteroDeFilas = CuadraditosPorFila; break; } PunteroInverso--; } while (PunteroDeColumnas<CuadraditosPorFila); } while (PunteroDeFilas<CuadraditosPorFila); // Este if es probablemente innecesario, // porque se supone que el dibujo será simétrico u ok, // antes de que se terminen de comparar todas las filas. if (DibujoEsSimetrico == "Sí") { // trace (" El dibujo es simétrico a otro ya mostrado."); DibujosSimetricos++; // Al Puntero ponerlo al final de la fila... // captada como simétrica, para posiblemente... // evitar algunos otros dibujos simétricos: Puntero = CuadraditosPorFila*FilaFallada; } else if (CuadraditosDespintados<MinCuadraditosDespintados) { trace (" El dibujo tiene demasiados cuadraditos despintados: "+CuadraditosDespintados); DibujosDensos++; // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; } else { DibujosOk++; // trace (" Mostrando dibujo nro: "+DibujosOk); // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; play (); break; } } else if (CuadraditosDespintados<MinCuadraditosDespintados) { trace (" El dibujo tiene demasiados cuadraditos despintados: "+CuadraditosDespintados); DibujosDensos++; // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; } else { DibujosOk++; // trace (" Mostrando dibujo nro: "+DibujosOk); // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; play (); break; } } else { // Despintar un cuadradito, no viene al caso. } } while (true); }
Pero dudo que convenga poner por ahí una copia modificada de todo eso... Tendría que crear muchas funciones. No sé, joder ¿ideas?