El reto mientras no tiene IA es perder xD
La estoy intentando hacer, eso es otro tema.
Los números de los casilleros son provisorios porque ciertos procesos necesitaba ver qué casilleros habian mirado.
A penas lo terminé, pero ya lo probé de diversas formas y parece que funciona bien.
Ahora intentaré simplificar el código que es un caos ¿sugerencias?
function HacerTablero () {
// Esto se irá especificando en el while:
Situacion = [];
PosiblesAcciones = [];
// Los casilleros se cuentan desde 0:
MaxCasillero = CasillerosPorFila*CasillerosPorFila-1;
// Las columnas también. Esto es para evitar repetir restas por ahí:
MaxColumna = CasillerosPorFila-1;
LargoDeCasilleros = 384/CasillerosPorFila;
NroDeCasilleroaColocar = -1;
// Sus columnas y filas se cuentan desde 0,
// sirven para posicionarlos más fácil:
Columna = 0;
Fila = 0;
do {
NroDeCasilleroaColocar++;
// v es vacío:
Situacion.push("v");
PosiblesAcciones.push(NroDeCasilleroaColocar);
CasilleroaColocar = "Casillero"+NroDeCasilleroaColocar;
// set ("SignoEn"+CasilleroaColocar, "v");
// sCasillero tiene código.
attachMovie("sCasillero", CasilleroaColocar, NroDeCasilleroaColocar);
setProperty (CasilleroaColocar, _x, LargoDeCasilleros*Columna);
setProperty (CasilleroaColocar, _y, LargoDeCasilleros*Fila);
setProperty (CasilleroaColocar, _width, LargoDeCasilleros);
setProperty (CasilleroaColocar, _height, LargoDeCasilleros);
Columna = Columna+1;
if (Columna == CasillerosPorFila) {
Columna = 0;
Fila = Fila+1;
}
// Para que al presionar el botón se sepa qué modificar:
set (CasilleroaColocar+".CasilleroAsociado", NroDeCasilleroaColocar);
// trace("Colocado el "+NroDeCasilleroaColocar);
} while (NroDeCasilleroaColocar<MaxCasillero);
// Para que no muestre el mensaje de victoria:
Win = "No";
}
function HumanoHaMarcado () {
// Inutilizar botón del casillero marcado:
setProperty (eval("Casillero"+CasilleroMarcado+".Boton"), _visible, false);
// Agregar cruz:
// SignosColocados++;
eval("Casillero"+CasilleroMarcado).attachMovie("sCruz", "Cruz", 1);
Situacion[CasilleroMarcado] = "X";
// set ("SignoEnCasillero"+CasilleroMarcado, "X");
// ¿Gana?
if (JuntosRequeridos>2) {
ChequearVertical();
} else if (JuntosRequeridos == 2) {
ObtenerColumnayFilaDelMarcado();
// Para saber si el cuadradito marcado no tiene...
// contiguos hacia algún lado:
ObtenerExcepciones();
trace ("Aplicando ChequeoDe2Excepto"+FuncNamePart1+FuncNamePart2);
eval("ChequeoDe2Excepto"+FuncNamePart1+FuncNamePart2)();
} else if (JuntosRequeridos == 1) {
Win = "Sí";
}
if (Win == "Sí") {
// Sí, inutilizar botones del tablero
// (debería ser sólo los activos):
InutilizarBotones();
// Mostrar mensaje de victoria:
attachMovie("sGanoX", "Mensaje", NroDeCasilleroaColocar+1);
setProperty (Mensaje, _x, 192.4);
setProperty (Mensaje, _y, 192);
gotoAndStop (3);
} else {
// Quitar su acción de las posibles acciones:
// Se busca en qué posición del array está:
AccionRevisandose = -1;
// Esto es para evitar restas:
LastNroDeAcccion = PosiblesAcciones.length-1;
// Probablemente sea ok poner true en la condición:
do {
AccionRevisandose++;
if (PosiblesAcciones[AccionRevisandose] == CasilleroMarcado) {
// Se sustituye por la que está última:
PosiblesAcciones[AccionRevisandose] = PosiblesAcciones[LastNroDeAcccion];
// Se elimina la última:
PosiblesAcciones.pop();
break;
}
} while (AccionRevisandose<LastNroDeAcccion);
LastNroDeAcccion--;
// Elegir una acción al azar:
NroDeAccionElegida = random(PosiblesAcciones.length);
AccionElegida = PosiblesAcciones[NroDeAccionElegida];
// Eliminar la que está en el nro elegido:
// Se sustituye por la que está última:
PosiblesAcciones[NroDeAccionElegida] = PosiblesAcciones[LastNroDeAcccion];
// Se elimina la última:
PosiblesAcciones.pop();
eval("Casillero"+AccionElegida).attachMovie("sCero", "Cero", 0);
Situacion[AccionElegida] = 0;
// Inutilizar el botón de ahí:
setProperty (eval("Casillero"+AccionElegida+".Boton"), _visible, false);
// Ver si 0 ganó:
CasilleroMarcado = AccionElegida;
if (JuntosRequeridos>2) {
ChequearVertical();
} else if (JuntosRequeridos == 2) {
ObtenerColumnayFilaDelMarcado();
// Para saber si el cuadradito marcado no tiene...
// contiguos hacia algún lado:
ObtenerExcepciones();
trace ("Aplicando ChequeoDe2Excepto"+FuncNamePart1+FuncNamePart2);
eval("ChequeoDe2Excepto"+FuncNamePart1+FuncNamePart2)();
}
if (Win == "Sí") {
// Sí, inutilizar botones del tablero
// (debería ser sólo los activos):
InutilizarBotones();
// Mostrar mensaje de victoria:
attachMovie("sGano0", "Mensaje", NroDeCasilleroaColocar+1);
setProperty (Mensaje, _x, 192.4);
setProperty (Mensaje, _y, 192);
gotoAndStop (3);
}
}
// _level0.ObtenerSituacion();
}
function ObtenerColumnayFilaDelMarcado () {
FilaDelMarcado = Math.floor(CasilleroMarcado/CasillerosPorFila);
trace ("Su Fila según el cálculo es: "+FilaDelMarcado);
ColumnaDelMarcado = CasilleroMarcado%CasillerosPorFila;
trace ("Su Columna: "+ColumnaDelMarcado);
}
function ObtenerExcepciones () {
if (FilaDelMarcado != 0) {
if (FilaDelMarcado != CasillerosPorFila0) {
FuncNamePart1 = "";
} else {
FuncNamePart1 = "Abajo";
}
} else {
FuncNamePart1 = "Arriba";
}
if (ColumnaDelMarcado != 0) {
if (ColumnaDelMarcado != CasillerosPorFila0) {
FuncNamePart2 = "";
} else {
FuncNamePart2 = "Derecha";
}
} else {
FuncNamePart2 = "Izquierda";
}
}
// Chequear todo, no hay excepción especificada:
function ChequeoDe2Excepto () {
// x es el lugar marcado, S que sí debe revisarse ahí:
// SSS
// SxS
// SSS
// Para revisar arriba:
// -CasillerosPorFila porque está arriba,
// -1 porque está a la izquierda,
// y -1 porque el do comienza sumándele el incremento:
Desde = CasilleroMarcado-CasillerosPorFila-2;
Hasta = Desde+3;
Incremento = 1;
ChequeoDe2();
if (Win == "No") {
// Revisar abajo:
Desde = CasilleroMarcado+CasillerosPorFila-2;
Hasta = Desde+3;
ChequeoDe2();
if (Win == "No") {
// Revisar costados:
Desde = CasilleroMarcado-3;
Hasta = Desde+4;
Incremento = 2;
ChequeoDe2();
}
}
}
function ChequeoDe2ExceptoArriba () {
// SxS
// SSS
// NNN
// Revisar abajo:
Desde = CasilleroMarcado+CasillerosPorFila-2;
Hasta = Desde+3;
Incremento = 1;
ChequeoDe2();
if (Win == "No") {
// Revisar costados:
Desde = CasilleroMarcado-3;
Hasta = Desde+4;
Incremento = 2;
ChequeoDe2();
}
}
function ChequeoDe2ExceptoAbajo () {
// NNN
// SSS
// SxS
// Revisar arriba:
Desde = CasilleroMarcado-CasillerosPorFila-2;
Hasta = Desde+3;
Incremento = 1;
ChequeoDe2();
if (Win == "No") {
// Revisar costados:
Desde = CasilleroMarcado-3;
Hasta = Desde+4;
Incremento = 2;
ChequeoDe2();
}
}
function ChequeoDe2ExceptoIzquierda () {
// SSN
// xSN
// SSN
// Revisar su columna derecha:
Desde = CasilleroMarcado-CasillerosPorFila*2+1;
Hasta = Desde+CasillerosPorFila*3;
Incremento = CasillerosPorFila;
ChequeoDe2();
if (Win == "No") {
// Revisar su up/down:
Desde = CasilleroMarcado-CasillerosPorFila*3;
Hasta = Desde+CasillerosPorFila*4;
Incremento = CasillerosPorFila*2;
ChequeoDe2();
}
}
function ChequeoDe2ExceptoDerecha () {
// NSS
// NSx
// NSS
// Revisar su columna izquierda:
Desde = CasilleroMarcado-CasillerosPorFila*2-1;
Hasta = Desde+CasillerosPorFila*3;
Incremento = CasillerosPorFila;
ChequeoDe2();
if (Win == "No") {
// Revisar su up/down:
Desde = CasilleroMarcado-CasillerosPorFila*3;
Hasta = Desde+CasillerosPorFila*4;
Incremento = CasillerosPorFila*2;
ChequeoDe2();
}
}
function ChequeoDe2ExceptoArribaIzquierda () {
// xSN
// SSN
// NNN
Desde = CasilleroMarcado+CasillerosPorFila-1;
Hasta = Desde+2;
Incremento = 1;
ChequeoDe2();
if (Win == "No") {
if (Situacion[CasilleroMarcado] == Situacion[CasilleroMarcado+1]) {
Win = "Sí";
}
}
}
function ChequeoDe2ExceptoArribaDerecha () {
// NSx
// NSS
// NNN
Desde = CasilleroMarcado+CasillerosPorFila-2;
Hasta = Desde+2;
Incremento = 1;
ChequeoDe2();
if (Win == "No") {
if (Situacion[CasilleroMarcado] == Situacion[CasilleroMarcado-1]) {
Win = "Sí";
}
}
}
function ChequeoDe2ExceptoAbajoIzquierda () {
// NNN
// SSN
// xSN
Desde = CasilleroMarcado-CasillerosPorFila-1;
Hasta = Desde+2;
Incremento = 1;
ChequeoDe2();
if (Win == "No") {
if (Situacion[CasilleroMarcado] == Situacion[CasilleroMarcado+1]) {
Win = "Sí";
}
}
}
function ChequeoDe2ExceptoAbajoDerecha () {
// NNN
// NSS
// NSx
Desde = CasilleroMarcado-CasillerosPorFila-2;
Hasta = Desde+2;
Incremento = 1;
ChequeoDe2();
if (Win == "No") {
if (Situacion[CasilleroMarcado] == Situacion[CasilleroMarcado-1]) {
Win = "Sí";
}
}
}
//
function ChequeoDe2 () {
Win = "No";
do {
Desde = Desde+Incremento;
trace ("Chequeando "+Desde);
if (Situacion[CasilleroMarcado] == Situacion[Desde]) {
Win = "Sí";
break;
}
} while (Desde<Hasta);
}
//
function ChequearVertical () {
trace ("Ejecutando ChequearVertical");
//
// SOLO FUNCIONA SI CasillerosPorFila >= JuntosRequeridos.
//
// Se revisará la vertical. Desde el casillero más arriba...
// que pueda estar incluído en la línea,
// hasta el casillero marcado. Si se halla alguno que no...
// tenga la marca requerida, se repite el proceso mirando...
// desde uno más abajo del fallado, y mirando ahora hasta...
// más abajo, según corresponda:
Desde = CasilleroMarcado-CasillerosPorFila*(JuntosRequeridos-1);
// Mientras el casillero no exista:
while (Desde<0) {
trace ("Desde es "+Desde+", se aumentará");
// Indicar que se empiece a mirar desde más abajo:
Desde = Desde+CasillerosPorFila;
}
do {
Hasta = Desde+CasillerosPorFila*(JuntosRequeridos-1);
if (Hasta>MaxCasillero) {
// Para ganar se necesitaría más casilleros hacia...
// abajo de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos abajo");
break;
}
Puntero = Desde;
trace ("Comenzando chequeo desde "+Desde+" hasta "+Hasta);
// Puede cambiar:
Win = "Sí";
do {
trace ("Chequando el casillero "+Puntero);
if (Situacion[CasilleroMarcado] != Situacion[Puntero]) {
Win = "No";
Desde = Puntero+CasillerosPorFila;
break;
}
Puntero = Puntero+CasillerosPorFila;
} while (Puntero<=Hasta);
} while (Desde<=CasilleroMarcado && Win == "No");
if (Win == "No") {
ChequearHorizontal();
}
}
function ChequearHorizontal () {
trace ("Ejecutando ChequearHorizontal");
// Es similar al chequeo vertical, pero aquí no sirve...
// sumar o restar a un puntero que marque el casillero...
// porque puede existir ese casillero pero no estar en...
// un costado. En vez de eso, se obtiene su columna y...
// fila, se modifica la columna si es posible,
// y se calcula cual es el casillero a mirar:
ObtenerColumnayFilaDelMarcado();
DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
// Para que no mire cuadraditos inexistentes en la izq:
if (DesdeColumna<0) {
DesdeColumna = 0;
}
do {
HastaColumna = DesdeColumna+JuntosRequeridos-1;
if (HastaColumna>MaxColumna) {
// Para ganar se necesitaría más casilleros hacia...
// la derecha de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos a la derecha");
break;
}
Puntero = DesdeColumna;
trace ("Comenzando chequeo desde "+DesdeColumna+" hasta "+HastaColumna);
// Puede cambiar:
Win = "Sí";
do {
CasilleroaMirar = FilaDelMarcado*CasillerosPorFila+Puntero;
trace ("Chequando el casillero "+CasilleroaMirar);
if (Situacion[CasilleroMarcado] != Situacion[CasilleroaMirar]) {
Win = "No";
DesdeColumna = Puntero+1;
break;
}
Puntero++;
} while (Puntero<=HastaColumna);
} while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
if (Win == "No") {
ChequearDesdeUpIzq();
}
}
// La diagonal así \
function ChequearDesdeUpIzq () {
trace ("Ejecutando ChequearDesdeUpIzq");
ObtenerColumnayFilaDelMarcado();
DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
trace("DesdeColumna: "+DesdeColumna);
DesdeFila = FilaDelMarcado-JuntosRequeridos+1;
trace("DesdeFila: "+DesdeFila);
// Para que no mire cuadraditos inexistentes:
if (DesdeColumna<DesdeFila) {
Sumar = DesdeColumna;
} else {
Sumar = DesdeFila;
}
trace("Sumar: "+Sumar);
if (Sumar<0) {
trace("Sumando.");
DesdeColumna = DesdeColumna-Sumar;
trace("DesdeColumna: "+DesdeColumna);
DesdeFila = DesdeFila-Sumar;
trace("DesdeFila: "+DesdeFila);
}
do {
HastaColumna = DesdeColumna+JuntosRequeridos-1;
if (HastaColumna>MaxColumna) {
// Para ganar se necesitaría más casilleros hacia...
// la derecha de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos a la derecha");
break;
}
HastaFila = DesdeFila+JuntosRequeridos-1;
// Sirve usar MaxColumna en vez de crear MaxFila...
// porque como el tablero es cuadrado serían iguales:
if (HastaFila>MaxColumna) {
// Para ganar se necesitaría más casilleros hacia...
// abajo de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos abajo");
break;
}
PunteroDeColumna = DesdeColumna;
PunteroDeFila = DesdeFila;
trace ("Comenzando chequeo desde columna "+DesdeColumna+" y fila "+DesdeFila);
trace ("hasta columna "+HastaColumna+" y fila "+HastaFila);
// Puede cambiar:
Win = "Sí";
do {
CasilleroaMirar = PunteroDeFila*CasillerosPorFila+PunteroDeColumna;
trace ("Chequando el casillero "+CasilleroaMirar);
if (Situacion[CasilleroMarcado] != Situacion[CasilleroaMirar]) {
Win = "No";
DesdeColumna = PunteroDeColumna+1;
DesdeFila = PunteroDeFila+1;
break;
}
PunteroDeColumna++;
PunteroDeFila++;
} while (PunteroDeColumna<=HastaColumna);
} while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
if (Win == "No") {
ChequearDesdeDownIzq();
}
}
// La diagonal así /
function ChequearDesdeDownIzq () {
trace ("Ejecutando ChequearDesdeDownIzq");
ObtenerColumnayFilaDelMarcado();
DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
trace("DesdeColumna: "+DesdeColumna);
DesdeFila = FilaDelMarcado+JuntosRequeridos-1;
trace("DesdeFila: "+DesdeFila);
// Para que no mire cuadraditos inexistentes:
ColumnasInexistentes = 0;
if (DesdeColumna<0) {
ColumnasInexistentes = DesdeColumna;
}
FilasInexistentes = 0;
// Está bien usar MaxColumna porque MaxFila sería igual:
if (DesdeFila>MaxColumna) {
FilasInexistentes = DesdeFila-MaxColumna;
}
if (ColumnasInexistentes>=FilasInexistentes) {
Ajuste = ColumnasInexistentes;
} else {
Ajuste = FilasInexistentes;
}
trace("Ajuste: "+Ajuste);
if (Ajuste>0) {
trace("Ajustando.");
DesdeColumna = DesdeColumna+Ajuste;
trace("DesdeColumna: "+DesdeColumna);
DesdeFila = DesdeFila-Ajuste;
trace("DesdeFila: "+DesdeFila);
}
do {
HastaColumna = DesdeColumna+JuntosRequeridos-1;
if (HastaColumna>MaxColumna) {
// Para ganar se necesitaría más casilleros hacia...
// la derecha de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos a la derecha");
break;
}
HastaFila = DesdeFila-JuntosRequeridos+1;
if (HastaFila<0) {
// Para ganar se necesitaría más casilleros hacia...
// arriba de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos arriba");
break;
}
PunteroDeColumna = DesdeColumna;
PunteroDeFila = DesdeFila;
trace ("Comenzando chequeo desde columna "+DesdeColumna+" y fila "+DesdeFila);
trace ("hasta columna "+HastaColumna+" y fila "+HastaFila);
// Puede cambiar:
Win = "Sí";
do {
CasilleroaMirar = PunteroDeFila*CasillerosPorFila+PunteroDeColumna;
trace ("Chequando el casillero "+CasilleroaMirar);
if (Situacion[CasilleroMarcado] != Situacion[CasilleroaMirar]) {
Win = "No";
DesdeColumna = PunteroDeColumna+1;
DesdeFila = PunteroDeFila-1;
break;
}
PunteroDeColumna++;
PunteroDeFila--;
} while (PunteroDeColumna<=HastaColumna);
} while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
trace("Win: "+Win);
}
function InutilizarBotones () {
BotonesInutilizados = -1;
do {
BotonesInutilizados++;
setProperty ("Casillero"+BotonesInutilizados+".Boton", _visible, false);
} while (BotonesInutilizados<MaxCasillero);
}
CasillerosPorFila = 9;
// Contando desde 0:
CasillerosPorFila0 = CasillerosPorFila-1;
JuntosRequeridos = 3;
HacerTablero();El código en los botones de los casilleros es:
on (release) {
_level0.CasilleroMarcado = _parent.CasilleroAsociado;
_level0.HumanoHaMarcado();
}Por si no se entiende, X en línea significa que el largo de la línea es configurable, igual que la cantidad de casilleros por línea y columna. No lo mostré en el video pero sí, se puede poner que la línea deba ser más larga o menos, son cosas independientes (aunque claro, si pones que la línea deba ser más larga que el tablero, no se podrá ganar).
Acabo de recordar que me falta poner el caso de empate >___< pero bueno, es válido el tema, igual.
Edit: Hice que cuando deba chequear líneas de 2, use los chequeos complejos (que fueron hechos para funcionar para 3 o más) y funciona. Quité los chequeos de 2. Empecé haciendo esos porque eran más sencillos. Aún me falta poner el empate:
function HacerTablero () {
// Esto se irá especificando en el while:
Situacion = [];
PosiblesAcciones = [];
// Los casilleros se cuentan desde 0:
MaxCasillero = CasillerosPorFila*CasillerosPorFila-1;
// Las columnas también. Esto es para evitar repetir restas por ahí:
MaxColumna = CasillerosPorFila-1;
LargoDeCasilleros = 384/CasillerosPorFila;
NroDeCasilleroaColocar = -1;
// Sus columnas y filas se cuentan desde 0,
// sirven para posicionarlos más fácil:
Columna = 0;
Fila = 0;
do {
NroDeCasilleroaColocar++;
// v es vacío:
Situacion.push("v");
PosiblesAcciones.push(NroDeCasilleroaColocar);
CasilleroaColocar = "Casillero"+NroDeCasilleroaColocar;
// set ("SignoEn"+CasilleroaColocar, "v");
// sCasillero tiene código.
attachMovie("sCasillero", CasilleroaColocar, NroDeCasilleroaColocar);
setProperty (CasilleroaColocar, _x, LargoDeCasilleros*Columna);
setProperty (CasilleroaColocar, _y, LargoDeCasilleros*Fila);
setProperty (CasilleroaColocar, _width, LargoDeCasilleros);
setProperty (CasilleroaColocar, _height, LargoDeCasilleros);
Columna = Columna+1;
if (Columna == CasillerosPorFila) {
Columna = 0;
Fila = Fila+1;
}
// Para que al presionar el botón se sepa qué modificar:
set (CasilleroaColocar+".CasilleroAsociado", NroDeCasilleroaColocar);
// trace("Colocado el "+NroDeCasilleroaColocar);
} while (NroDeCasilleroaColocar<MaxCasillero);
// Para que no muestre el mensaje de victoria:
Win = "No";
}
function HumanoHaMarcado () {
// Inutilizar botón del casillero marcado:
setProperty (eval("Casillero"+CasilleroMarcado+".Boton"), _visible, false);
// Agregar cruz:
// SignosColocados++;
eval("Casillero"+CasilleroMarcado).attachMovie("sCruz", "Cruz", 1);
Situacion[CasilleroMarcado] = "X";
// set ("SignoEnCasillero"+CasilleroMarcado, "X");
// ¿Gana?
if (JuntosRequeridos>1) {
ChequearVertical();
} else {
Win = "Sí";
}
if (Win == "Sí") {
// Sí, inutilizar botones del tablero
// (debería ser sólo los activos):
InutilizarBotones();
// Mostrar mensaje de victoria:
attachMovie("sGanoX", "Mensaje", NroDeCasilleroaColocar+1);
setProperty (Mensaje, _x, 192.4);
setProperty (Mensaje, _y, 192);
gotoAndStop (3);
} else {
// Quitar su acción de las posibles acciones:
// Se busca en qué posición del array está:
AccionRevisandose = -1;
// Esto es para evitar restas:
LastNroDeAcccion = PosiblesAcciones.length-1;
// Probablemente sea ok poner true en la condición:
do {
AccionRevisandose++;
if (PosiblesAcciones[AccionRevisandose] == CasilleroMarcado) {
// Se sustituye por la que está última:
PosiblesAcciones[AccionRevisandose] = PosiblesAcciones[LastNroDeAcccion];
// Se elimina la última:
PosiblesAcciones.pop();
break;
}
} while (AccionRevisandose<LastNroDeAcccion);
LastNroDeAcccion--;
// Elegir una acción al azar:
NroDeAccionElegida = random(PosiblesAcciones.length);
AccionElegida = PosiblesAcciones[NroDeAccionElegida];
// Eliminar la que está en el nro elegido:
// Se sustituye por la que está última:
PosiblesAcciones[NroDeAccionElegida] = PosiblesAcciones[LastNroDeAcccion];
// Se elimina la última:
PosiblesAcciones.pop();
eval("Casillero"+AccionElegida).attachMovie("sCero", "Cero", 0);
Situacion[AccionElegida] = 0;
// Inutilizar el botón de ahí:
setProperty (eval("Casillero"+AccionElegida+".Boton"), _visible, false);
// Ver si 0 ganó:
CasilleroMarcado = AccionElegida;
if (JuntosRequeridos>1) {
ChequearVertical();
} else {
Win = "Sí";
}
if (Win == "Sí") {
// Sí, inutilizar botones del tablero
// (debería ser sólo los activos):
InutilizarBotones();
// Mostrar mensaje de victoria:
attachMovie("sGano0", "Mensaje", NroDeCasilleroaColocar+1);
setProperty (Mensaje, _x, 192.4);
setProperty (Mensaje, _y, 192);
gotoAndStop (3);
}
}
// _level0.ObtenerSituacion();
}
function ObtenerColumnayFilaDelMarcado () {
FilaDelMarcado = Math.floor(CasilleroMarcado/CasillerosPorFila);
trace ("Su Fila según el cálculo es: "+FilaDelMarcado);
ColumnaDelMarcado = CasilleroMarcado%CasillerosPorFila;
trace ("Su Columna: "+ColumnaDelMarcado);
}
function ChequearVertical () {
trace ("Ejecutando ChequearVertical");
//
// SOLO FUNCIONA SI CasillerosPorFila >= JuntosRequeridos.
//
// Se revisará la vertical. Desde el casillero más arriba...
// que pueda estar incluído en la línea,
// hasta el casillero marcado. Si se halla alguno que no...
// tenga la marca requerida, se repite el proceso mirando...
// desde uno más abajo del fallado, y mirando ahora hasta...
// más abajo, según corresponda:
Desde = CasilleroMarcado-CasillerosPorFila*(JuntosRequeridos-1);
// Mientras el casillero no exista:
while (Desde<0) {
trace ("Desde es "+Desde+", se aumentará");
// Indicar que se empiece a mirar desde más abajo:
Desde = Desde+CasillerosPorFila;
}
do {
Hasta = Desde+CasillerosPorFila*(JuntosRequeridos-1);
if (Hasta>MaxCasillero) {
// Para ganar se necesitaría más casilleros hacia...
// abajo de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos abajo");
break;
}
Puntero = Desde;
trace ("Comenzando chequeo desde "+Desde+" hasta "+Hasta);
// Puede cambiar:
Win = "Sí";
do {
trace ("Chequando el casillero "+Puntero);
if (Situacion[CasilleroMarcado] != Situacion[Puntero]) {
Win = "No";
Desde = Puntero+CasillerosPorFila;
break;
}
Puntero = Puntero+CasillerosPorFila;
} while (Puntero<=Hasta);
} while (Desde<=CasilleroMarcado && Win == "No");
if (Win == "No") {
ChequearHorizontal();
}
}
function ChequearHorizontal () {
trace ("Ejecutando ChequearHorizontal");
// Es similar al chequeo vertical, pero aquí no sirve...
// sumar o restar a un puntero que marque el casillero...
// porque puede existir ese casillero pero no estar en...
// un costado. En vez de eso, se obtiene su columna y...
// fila, se modifica la columna si es posible,
// y se calcula cual es el casillero a mirar:
ObtenerColumnayFilaDelMarcado();
DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
// Para que no mire cuadraditos inexistentes en la izq:
if (DesdeColumna<0) {
DesdeColumna = 0;
}
do {
HastaColumna = DesdeColumna+JuntosRequeridos-1;
if (HastaColumna>MaxColumna) {
// Para ganar se necesitaría más casilleros hacia...
// la derecha de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos a la derecha");
break;
}
Puntero = DesdeColumna;
trace ("Comenzando chequeo desde "+DesdeColumna+" hasta "+HastaColumna);
// Puede cambiar:
Win = "Sí";
do {
CasilleroaMirar = FilaDelMarcado*CasillerosPorFila+Puntero;
trace ("Chequando el casillero "+CasilleroaMirar);
if (Situacion[CasilleroMarcado] != Situacion[CasilleroaMirar]) {
Win = "No";
DesdeColumna = Puntero+1;
break;
}
Puntero++;
} while (Puntero<=HastaColumna);
} while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
if (Win == "No") {
ChequearDesdeUpIzq();
}
}
// La diagonal así \
function ChequearDesdeUpIzq () {
trace ("Ejecutando ChequearDesdeUpIzq");
ObtenerColumnayFilaDelMarcado();
DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
trace("DesdeColumna: "+DesdeColumna);
DesdeFila = FilaDelMarcado-JuntosRequeridos+1;
trace("DesdeFila: "+DesdeFila);
// Para que no mire cuadraditos inexistentes:
if (DesdeColumna<DesdeFila) {
Sumar = DesdeColumna;
} else {
Sumar = DesdeFila;
}
trace("Sumar: "+Sumar);
if (Sumar<0) {
trace("Sumando.");
DesdeColumna = DesdeColumna-Sumar;
trace("DesdeColumna: "+DesdeColumna);
DesdeFila = DesdeFila-Sumar;
trace("DesdeFila: "+DesdeFila);
}
do {
HastaColumna = DesdeColumna+JuntosRequeridos-1;
if (HastaColumna>MaxColumna) {
// Para ganar se necesitaría más casilleros hacia...
// la derecha de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos a la derecha");
break;
}
HastaFila = DesdeFila+JuntosRequeridos-1;
// Sirve usar MaxColumna en vez de crear MaxFila...
// porque como el tablero es cuadrado serían iguales:
if (HastaFila>MaxColumna) {
// Para ganar se necesitaría más casilleros hacia...
// abajo de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos abajo");
break;
}
PunteroDeColumna = DesdeColumna;
PunteroDeFila = DesdeFila;
trace ("Comenzando chequeo desde columna "+DesdeColumna+" y fila "+DesdeFila);
trace ("hasta columna "+HastaColumna+" y fila "+HastaFila);
// Puede cambiar:
Win = "Sí";
do {
CasilleroaMirar = PunteroDeFila*CasillerosPorFila+PunteroDeColumna;
trace ("Chequando el casillero "+CasilleroaMirar);
if (Situacion[CasilleroMarcado] != Situacion[CasilleroaMirar]) {
Win = "No";
DesdeColumna = PunteroDeColumna+1;
DesdeFila = PunteroDeFila+1;
break;
}
PunteroDeColumna++;
PunteroDeFila++;
} while (PunteroDeColumna<=HastaColumna);
} while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
if (Win == "No") {
ChequearDesdeDownIzq();
}
}
// La diagonal así /
function ChequearDesdeDownIzq () {
trace ("Ejecutando ChequearDesdeDownIzq");
ObtenerColumnayFilaDelMarcado();
DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
trace("DesdeColumna: "+DesdeColumna);
DesdeFila = FilaDelMarcado+JuntosRequeridos-1;
trace("DesdeFila: "+DesdeFila);
// Para que no mire cuadraditos inexistentes:
ColumnasInexistentes = 0;
if (DesdeColumna<0) {
ColumnasInexistentes = DesdeColumna;
}
FilasInexistentes = 0;
// Está bien usar MaxColumna porque MaxFila sería igual:
if (DesdeFila>MaxColumna) {
FilasInexistentes = DesdeFila-MaxColumna;
}
if (ColumnasInexistentes>=FilasInexistentes) {
Ajuste = ColumnasInexistentes;
} else {
Ajuste = FilasInexistentes;
}
trace("Ajuste: "+Ajuste);
if (Ajuste>0) {
trace("Ajustando.");
DesdeColumna = DesdeColumna+Ajuste;
trace("DesdeColumna: "+DesdeColumna);
DesdeFila = DesdeFila-Ajuste;
trace("DesdeFila: "+DesdeFila);
}
do {
HastaColumna = DesdeColumna+JuntosRequeridos-1;
if (HastaColumna>MaxColumna) {
// Para ganar se necesitaría más casilleros hacia...
// la derecha de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos a la derecha");
break;
}
HastaFila = DesdeFila-JuntosRequeridos+1;
if (HastaFila<0) {
// Para ganar se necesitaría más casilleros hacia...
// arriba de los que hay, terminar análisis:
trace ("No hay suficientes cuadraditos arriba");
break;
}
PunteroDeColumna = DesdeColumna;
PunteroDeFila = DesdeFila;
trace ("Comenzando chequeo desde columna "+DesdeColumna+" y fila "+DesdeFila);
trace ("hasta columna "+HastaColumna+" y fila "+HastaFila);
// Puede cambiar:
Win = "Sí";
do {
CasilleroaMirar = PunteroDeFila*CasillerosPorFila+PunteroDeColumna;
trace ("Chequando el casillero "+CasilleroaMirar);
if (Situacion[CasilleroMarcado] != Situacion[CasilleroaMirar]) {
Win = "No";
DesdeColumna = PunteroDeColumna+1;
DesdeFila = PunteroDeFila-1;
break;
}
PunteroDeColumna++;
PunteroDeFila--;
} while (PunteroDeColumna<=HastaColumna);
} while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
trace("Win: "+Win);
}
function InutilizarBotones () {
BotonesInutilizados = -1;
do {
BotonesInutilizados++;
setProperty ("Casillero"+BotonesInutilizados+".Boton", _visible, false);
} while (BotonesInutilizados<MaxCasillero);
}
CasillerosPorFila = 9;
// Contando desde 0:
CasillerosPorFila0 = CasillerosPorFila-1;
JuntosRequeridos = 3;
HacerTablero();