Código
// 3 en línea muy simplificado: // 1 jugador. // No hay tablero, hay una cadena de texto. // La acción es poner 0 o 1 en el 1er sitio disponible. // Hay victoria cuando la cadena es "11". // Hay derrota cuando son 2 caracteres pero no es "11". // No hay empate. // // Situaciones a investigar: S1 = ""; S2 = "0"; S3 = "1"; // Investigar S3 y S2: SInvestigandose = 3; do { BaseS = eval("S"+SInvestigandose); trace ("Investigando la situación "+BaseS); Action = 0; BestAction = 0; // Usando BestAction: BestChanceOfWin = 0; // Considerando todas las acciones: Wins = 0; Loses = 0; do { S = BaseS+Action; trace ("Se realizó la acción "+Action+", el resultado es "+S); if (S == "11") { trace ("Victoria, anotando datos"); Wins++; BestAction = Action; BestChanceOfWin = 100; } else { trace ("Derrota"); Loses++; } Action++; } while (Action<2); trace ("No hay más acciones posibles, anotando datos"); // Guardar datos descubiertos de las situaciones: set ("S"+BaseS+"BestAction", BestAction); // Usando BestAction: set ("S"+BaseS+"BestChanceOfWin", BestChanceOfWin); // Considerando todas las acciones: set ("S"+BaseS+"Wins", Wins); set ("S"+BaseS+"Loses", Loses); set ("S"+BaseS+"ChanceOfWin", Wins*100/(Wins+Loses)); // Investigar la situación anterior de la lista: SInvestigandose--; } while (SInvestigandose>1); // Investigar S1: BaseS = eval("S"+SInvestigandose); trace ("Investigando la situación "+BaseS); Action = 0; BestAction = ""; // Usando BestAction: BestChanceOfWin = 0; // Considerando todas las acciones: Wins = 0; Loses = 0; do { S = BaseS+Action; trace ("Se realizó la acción "+Action+", el resultado es "+S); NewS_ = "S"+S; NextBestChanceOfWin = eval(NewS_+"BestChanceOfWin"); if (NextBestChanceOfWin>BestChanceOfWin) { trace ("La NewS da más chance de ganar, se sustituyen datos sobre qué hacer en la investigada y por qué"); BestAction = Action; BestChanceOfWin = NextBestChanceOfWin; } // Se agregan datos de la NewS: Wins = Wins+eval(NewS_+"Wins"); Loses = Loses+eval(NewS_+"Loses"); Action++; } while (Action<2); trace ("No hay más acciones posibles, anotando datos"); // Guardar datos descubiertos de la situación: set ("S"+BaseS+"BestAction", BestAction); // Usando BestAction: set ("S"+BaseS+"BestChanceOfWin", BestChanceOfWin); // Considerando todas las acciones: set ("S"+BaseS+"Wins", Wins); set ("S"+BaseS+"Loses", Loses); set ("S"+BaseS+"ChanceOfWin", Wins*100/(Wins+Loses));
El resultado en resumen es:
Variable _level0.S1BestAction = 1
Variable _level0.S0BestAction = 0
Variable _level0.SBestAction = 1
Significa:
En la situación "1" conviene usar la acción 1.
En la situación "0" conviene usar la acción 0 (*).
En la situación "" conviene usar la acción 1.
(*): En realidad como no fue posible ganar nunca grabó qué acción conviene.
Pero bueno, leo sugerencias.
Intentando aprender a hacer códigos más útiles de ese estilo (fuerza bruta para un juego estilo 3 en línea) hice este ¿cómo lo simplificarían?
Código
Por ejemplo los ifs ¿es posible reducir la cantidad necesaria? ¿cómo?
// 3 en línea muy simplificado: // 1 jugador. // No hay tablero, hay una cadena de texto. // La acción es poner 0 o 1 en una de las 2 posiciones. // Hay victoria cuando la cadena es "11". // Hay derrota cuando son 2 caracteres pero no es "11". // No hay empate. // // Situaciones a investigar: S1 = ""; S2 = "0"; S3 = "1"; S4 = " 0"; S5 = " 1"; // Investigar S5~S2: SInvestigandose = 5; do { BaseS = eval("S"+SInvestigandose); trace ("Investigando la situación "+BaseS); Action = 0; BestAction = 0; // Usando BestAction: BestChanceOfWin = 0; // Considerando todas las acciones: Wins = 0; Loses = 0; do { trace ("Se realizará la acción "+Action); if (Action == 0) { if (BaseS == "") { S = "0"; } else if (BaseS.charat(0) == " ") { S = "0"+BaseS.substring(1); } else { S = "Ninguna"; } } else if (Action == 1) { if (BaseS == "") { S = "1"; } else if (BaseS.charat(0) == " ") { S = "1"+BaseS.substring(1); } else { S = "Ninguna"; } } else if (Action == 2) { if (BaseS == "") { S = " 0"; } else if (BaseS.length<2) { S = BaseS+"0"; } else { S = "Ninguna"; } } else if (Action == 3) { if (BaseS == "") { S = " 1"; } else if (BaseS.length<2) { S = BaseS+"1"; } else { S = "Ninguna"; } } trace ("El resultado es "+S); if (S == "11") { trace ("Victoria, anotando datos"); Wins++; BestAction = Action; BestChanceOfWin = 100; } else if (S != "Ninguna") { trace ("Derrota"); Loses++; } Action++; } while (Action<4); trace ("No hay más acciones posibles, anotando datos"); // Guardar datos descubiertos de las situaciones: set ("S"+BaseS+"BestAction", BestAction); // Usando BestAction: set ("S"+BaseS+"BestChanceOfWin", BestChanceOfWin); // Considerando todas las acciones: set ("S"+BaseS+"Wins", Wins); set ("S"+BaseS+"Loses", Loses); set ("S"+BaseS+"ChanceOfWin", Wins*100/(Wins+Loses)); // Investigar la situación anterior de la lista: SInvestigandose--; } while (SInvestigandose>1); // Investigar S1: BaseS = eval("S"+SInvestigandose); trace ("Investigando la situación "+BaseS); Action = 0; BestAction = ""; // Usando BestAction: BestChanceOfWin = 0; // Considerando todas las acciones: Wins = 0; Loses = 0; do { trace ("Se realizará la acción "+Action); if (Action == 0) { if (BaseS == "") { S = "0"; } else if (BaseS.charat(0) == " ") { S = "0"+BaseS.substring(1); } else { S = "Ninguna"; } } else if (Action == 1) { if (BaseS == "") { S = "1"; } else if (BaseS.charat(0) == " ") { S = "1"+BaseS.substring(1); } else { S = "Ninguna"; } } else if (Action == 2) { if (BaseS == "") { S = " 0"; } else if (BaseS.length<2) { S = BaseS+"0"; } else { S = "Ninguna"; } } else if (Action == 3) { if (BaseS == "") { S = " 1"; } else if (BaseS.length<2) { S = BaseS+"1"; } else { S = "Ninguna"; } } trace ("El resultado es "+S); NewS_ = "S"+S; NextBestChanceOfWin = eval(NewS_+"BestChanceOfWin"); if (NextBestChanceOfWin>BestChanceOfWin) { trace ("La NewS da más chance de ganar, se sustituyen datos sobre qué hacer en la investigada y por qué"); BestAction = Action; BestChanceOfWin = NextBestChanceOfWin; } // Se agregan datos de la NewS: Wins = Wins+eval(NewS_+"Wins"); Loses = Loses+eval(NewS_+"Loses"); Action++; } while (Action<4); trace ("No hay más acciones posibles, anotando datos"); // Guardar datos descubiertos de la situación: set ("S"+BaseS+"BestAction", BestAction); // Usando BestAction: set ("S"+BaseS+"BestChanceOfWin", BestChanceOfWin); // Considerando todas las acciones: set ("S"+BaseS+"Wins", Wins); set ("S"+BaseS+"Loses", Loses); set ("S"+BaseS+"ChanceOfWin", Wins*100/(Wins+Loses));





Autor



En línea
