Código
} 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; Variar(); } else if (CuadraditosDespintados < MinCuadraditosDespintados) { trace (" El dibujo tiene demasiados cuadraditos pintados: "+CuadraditosDespintados); DibujosDensos++; // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; Variar(); } else { DibujosOk++; // trace (" Mostrando dibujo nro: "+DibujosOk); // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; play (); } } else if (CuadraditosDespintados < MinCuadraditosDespintados) { trace (" El dibujo tiene demasiados cuadraditos pintados: "+CuadraditosDespintados); DibujosDensos++; // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; Variar(); } else { DibujosOk++; // trace (" Mostrando dibujo nro: "+DibujosOk); // Preparar Puntero para generar el próximo dibujo: Puntero = MaxPosiciondePuntero; play (); }
En resumen:
Código:
sino si el dibujo puede ser simétrico
averiguar si lo es, iniciando un while
iniciar otro while, también necesario
si se capta simetría
terminar los while
sino si se capta que no hay simetría
terminar los while
fin del while
fin del while
Si se captó simetría
hacer A
sino si es denso
hacer B
sino
hacer C
sino si es denso
hacer B
sino
hacer C
Veo 2 problemas:
- Ifs fuera del while, que se cumplen del mismo modo que los de dentro, sin que vaya a haber cambios en el proceso.
- Código repetido.
En cuanto al 1er punto:
El código es parte de la función Variar, que se autollama en los casos A y B, así que los while deberían terminar antes de que se autollame, por eso no puedo hacer A dentro del while como correspondería.
El código repetido se podría evitar si se analiza siempre la simetría (quitar el else if inicial), pero no parece buena idea sabiendo que será necesario sólo a partir de cierto punto (el código se repite así que tampoco es que haya un punto fijo, sólo hay condiciones fijas).
No sé. Lo de simetría, por las dudas, no se refiere a si el dibujo es capicúa, sino que, al ser invertido (espejo | ) es igual a un dibujo hecho antes.
Es un programa que genera dibujos en blanco y negro siguiendo cierto órden.
Me gustaría poner un ejemplo más simple sobre esta estructura de código... A ver:
Código:
Si hace calor
usar gorro
sino si el cielo está nublado
averiguar si está lloviendo, iniciando un while
iniciar otro while, también necesario
si se capta lluvia
terminar los while
sino si se capta que no llueve
terminar los while
fin del while
fin del while
Si se captó lluvia
usar paraguas
sino si hay terremoto
no salir
sino
hacer lo normal
sino si hay terremoto
no salir
sino
hacer lo normal
¿Y el código repetido cómo lo hago más eficiente?