actions for fotograma 1
CasillerosPorFila = 9;
JuntosRequeridos = 3;
MarcadorDeX = "Humano";
MarcadorDe0 = "IA";
// Determina a qué frames va:
Jugadores = "HumanoIA";
NivelDeIA = 1;
// Usado en el botón de quién marca con X:
function CambiarMarcadorDeX () {
if (MarcadorDeX == "Humano") {
MarcadorDeX = "IA";
} else {
MarcadorDeX = "Humano";
}
Jugadores = MarcadorDeX+MarcadorDe0;
HacerTablero();
}
// Usado en el botón de quién marca con 0:
function CambiarMarcadorDe0 () {
if (MarcadorDe0 == "IA") {
MarcadorDe0 = "Humano";
} else {
MarcadorDe0 = "IA";
}
Jugadores = MarcadorDeX+MarcadorDe0;
HacerTablero();
}
// Usado ahora y en general cuando se cambia la configuración de la partida:
function HacerTablero () {
trace ("HacerTablero");
// Para que no pueda haber más de 1 mensaje en pantalla:
removeMovieClip ("Mensaje");
// Esto se irá especificando en el próximo while:
Situacion = [];
PosiblesAcciones = [];
// Los casilleros se cuentan desde 0:
MaxCasillero = CasillerosPorFila*CasillerosPorFila-1;
// Las columnas también. Esto es para no 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++;
if (Columna == CasillerosPorFila) {
Columna = 0;
Fila++;
}
// 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";
SignoDeTurno = "X";
if (Jugadores == "HumanoIA") {
trace ("HacerTablero: "+Jugadores+" va a f2");
gotoAndStop (2);
} else if (Jugadores == "IAHumano") {
trace ("HacerTablero: "+Jugadores+" va a...");
TurnoDeIA();
if (Win == "No") {
// OJO QUE SI HAY EMPATE NO DEBE IR AL F2, O NO ES NEC
trace ("HacerTablero: IA no ganó, va a f2");
gotoAndStop (2);
}
} else if (Jugadores == "HumanoHumano") {
trace ("HacerTablero: "+Jugadores+" va a f2");
gotoAndStop (2);
} else {
// IA VS IA:
trace ("HacerTablero: "+Jugadores+" va a f3");
InutilizarBotones();
gotoAndStop (3);
}
}
HacerTablero();
// Usada cuando el humano marca en un casillero:
function HumanoHaMarcado () {
// trace("PosiblesAcciones.length: "+PosiblesAcciones.length);
trace ("Humano ha marcado");
// Inutilizar botón del casillero marcado:
setProperty (eval("Casillero"+CasilleroMarcado+".Boton"), _visible, false);
// Agregar signo:
// SignosColocados++;
eval("Casillero"+CasilleroMarcado).attachMovie("s"+SignoDeTurno, "Signo", 1);
Situacion[CasilleroMarcado] = SignoDeTurno;
// set ("SignoEnCasillero"+CasilleroMarcado, "X");
// ¿Gana?
// Si esta función dice que no, usa otras:
ChequearVertical();
if (Win == "Sí") {
// Sí, inutilizar botones del tablero
// (debería ser sólo los activos):
InutilizarBotones();
// Mostrar mensaje de victoria:
attachMovie("sGano"+SignoDeTurno, "Mensaje", NroDeCasilleroaColocar+1);
UbicarMensaje();
} else if (PosiblesAcciones.length>=2) {
// Sino, si aún hay >=2 acciones posibles
// (la que usó aún no se quitó):
// Quitar su acción de las posibles acciones:
// Se busca en qué posición del array está:
AccionRevisandose = -1;
do {
AccionRevisandose++;
if (PosiblesAcciones[AccionRevisandose] == CasilleroMarcado) {
// Se elimina la acción de la lista de posibles:
PosiblesAcciones.splice(AccionRevisandose, 1);
// trace (PosiblesAcciones.join(""));
break;
}
} while (true);
CambiarSigno();
if (Jugadores == "HumanoIA" or Jugadores == "IAHumano") {
trace ("Humano ha marcado: en f2 turno de IA");
TurnoDeIA();
}
} else {
// (sólo queda 1 acción en la lista,
// pero es la que acaba de usar,
// que debe borrarse, así que no quedan)
trace ("Empate luego de que marcó el humano");
// trace("PosiblesAcciones.length: "+PosiblesAcciones.length);
Empate();
}
}
// Usada en ChequeoHorizontal y requerida en otros casos:
function ObtenerColumnayFilaDelMarcado () {
ColumnaDelMarcado = CasilleroMarcado%CasillerosPorFila;
// trace ("Su Columna según el cálculo es: "+ColumnaDelMarcado);
FilaDelMarcado = Math.floor(CasilleroMarcado/CasillerosPorFila);
// trace ("Su Fila: "+FilaDelMarcado);
}
// Usada para saber si hubo victoria cuando alguien marca:
function ChequearVertical () {
// the code here is large, so I dont show it, but seems ok.
}
// Usada luego de ChequearVertical si no se halló victoria:
function ChequearHorizontal () {
// idem
}
// Usada luego de ChequearHorizontal si no se halló victoria:
// La diagonal así \
function ChequearDesdeUpIzq () {
// idem
}
// Usada luego de ChequearDesdeUpIzq si no se halló victoria:
// La diagonal así /
function ChequearDesdeDownIzq () {
// idem
}
// Usada cuando alguien gana o en HacerTablero si es IA VS IA:
function InutilizarBotones () {
BotonesInutilizados = -1;
do {
BotonesInutilizados++;
setProperty ("Casillero"+BotonesInutilizados+".Boton", _visible, false);
} while (BotonesInutilizados<MaxCasillero);
}
// Usada cuando hay que ubicar un mensaje, duh:
function UbicarMensaje () {
setProperty (Mensaje, _x, 192.4);
setProperty (Mensaje, _y, 192);
// gotoAndStop (3);
}
// En caso de empate:
function Empate () {
attachMovie("sEmpate", "Mensaje", NroDeCasilleroaColocar+1);
UbicarMensaje();
// Para que en el modo IA VS IA, la IA no juegue más:
Win = "Sí";
trace ("Empate");
}
function CambiarSigno () {
if (SignoDeTurno == "X") {
SignoDeTurno = 0;
} else {
SignoDeTurno = "X";
}
}
function TurnoDeIA () {
trace ("TurnoDeIA");
if (NivelDeIA == 0) {
trace ("TurnoDeIA: IA nivel 0, no cambia de f");
// Elegir una acción al azar:
NroDeAccionElegida = random(PosiblesAcciones.length);
AccionElegida = PosiblesAcciones[NroDeAccionElegida];
trace ("IA ha marcado: "+AccionElegida);
// Eliminar la que está en el nro elegido:
PosiblesAcciones.splice(NroDeAccionElegida, 1);
trace (PosiblesAcciones.join(""));
eval("Casillero"+AccionElegida).attachMovie("s"+SignoDeTurno, "Signo", 0);
Situacion[AccionElegida] = SignoDeTurno;
// Inutilizar el botón de ahí:
setProperty (eval("Casillero"+AccionElegida+".Boton"), _visible, false);
// Ver si IA ganó:
CasilleroMarcado = AccionElegida;
// trace ("JuntosRequeridos: "+JuntosRequeridos);
ChequearVertical();
// trace("PosiblesAcciones.length: "+PosiblesAcciones.length);
if (Win == "Sí") {
// Sí, inutilizar botones del tablero
// (debería ser sólo los activos):
InutilizarBotones();
// Mostrar mensaje de victoria:
attachMovie("sGano"+SignoDeTurno, "Mensaje", NroDeCasilleroaColocar+1);
UbicarMensaje();
} else if (PosiblesAcciones.length == 0) {
trace ("Empate luego de que marcó la IA");
// trace("PosiblesAcciones.length: "+PosiblesAcciones.length);
Empate();
} else {
CambiarSigno();
}
} else {
trace ("TurnoDeIA: IA nivel 1, va al f3");
gotoAndStop (3);
}
}
actions for fotograma 2
// Aquí el/los humano/s puede/n marcar.
stop ();
actions for fotograma 3
// IA de nivel 1, averigua las consecuencias de cada acción
// (pero no a partir de sus consecuencias),
// guardando la que tenga mejores consecuencias:
BestResult = "None";
// Se crea una copia de la situación porque los resultados de las acciones...
// se evalúan con las funciones chequeo, que usan Situacion, pero se...
// necesitará recuperar su estado original:
CopiaDeSituacion = Situacion.slice();
AccionaProbar = 0;
do {
// Averiguar cual es:
CasilleroMarcado = PosiblesAcciones[AccionaProbar];
// Aplicarla:
Situacion[CasilleroMarcado] = SignoDeTurno;
// ¿Ganó?
// Si no se detecta victoria vertical,
// revisa de otros modos (ver las funciones Chequear):
ChequearVertical();
if (Win == "Sí") {
// Se aplicará la acción:
break;
} else if (PosiblesAcciones.length == 1) {
// Se aplicará la acción:
break;
} else if (BestResult == "None") {
BestResult = "Unknown";
// Esto para saber cual eliminar de la lista PosiblesAcciones:
BestAction = AccionaProbar;
BestCasillero = CasilleroMarcado;
}
AccionaProbar++;
// Resetear situación:
Situacion = CopiaDeSituacion.slice();
} while (AccionaProbar<PosiblesAcciones.length);
if (Win == "Sí") {
eval("Casillero"+CasilleroMarcado).attachMovie("s"+SignoDeTurno, "Signo", 0);
InutilizarBotones();
// Mostrar mensaje de victoria:
attachMovie("sGano"+SignoDeTurno, "Mensaje", NroDeCasilleroaColocar+1);
UbicarMensaje();
} else if (PosiblesAcciones.length == 1) {
eval("Casillero"+CasilleroMarcado).attachMovie("s"+SignoDeTurno, "Signo", 0);
trace ("Empate luego de que marcó la IA");
Empate();
} else {
// Eliminar acción que está en el nro elegido:
PosiblesAcciones.splice(BestAction, 1);
eval("Casillero"+BestCasillero).attachMovie("s"+SignoDeTurno, "Signo", 0);
Situacion[BestCasillero] = SignoDeTurno;
// Inutilizar el botón de ahí:
setProperty (eval("Casillero"+BestCasillero+".Boton"), _visible, false);
CambiarSigno();
trace ("en f3 IA hizo su jugada, va a f2");
gotoAndStop (2);
}
actions for Botón Reset
on (release) {
HacerTablero();
}