// 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);
}