Básicamente el frame 3 que usaba para el modo IA vs IA ahora lo uso para la IA en nivel 1, así que se me liaron los goto y estoy poniendo traces (prints) a ver en qué frame está el programa en diferentes momentos, para intentar entender en qué casos falla.
Código
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(); }
Modo IA vs IA en un objeto en un frame mucho más adelante:
Código
onClipEvent (enterFrame) { trace("SignoDeTurno: "+_level0.SignoDeTurno); _level0.TurnoDeIA(); trace("Win: "+_level0.Win); if (_level0.Win == "No") { trace("SignoDeTurno: "+_level0.SignoDeTurno); _level0.TurnoDeIA(); } trace("Win: "+_level0.Win); // No va un else, esto es que si la IA ganó en su 1er turno o... // en su 2ndo (ejecutado dentro del if), frana: if (_level0.Win == "Sí") { trace("Va al frame 2"); _root.gotoAndStop (2); } }
Uso gotos en parte porque si un proceso es largo en un mismo frame Flash manda un cartel.
Bueno ¿conoces algún otro código que te dé miedo?






Autor


En línea



