Lo modifiqué un poco pero lo que tengo es básicamente esto, veanlo un poco y se los explico:
Al inicio los dibujos de 3x3 quedaron mal porque el grabador tardó en iniciar.
Luego está bien, creo, y casi al final capta dibujos simétricos a otros ya hechos, y esos no los muestra. Por ejemplo:
NBBB
BBBB
BBBB
BBBB
Donde N es negro y B blanco, es simétrico a:
BBBN
BBBB
BBBB
BBBB
que fue mostrado antes (en teoría, porque empieza mostrando una diagonal así / no viene al caso el por qué). Siempre me refiero a simetría considerando un espejo así |; o sea, la izquierda simétrica a la derecha.
Bueno ¿cómo saber cuando un dibujo es simétrico a otro ya mostrado?
Lo he pensado bastante y hasta lo hablé con GPT pero parece que sigo confuso...
En vez de B y N se puede decir 1 y 2, entonces tendríamos que los números más bajos se producen antes, si consideramos que esto:
BBB
BBB
BBN
es:
111
111
112
que es:
111111112
entonces, sé que:
111111211
es simétrico a uno ya hecho ¿pero por qué, cual es la condición, el indicador? Una vez que se obtiene un número así, el programa debe detectar que el simétrico a ese ya fue hecho ¿cómo logro que lo detecte? Tengo que captar el valor, como he puesto, a partir de los colores, y... en ese ejemplo, si el valor de 1 fila es mayor a su inverso, ese dibujo es simétrico a uno ya hecho. Pero eso no sé si sirve siempre, por ejemplo:
BBN
NBB
BBB
Bueno, puede ser que sea así... ¿qué me dicen?
Lo que yo hacía es otra cosa, sólo comparaba 2 valores, concatenaba todo:
} else if (MinCuadraditoPintado < CuadraditoCentraloCD) {
// El dibujo puede ser simétrico...
// a otro ya mostrado. ¿Lo es?
// Captar valor (colores) de cada fila;
// si es mayor al inverso, sí:
Valor = "";
ValorInverso = "";
PunteroDeFilas = 0;
do {
PunteroDeFilas++;
PunteroDeColumnas = 1;
PunteroInverso = CuadraditosPorFila;
do {
Valor = Valor+eval("Cuadradito"+PunteroDeFilas+"_"+PunteroDeColumnas);
ValorInverso = eval("Cuadradito"+PunteroDeFilas+"_"+PunteroInverso)+ValorInverso;
PunteroDeColumnas++;
PunteroInverso--;
} while (PunteroInverso > 0);
} while (PunteroDeFilas < CuadraditosPorFila);
// Preparar Puntero para generar el próximo dibujo:
Puntero = MaxPosiciondePuntero;
if (Valor < ValorInverso) {
// trace (" El dibujo es simétrico a otro ya mostrado.");
DibujosSimetricos++;
El 1er if es porque, supongo, un dibujo sólo puede ser simétrico a otro ya hecho si en su fila superior tiene pintado un cuadradito a la izquierda, es como una intuición, no sé explicar el por qué ¿uds qué piensan?
Además en Valor < ValorInverso tendría que haber puesto > y otro problema es que estoy concatenando 0s (negro) y 1s (blanco) así que tengo que ajustar todo eso que no me di cuenta xP
Es más fácil que 0 sea no pintado, pero como el color negro es 000000 (00 en rojo, en verde y en azul) y se entiende como 0, uso 0...
Por otro lado, también me gustaría que me ayuden no ya a detectar esos dibujos, sino a evitarlos. Eso tiene puede tener que ver con poner el puntero (el indicador de qué cuadradito se modificará) en cierto sitio en vez de simplemente en el inferior derecho. Lo que hago por ahora es que cuando se pinta el superior central izquierdo pongo el puntero en el superior más derecho, porque en ese momento el dibujo es:
BNBB
BBBB
BBBB
BBBB
y hasta que se pinte el superior más derecho todos los dibujos serán simétricos a otros ya hechos, creo... ¿Hay algún otro truco que pueda usar para evitar que se produzcan simétricos a otros ya hechos?