elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Posible aporte: Código para jugar bien Signos en línea, aún no probado.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Posible aporte: Código para jugar bien Signos en línea, aún no probado.  (Leído 2,426 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.687


Hackentifiko!


Ver Perfil
Posible aporte: Código para jugar bien Signos en línea, aún no probado.
« en: 18 Agosto 2025, 04:17 am »

Se refiere al 3 en raya pero con la configuración que se ponga: En vez de 3 puede ser otro número y en vez de un tablero de 3*3 puede ser otro número independiente del anterior. Lo pensé para tableros cuadrados, pero quizá funcione para rectangulares. De momento está configurado para revisar sólo rayas horizontales, pero basta quitar un par de rayas // para que revise todas las posibilidades, es sólo que para pruebas me pareció mejor así.
Aún no lo probé, acabo de terminarlo, llevo bastante tiempo con esto... Disfrútenlo, analícenlo si quieren a ver qué tal:
Código
  1. // Signos en línea en tableros cuadrados:
  2. // Este programa tiene básicamente 3 etapas,
  3. // que se pueden resumir así:
  4. // Nota: La situación inicial, en que hay 0 signos colocados,
  5. // estará guardada en la lista nro 0.      
  6. // 1:
  7. // Probar acciones en cada situación de la lista nro 0,
  8. // guardando en una nueva lista las nuevas situaciones (que no...
  9. // sean victoria ni empate). Repetir con cada nueva lista hasta...
  10. // la que tenga situaciones en que sólo 1 acción es posible
  11. // (por ejemplo en el 3 en línea es la 8).
  12. // 2:
  13. // Probar acciones en cada situación de la última lista,
  14. // guardando datos sobre las consecuencias (victoria o empate)
  15. // de realizar la única acción posible.
  16. // 3:
  17. // En las situaciones no resueltas, empezando por las...
  18. // penúltimas listas, probar las acciones.
  19. // Guardar cuántas acciones causan victoria de uno, de otro y...
  20. // de empate. Averiguar la mejor acción en cada situación,
  21. // basado en el mejor resultado seguro que causa (asumiendo...
  22. // que el rival juega bien), y en 2nda instancia el más probable
  23. // (asumiendo que el rival juegue al azar).
  24. // Repetir hasta resolver la lista 0.
  25. JuntosRequeridos = 2;
  26. CasillerosPorFila = 2;
  27. // Contando desde 0:
  28. MaxColumna = CasillerosPorFila-1;
  29. Casilleros = CasillerosPorFila*CasillerosPorFila;
  30. // Están numerados así:
  31. // 0 1
  32. // 2 3
  33. MaxCasillero = Casilleros-1;
  34. // En las listas L_SaE se irán poniendo las situaciones a...
  35. // experimentar que tengan _ signos colocados.
  36. // En la lista 0 se agregará una situación:
  37. L0SaE1 = [];
  38. // A continuación se especifica cual, agregando v
  39. // (que significa vacío) en lo que serían los casilleros,
  40. // los elementos del array:
  41. ValoraAgregar = -1;
  42. do {
  43. ValoraAgregar++;
  44. L0SaE1.push("v");
  45. } while (ValoraAgregar < MaxCasillero);
  46. delete ValoraAgregar;
  47. // Los datos de las situaciones no están en las listas,
  48. // se crean aparte. Con esta variable se evita repetidamente...
  49. // convertir en texto y concatenar:
  50. S_ = "S"+(L0SaE1.join(""));
  51. // Datos de la situación:
  52. // Usada para fácilmente saber de qué signo es turno:
  53. set (S_+"Turno", "X");
  54. // En otros casos usada para evitar probar acciones...
  55. // innecesarias y con LastAPosible para saber si sólo queda 1:
  56. set (S_+"FirstAPosible", 0);
  57. set (S_+"LastAPosible", MaxCasillero);
  58. NroDeListaRevisandose = -1;
  59. // Última lista que se revisará en la etapa 1:
  60. // LastListaDeEt1 = Casilleros;
  61. // /////////////////////////////////////////////
  62. // /////////////////  Etapa 1  /////////////////
  63. // /////////////////////////////////////////////
  64. // Consiste en llegar a nuevas situaciones y guardarlas,
  65. // si no son victoria. Termina antes de que pueda haber empates.
  66. //
  67. // Usada a continuación y durante la etapa 1 (Et1)...
  68. // cuando no hay más situaciones en la lista revisándose:
  69. function BuscarOtraListaEt1 () {
  70. trace("Ejecutando BuscarOtraListaEt1");
  71. NroDeListaRevisandose++;
  72. PrepararUsoDeLista();
  73. PrepararSaE();
  74. // Si las situaciones de la lista tienen más de 1 opción:
  75. if (NroDeListaRevisandose < MaxCasillero) {
  76. // Para evitar concatenar cosas al guardar datos de situaciones nuevas:
  77. NextL_SaE = "L"+(NroDeListaRevisandose+1)+"SaE";
  78. trace("NextL_SaE: "+NextL_SaE);
  79. // Usado en EvaluarConocimientoSobreSEt1 para...
  80. // nombrar las situaciones nuevas que se logren:
  81. SituacionesNuevas = 0;
  82. } else {
  83. trace( "La lista actual tiene situaciones de sólo 1 opción; inicia la etapa 2.");
  84. // Iniciar Etapa 2:
  85. gotoAndStop(3);
  86. }
  87. }
  88. BuscarOtraListaEt1();
  89. // Usada cuando se cambia de lista, en BuscarOtraListaEt1,
  90. // al comenzar Et2 y en Et3:
  91. function PrepararUsoDeLista () {
  92. trace("Ejecutando PrepararUsoDeLista");
  93. // Para evitar concatenar repetidamente:
  94. L_SaE = "L"+NroDeListaRevisandose+"SaE";
  95. trace("L_SaE: "+L_SaE);
  96. NroDeSExperimentandose = 1;
  97. // También para evitar concatenar repetidamente:
  98. // L_SaE_ = L_SaE+NroDeSExperimentandose;
  99. L_SaE_ = L_SaE+"1";
  100. trace("L_SaE_: "+L_SaE_);
  101. trace("Comienzan experimentos en una nueva lista, la "+NroDeListaRevisandose);
  102. }
  103. // Usada cuando se elige una SaE, en BuscarOtraListaEt1,
  104. // BuscarOtraSituacionEt1, BuscarOtraSituacionEt2 y PrepararSaEEt3:
  105. function PrepararSaE () {
  106. trace("Ejecutando PrepararSaE");
  107. trace("Se inician experimentos en otra situación de la lista, la nro "+NroDeSExperimentandose);
  108. SituacionBase = eval(L_SaE_).slice();
  109. S_ = "S"+(SituacionBase.join(""));
  110. Turno = eval(S_+"Turno");
  111. FirstActionPosible = eval(S_+"FirstAPosible");
  112. LastActionPosible = eval(S_+"LastAPosible");
  113. Action = FirstActionPosible;
  114. }
  115. // Usada en frame 2 (o etapa 1) repetidamente:
  116. function ResetearSituacionEt1 () {
  117. // Plantear situación porque puede modificarse pero...
  118. // podría requerirse su estado original luego:
  119. Situacion = SituacionBase.slice();
  120. trace("La situación experimentándose es "+Situacion);
  121. EvaluarAplicabilidadEt1();
  122. }
  123. // Usada luego de que cambia la SaE y/o la acción, en Et1:
  124. function EvaluarAplicabilidadEt1 () {
  125. trace("Ejecutando EvaluarAplicabilidadEt1");
  126. if (Situacion[Action] == "v") {
  127. trace("La acción "+Action+" es realizable.");
  128. AplicarAccionEt1();
  129. } else {
  130. trace("La acción "+Action+" no es realizable.");
  131. SinResetBuscarOtraAccionEt1();
  132. }
  133. }
  134. // Usada luego de EvaluarAplicabilidadEt1,
  135. // si una acción es realizable:
  136. function AplicarAccionEt1 () {
  137. trace("Ejecutando AplicarAccionEt1");
  138. Situacion[Action] = Turno;
  139. trace("Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  140. // ¿Ganó?
  141. // Si no se detecta victoria vertical,
  142. // revisa de otros modos (ver las funciones Chequear):
  143. ChequearVertical();
  144. if (Win == "No") {
  145. EvaluarConocimientoSobreSEt1();
  146. }
  147. // ¿Queda alguna acción sin probar en la situación?
  148. BuscarOtraAccionEt1();
  149. }
  150. // Usada en EvaluarAplicabilidadEt1 cuando una acción no es...
  151. // realizable:
  152. function SinResetBuscarOtraAccionEt1 () {
  153. trace("Ejecutando SinResetBuscarOtraAccionEt1");
  154. if (Action < LastActionPosible) {
  155. // Si queda alguna acción sin probar...
  156. // en la situación, probarla:
  157. Action++;
  158. EvaluarAplicabilidadEt1();
  159. } else {
  160. trace("No hay más acciones realizables.");
  161. BuscarOtraSituacionEt1();
  162. }
  163. }
  164. // Usada luego de AplicarAccionEt1:
  165. function BuscarOtraAccionEt1 () {
  166. trace("Ejecutando BuscarOtraAccionEt1");
  167. if (Action < LastActionPosible) {
  168. // Si queda alguna acción sin probar...
  169. // en la situación, probarla:
  170. Action++;
  171. // Se ejecutará ResetearSituacionEt1.
  172. } else {
  173. trace("No hay más acciones realizables.");
  174. BuscarOtraSituacionEt1();
  175. }
  176. }
  177. // Usada en AplicarAccionEt1 cuando no hay victoria (ni empate,
  178. // aunque por ahora no ocurren):
  179. function EvaluarConocimientoSobreSEt1 () {
  180. trace("Ejecutando EvaluarConocimientoSobreSEt1");
  181. // Estas 3 variables son para evitar reconcatenar:
  182. SituacionJoined = Situacion.join("");
  183. NewS_ = "S"+SituacionJoined;
  184. NewS_BestAction = NewS_+"BestAction";
  185. // ¿Se ha llegado antes a la situación?
  186. if (eval(NewS_BestAction) == undefined) {
  187. // No, anotar que debe investigarse:
  188. SituacionesNuevas++;
  189. // Copiar array (porque no se puede normalmente):
  190. trace("Situación a copiar a "+NextL_SaE+SituacionesNuevas+" es "+Situacion);
  191. set (NextL_SaE+SituacionesNuevas, Situacion.slice());
  192. trace("Esa situación no está anotada; se anota como nro "+SituacionesNuevas);
  193. set(NewS_BestAction, "Desconocida");
  194. if (Turno == "X") {
  195. set (NewS_+"Turno", "0");
  196. } else {
  197. set (NewS_+"Turno", "X");
  198. }
  199. // Averiguar cual es su 1er acción posible:
  200. AccionRevisandose = -1;
  201. do {
  202. AccionRevisandose++;
  203. if (Situacion[AccionRevisandose] == "v") {
  204. set (NewS_+"FirstAPosible", AccionRevisandose);
  205. break;
  206. }
  207. } while (true);
  208. // Averiguar cual es su última acción posible:
  209. AccionRevisandose = Casilleros;
  210. do {
  211. AccionRevisandose--;
  212. if (Situacion[AccionRevisandose] == "v") {
  213. set (NewS_+"LastAPosible", AccionRevisandose);
  214. break;
  215. }
  216. } while (true);
  217. }
  218. }
  219. // Usada en BuscarOtraAccionEt1 cuando no hay más acciones posibles,
  220. // y en SinResetBuscarOtraAccionEt1:
  221. function BuscarOtraSituacionEt1 () {
  222. trace("Ejecutando BuscarOtraSituacionEt1");
  223. NroDeSExperimentandose++;
  224. if (eval(L_SaE+NroDeSExperimentandose) != undefined) {
  225. // Hay otra situación en la lista,
  226. // prepararse a usarla:
  227. L_SaE_ = L_SaE+NroDeSExperimentandose;
  228. PrepararSaE();
  229. } else {
  230. trace("No hay más situaciones a experimentar en la lista actual, se mirará otra.");
  231. BuscarOtraListaEt1();
  232. }
  233. }
  234. // /////////////////////////////////////////////
  235. // /////////////////  Etapa 2  /////////////////
  236. // /////////////////////////////////////////////
  237. // Consiste en guardar el resultado de las situaciones en que...
  238. // sólo 1 acción es posible. Puede ser victoria o empate.
  239. //
  240. // Usada en frame 3 (o etapa 2) repetidamente:
  241. function ResetearSituacionEt2 () {
  242. // Plantear situación porque puede modificarse pero...
  243. // podría requerirse su estado original luego:
  244. Situacion = SituacionBase.slice();
  245. trace("La situación experimentándose es "+Situacion);
  246. AplicarAccionEt2();
  247. }
  248. // Usada luego de ResetearSituacionEt2, parece innecesario que sea función:
  249. function AplicarAccionEt2 () {
  250. trace("Ejecutando AplicarAccionEt2");
  251. Situacion[Action] = Turno;
  252. trace("Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  253. // ¿Ganó?
  254. // Si no se detecta victoria vertical,
  255. // revisa de otros modos (ver las funciones Chequear):
  256. ChequearVertical();
  257. set(S_+"BestAction", Action);
  258. if (Win == "Sí") {
  259. trace("Victoria conseguida, guardando datos.");
  260. if (Turno == "X") {
  261. // Estas son las chances de que gane...
  262. // X, 0 o que haya empate:
  263. set(S_+"VictoriasDeX", 1);
  264. set(S_+"VictoriasDe0", 0);
  265. set(S_+"ResultadoEsperado", "X");
  266. } else {
  267. set(S_+"VictoriasDeX", 0);
  268. set(S_+"VictoriasDe0", 1);
  269. set(S_+"ResultadoEsperado", "0");
  270. }
  271. set(S_+"DistanciaaGanar", 1);
  272. set(S_+"Empates", 0);
  273. } else {
  274. trace("Empate conseguido, guardando datos.");
  275. set(S_+"VictoriasDeX", 0);
  276. set(S_+"VictoriasDe0", 0);
  277. set(S_+"Empates", 1);
  278. set(S_+"ResultadoEsperado", "E");
  279. }
  280. // ¿Queda alguna situación en la lista experimentándose?
  281. BuscarOtraSituacionEt2();
  282. }
  283. // Usada luego de AplicarAccionEt2, parece innecesario que sea función:
  284. function BuscarOtraSituacionEt2 () {
  285. trace("Ejecutando BuscarOtraSituacionEt2");
  286. NroDeSExperimentandose++;
  287. if (eval(L_SaE+NroDeSExperimentandose) != undefined) {
  288. // Hay otra situación en la lista,
  289. // prepararse a usarla:
  290. L_SaE_ = L_SaE+NroDeSExperimentandose;
  291. PrepararSaE();
  292. } else {
  293. trace("No hay más situaciones a experimentar en la lista actual, inicia la etapa 3.");
  294. BuscarOtraListaEt3();
  295. gotoAndStop(4);
  296. }
  297. }
  298. // /////////////////////////////////////////////
  299. // /////////////////  Etapa 3  /////////////////
  300. // /////////////////////////////////////////////
  301. // Consiste en guardar los resultados de las acciones en...
  302. // situaciones en que más de 1 acción es posible.
  303. // Particularmente se guarda la mejor acción.
  304. // El resultado de las acciones puede ser victoria,
  305. // una situación con posibles resultados,
  306. // y en la penúltima lista una situación con un único posible...
  307. // resultado.
  308. //
  309. // Usada antes y durante esta etapa...
  310. // cuando no hay más situaciones en la lista revisándose:
  311. function BuscarOtraListaEt3 () {
  312. trace("Ejecutando BuscarOtraListaEt3");
  313. NroDeListaRevisandose--;
  314. if (NroDeListaRevisandose > -1) {
  315. // Si se halla una lista:
  316. PrepararUsoDeLista();
  317. PrepararSaEEt3();
  318. } else {
  319. trace("No hay más listas a revisar; programa terminado.");
  320. // En este frame nada hay, es sólo para mostrar el mensaje:
  321. gotoAndStop(5);
  322. }
  323. }
  324. // Casi como PrepararSaE. Usada cuando se elige una SaE,
  325. // en BuscarOtraListaEt3 y BuscarOtraSituacionEt3:
  326. function PrepararSaEEt3 () {
  327. trace("Ejecutando PrepararSaEEt3");
  328. PrepararSaE();
  329. // Para evitar evals y concatenaciones repetidamente:
  330. BestAction = "";
  331. VictoriasDeX = 0;
  332. VictoriasDe0 = 0;
  333. Empates = 0;
  334. // Establecer que hasta ahora los resultados hallados...
  335. // son peores que lo posible, para que se sustituyan por...
  336. // cualquier acción:
  337. if (Turno == "X") {
  338. // La E antes de Obtenido es Esperado:
  339. BestResultadoEObtenido = "0";
  340. } else {
  341. BestResultadoEObtenido = "X";
  342. }
  343. // Si 2 acciones causan victoria segura,
  344. // esto sirve para elegir la mejor de ellas:
  345. BestDistanciaaGanar = Casilleros;
  346. // Si 2 acciones causan empate seguro,
  347. // esto sirve para elegir la mejor de ellas:
  348. BestChanceDeGanarEnE = -1;
  349. BestChanceDeEmpatarEnE = -1;
  350. // Si 2 acciones causan derrota segura,
  351. // esto sirve para elegir la mejor de ellas:
  352. LowestChanceDePerderEnD = -1;
  353. BestChanceDeGanarEnD = -1;
  354. }
  355. // Usada en frame 4 (o etapa 3) repetidamente:
  356. function ResetearSituacionEt3 () {
  357. // Plantear situación porque puede modificarse pero...
  358. // podría requerirse su estado original luego:
  359. Situacion = SituacionBase.slice();
  360. trace("La situación experimentándose es "+Situacion);
  361. EvaluarAplicabilidadEt3();
  362. }
  363. // Usada luego de que cambia la SaE y/o la acción, en Et3:
  364. function EvaluarAplicabilidadEt3 () {
  365. trace("Ejecutando EvaluarAplicabilidadEt3");
  366. if (Situacion[Action] == "v") {
  367. trace("La acción "+Action+" es realizable.");
  368. AplicarAccionEt3();
  369. } else {
  370. trace("La acción "+Action+" no es realizable.");
  371. SinResetBuscarOtraAccionEt3();
  372. }
  373. }
  374. // Usada luego de EvaluarAplicabilidadEt3,
  375. // si una acción es realizable:
  376. function AplicarAccionEt3 () {
  377. // Los datos se guardarán bien en GuardarDatosEt3.
  378. // Por ahora varios se están guardando en variables más simples de nombrar.
  379. // Además algunos no se pueden guardar aún (VictoriasDeX, NewVictoriasDe0...).
  380. // Y DistanciaaGanar se está guardando como -1 de lo que debe, para no tener que estar sumando.
  381. trace("Ejecutando AplicarAccionEt3");
  382. Situacion[Action] = Turno;
  383. trace("Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  384. // ¿Ganó?
  385. // Si no se detecta victoria vertical,
  386. // revisa de otros modos (ver las funciones Chequear):
  387. ChequearVertical();
  388. if (Win == "No") {
  389. // Agregar los posibles resultados de la...
  390. // situación obtenida:
  391. // Estas 5 variables son para evitar reconcatenar:
  392. SituacionJoined = Situacion.join("");
  393. NewS_ = "S"+SituacionJoined;
  394. NewVictoriasDeX = eval(NewS_+"VictoriasDeX");
  395. NewVictoriasDe0 = eval(NewS_+"VictoriasDe0");
  396. NewEmpates = eval(NewS_+"Empates");
  397. VictoriasDeX = VictoriasDeX+NewVictoriasDeX;
  398. VictoriasDe0 = VictoriasDe0+NewVictoriasDe0;
  399. Empates = Empates+NewEmpates;
  400. // Si en la SaE ya se halló una acción que...
  401. // causa victoria segura:
  402. if (BestResultadoEObtenido == Turn) {
  403. // Si la acción recién usada también causa eso:
  404. if (eval(NewS_+"ResultadoEsperado") == Turn) {
  405. // Si dicha acción la causa faster:
  406. if (eval(NewS_+"DistanciaaGanar") < BestDistanciaaGanar) {
  407. // Sustituir datos:
  408. BestDistanciaaGanar = eval(NewS_+"DistanciaaGanar");
  409. BestAction = Action;
  410. }
  411. // SINO SI LA CAUSA IGUAL DE RÁPIDO HABRÍA QUE AVERIGUAR CHANCES, pero se gana igual...
  412. // sino dicha acción es peor, no prestarle más atención.
  413. }
  414. // idem.
  415. // sino si el mejor resultado esperado hallado...
  416. // en esta SaE es empate:
  417. } else if (BestResultadoEObtenido == "E") {
  418. // Si la acción recién usada causa que...
  419. // el resultado esperado sea victoria:
  420. if (eval(NewS_+"ResultadoEsperado") == Turn) {
  421. // Sustituir datos:
  422. BestResultadoEObtenido = Turn;
  423. BestDistanciaaGanar = eval(NewS_+"DistanciaaGanar");
  424. BestAction = Action;
  425. // sino si es empate:
  426. } else if (eval(NewS_+"ResultadoEsperado") == "E") {
  427. // Averiguar chance de victoria:
  428. Posibilidades = NewVictoriasDeX+NewVictoriasDe0+NewEmpates;
  429. ChanceDeGanar = eval("NewVictoriasDe"+Turno)*100/Posibilidades;
  430. // Si es mejor que la hallada antes:
  431. if (ChanceDeGanar > BestChanceDeGanarEnE) {
  432. // Sustituir datos:
  433. BestChanceDeGanarEnE = ChanceDeGanar;
  434. BestChanceDeEmpatarEnE = NewEmpates*100/Posibilidades;
  435. BestAction = Action;
  436. // sino si la chance es igual:
  437. } else if (ChanceDeGanar == BestChanceDeGanarEnE) {
  438. // Averiguar chance de empate:
  439. ChanceDeEmpatar = NewEmpates*100/Posibilidades;
  440. // Si es mejor que la hallada antes:
  441. if (ChanceDeEmpatar > BestChanceDeEmpatarEnE) {
  442. // Sustituir datos:
  443. BestChanceDeGanarEnE = ChanceDeGanar;
  444. BestChanceDeEmpatarEnE = ChanceDeEmpatar;
  445. BestAction = Action;
  446. }
  447. }
  448. // SINO SI LAS CHANCES SON LAS MISMAS HABRÍA QUE DECIDIR SI SE PREFIERE LA QUE LO CAUSA MÁS RÁPIDO O NO.
  449. // sino dicha acción no es mejor, no prestarle más atención.
  450. // idem.
  451. }
  452. // El resultado esperado es derrota:
  453. } else {
  454. // Si la acción recién usada causa que...
  455. // el resultado esperado sea victoria:
  456. if (eval(NewS_+"ResultadoEsperado") == Turn) {
  457. // Sustituir datos:
  458. BestResultadoEObtenido = Turn;
  459. BestDistanciaaGanar = eval(NewS_+"DistanciaaGanar");
  460. BestAction = Action;
  461. // sino si es empate:
  462. } else if (eval(NewS_+"ResultadoEsperado") == "E") {
  463. // Averiguar chances y sustituir datos:
  464. Posibilidades = NewVictoriasDeX+NewVictoriasDe0+NewEmpates;
  465. BestChanceDeGanarEnE = eval("NewVictoriasDe"+Turno)*100/Posibilidades;
  466. BestChanceDeEmpatarEnE = NewEmpatesDeX*100/Posibilidades;
  467. BestResultadoEObtenido = "E";
  468. BestAction = Action;
  469. // sino es derrota:
  470. } else {
  471. // Averiguar chance de perder:
  472. Posibilidades = NewVictoriasDeX+NewVictoriasDe0+NewEmpates;
  473. ChanceDePerder = (Posibilidades-eval("NewVictoriasDe"+Turno)*100/Posibilidades;
  474. // Si es más baja (mejor) que la hallada antes:
  475. if (ChanceDePerder < LowestChanceDePerderEnD) {
  476. // Sustituir datos:
  477. LowestChanceDePerderEnD = ChanceDePerder;
  478. BestChanceDeGanarEnD = eval("NewVictoriasDe"+Turno)*100/Posibilidades;
  479. BestAction = Action;
  480. // sino si la chance es igual:
  481. } else if (ChanceDePerder == LowestChanceDePerderEnD) {
  482. // Averiguar chance de victoria:
  483. ChanceDeGanar = eval("NewVictoriasDe"+Turno)*100/Posibilidades;
  484. // Si es mejor que la hallada antes:
  485. if (ChanceDeGanar > BestChanceDeGanarEnD) {
  486. // Sustituir datos:
  487. LowestChanceDePerderEnD = ChanceDePerder;
  488. BestChanceDeGanarEnD = ChanceDeGanar;
  489. BestAction = Action;
  490. }
  491. }
  492. }
  493. }
  494. // sino la acción causa una victoria inmediata:
  495. } else {
  496. // Incrementar victorias:
  497. // Esta es para evitar reconcatenar:
  498. VariableaIncrementar = "VictoriasDe"+Turno;
  499. set (VariableaIncrementar, eval(VariableaIncrementar)+1);
  500. if (BestDistanciaaGanar > 0) {
  501. // Sustituir datos:
  502. BestResultadoEObtenido = Turn;
  503. BestDistanciaaGanar = 0;
  504. BestAction = Action;
  505. }
  506. }
  507. // ¿Queda alguna acción sin probar en la situación?
  508. BuscarOtraAccionEt3();
  509. }
  510. // Usada en EvaluarAplicabilidadEt3 cuando una acción no es...
  511. // realizable:
  512. function SinResetBuscarOtraAccionEt3 () {
  513. trace("Ejecutando SinResetBuscarOtraAccionEt3");
  514. if (Action < LastActionPosible) {
  515. // Si queda alguna acción sin probar...
  516. // en la situación, probarla:
  517. Action++;
  518. EvaluarAplicabilidadEt3();
  519. } else {
  520. trace("No hay más acciones realizables.");
  521. BuscarOtraSituacionEt3();
  522. }
  523. }
  524. // Usada luego de AplicarAccionEt3:
  525. function BuscarOtraAccionEt3 () {
  526. trace("Ejecutando BuscarOtraAccionEt3");
  527. if (Action < LastActionPosible) {
  528. // Si queda alguna acción sin probar...
  529. // en la situación, probarla:
  530. Action++;
  531. // Se ejecutará ResetearSituacionEt3.
  532. } else {
  533. trace("No hay más acciones realizables.");
  534. BuscarOtraSituacionEt3();
  535. }
  536. }
  537. // Usada cuando no hay más acciones posibles:
  538. function GuardarDatosEt3 () {
  539. trace("Ejecutando GuardarDatosEt3");
  540. set(S_+"VictoriasDeX", VictoriasDeX);
  541. set(S_+"VictoriasDe0", VictoriasDe0);
  542. set(S_+"Empates", Empates);
  543. set(S_+"BestAction", BestAction);
  544. set(S_+"DistanciaaGanar", BestDistanciaaGanar+1);
  545. set(S_+"ResultadoEsperado", BestResultadoEObtenido);
  546. }
  547. // Usada en BuscarOtraAccionEt3 cuando no hay más acciones posibles,
  548. // y en SinResetBuscarOtraAccionEt3:
  549. function BuscarOtraSituacionEt3 () {
  550. trace("Ejecutando BuscarOtraSituacionEt3");
  551. NroDeSExperimentandose++;
  552. if (eval(L_SaE+NroDeSExperimentandose) != undefined) {
  553. // Hay otra situación en la lista,
  554. // prepararse a usarla:
  555. L_SaE_ = L_SaE+NroDeSExperimentandose;
  556. PrepararSaEEt3();
  557. } else {
  558. trace("No hay más situaciones a experimentar en la lista actual, se mirará otra.");
  559. BuscarOtraListaEt3();
  560. }
  561. }
  562. // /////////////////////////////////////////////
  563. // /////////////////  Chequeos  ////////////////
  564. // /////////////////////////////////////////////
  565. // Usada en ChequeoHorizontal y requerida en otros casos:
  566. function ObtenerColumnayFilaDelMarcado () {
  567. FilaDelMarcado = Math.floor(Action/CasillerosPorFila);
  568. ColumnaDelMarcado = Action%CasillerosPorFila;
  569. }
  570. function ChequearVertical () {
  571. // trace ("Ejecutando ChequearVertical");
  572. //
  573. // SOLO FUNCIONA SI CasillerosPorFila >= JuntosRequeridos.
  574. //
  575. // Se revisará la vertical. Desde el casillero más arriba...
  576. // que pueda estar incluído en la línea,
  577. // hasta el casillero marcado. Si se halla alguno que no...
  578. // tenga la marca requerida, se repite el proceso mirando...
  579. // desde uno más abajo del fallado, y mirando ahora hasta...
  580. // más abajo, según corresponda:
  581. Desde = Action-CasillerosPorFila*(JuntosRequeridos-1);
  582. // Mientras el casillero no exista:
  583. while (Desde<0) {
  584. // trace ("Desde es "+Desde+", se aumentará");
  585. // Indicar que se empiece a mirar desde más abajo:
  586. Desde = Desde+CasillerosPorFila;
  587. }
  588. do {
  589. Hasta = Desde+CasillerosPorFila*(JuntosRequeridos-1);
  590. if (Hasta>MaxCasillero) {
  591. // Para ganar se necesitaría más casilleros hacia...
  592. // abajo de los que hay, terminar análisis:
  593. // trace ("No hay suficientes cuadraditos abajo");
  594. break;
  595. }
  596. Puntero = Desde;
  597. // trace ("Comenzando chequeo desde "+Desde+" hasta "+Hasta);
  598. // Puede cambiar:
  599. Win = "Sí";
  600. do {
  601. // trace ("Chequando el casillero "+Puntero);
  602. if (Situacion[Action] != Situacion[Puntero]) {
  603. Win = "No";
  604. Desde = Puntero+CasillerosPorFila;
  605. break;
  606. }
  607. Puntero = Puntero+CasillerosPorFila;
  608. } while (Puntero<=Hasta);
  609. } while (Desde<=Action && Win == "No");
  610. if (Win == "No") {
  611. // ChequearHorizontal();
  612. }
  613. }
  614. function ChequearHorizontal () {
  615. // trace ("Ejecutando ChequearHorizontal");
  616. // Es similar al chequeo vertical, pero aquí no sirve...
  617. // sumar o restar a un puntero que marque el casillero...
  618. // porque puede existir ese casillero pero no estar en...
  619. // un costado. En vez de eso, se obtiene su columna y...
  620. // fila, se modifica la columna si es posible,
  621. // y se calcula cual es el casillero a mirar:
  622. ObtenerColumnayFilaDelMarcado();
  623. DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
  624. // Para que no mire cuadraditos inexistentes en la izq:
  625. if (DesdeColumna<0) {
  626. DesdeColumna = 0;
  627. }
  628. do {
  629. HastaColumna = DesdeColumna+JuntosRequeridos-1;
  630. if (HastaColumna>MaxColumna) {
  631. // Para ganar se necesitaría más casilleros hacia...
  632. // la derecha de los que hay, terminar análisis:
  633. // trace ("No hay suficientes cuadraditos a la derecha");
  634. break;
  635. }
  636. Puntero = DesdeColumna;
  637. // trace ("Comenzando chequeo desde "+DesdeColumna+" hasta "+HastaColumna);
  638. // Puede cambiar:
  639. Win = "Sí";
  640. do {
  641. CasilleroaMirar = FilaDelMarcado*CasillerosPorFila+Puntero;
  642. // trace ("Chequando el casillero "+CasilleroaMirar);
  643. if (Situacion[Action] != Situacion[CasilleroaMirar]) {
  644. Win = "No";
  645. DesdeColumna = Puntero+1;
  646. break;
  647. }
  648. Puntero++;
  649. } while (Puntero<=HastaColumna);
  650. } while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
  651. if (Win == "No") {
  652. ChequearDesdeUpIzq();
  653. }
  654. }
  655. // La diagonal así \
  656. function ChequearDesdeUpIzq () {
  657. // trace ("Ejecutando ChequearDesdeUpIzq");
  658. DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
  659. // trace("DesdeColumna: "+DesdeColumna);
  660. DesdeFila = FilaDelMarcado-JuntosRequeridos+1;
  661. // trace("DesdeFila: "+DesdeFila);
  662. // Para que no mire cuadraditos inexistentes:
  663. if (DesdeColumna<DesdeFila) {
  664. Sumar = DesdeColumna;
  665. } else {
  666. Sumar = DesdeFila;
  667. }
  668. // trace("Sumar: "+Sumar);
  669. if (Sumar<0) {
  670. // trace("Sumando.");
  671. DesdeColumna = DesdeColumna-Sumar;
  672. // trace("DesdeColumna: "+DesdeColumna);
  673. DesdeFila = DesdeFila-Sumar;
  674. // trace("DesdeFila: "+DesdeFila);
  675. }
  676. do {
  677. HastaColumna = DesdeColumna+JuntosRequeridos-1;
  678. if (HastaColumna>MaxColumna) {
  679. // Para ganar se necesitaría más casilleros hacia...
  680. // la derecha de los que hay, terminar análisis:
  681. // trace ("No hay suficientes cuadraditos a la derecha");
  682. break;
  683. }
  684. HastaFila = DesdeFila+JuntosRequeridos-1;
  685. // Sirve usar MaxColumna en vez de crear MaxFila...
  686. // porque como el tablero es cuadrado serían iguales:
  687. if (HastaFila>MaxColumna) {
  688. // Para ganar se necesitaría más casilleros hacia...
  689. // abajo de los que hay, terminar análisis:
  690. // trace ("No hay suficientes cuadraditos abajo");
  691. break;
  692. }
  693. PunteroDeColumna = DesdeColumna;
  694. PunteroDeFila = DesdeFila;
  695. // trace ("Comenzando chequeo desde columna "+DesdeColumna+" y fila "+DesdeFila);
  696. // trace ("hasta columna "+HastaColumna+" y fila "+HastaFila);
  697. // Puede cambiar:
  698. Win = "Sí";
  699. do {
  700. CasilleroaMirar = PunteroDeFila*CasillerosPorFila+PunteroDeColumna;
  701. // trace ("Chequando el casillero "+CasilleroaMirar);
  702. if (Situacion[Action] != Situacion[CasilleroaMirar]) {
  703. Win = "No";
  704. DesdeColumna = PunteroDeColumna+1;
  705. DesdeFila = PunteroDeFila+1;
  706. break;
  707. }
  708. PunteroDeColumna++;
  709. PunteroDeFila++;
  710. } while (PunteroDeColumna<=HastaColumna);
  711. } while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
  712. if (Win == "No") {
  713. ChequearDesdeDownIzq();
  714. }
  715. }
  716. // La diagonal así /
  717. function ChequearDesdeDownIzq () {
  718. // trace ("Ejecutando ChequearDesdeDownIzq");
  719. DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
  720. // trace("DesdeColumna: "+DesdeColumna);
  721. DesdeFila = FilaDelMarcado+JuntosRequeridos-1;
  722. // trace("DesdeFila: "+DesdeFila);
  723. // Para que no mire cuadraditos inexistentes:
  724. ColumnasInexistentes = 0;
  725. if (DesdeColumna<0) {
  726. ColumnasInexistentes = DesdeColumna*-1;
  727. }
  728. FilasInexistentes = 0;
  729. // Está bien usar MaxColumna porque MaxFila sería igual:
  730. if (DesdeFila>MaxColumna) {
  731. FilasInexistentes = DesdeFila-MaxColumna;
  732. }
  733. if (ColumnasInexistentes>=FilasInexistentes) {
  734. Ajuste = ColumnasInexistentes;
  735. } else {
  736. Ajuste = FilasInexistentes;
  737. }
  738. // trace("Ajuste: "+Ajuste);
  739. if (Ajuste>0) {
  740. // trace("Ajustando.");
  741. DesdeColumna = DesdeColumna+Ajuste;
  742. // trace("DesdeColumna: "+DesdeColumna);
  743. DesdeFila = DesdeFila-Ajuste;
  744. // trace("DesdeFila: "+DesdeFila);
  745. }
  746. do {
  747. HastaColumna = DesdeColumna+JuntosRequeridos-1;
  748. if (HastaColumna>MaxColumna) {
  749. // Para ganar se necesitaría más casilleros hacia...
  750. // la derecha de los que hay, terminar análisis:
  751. // trace ("No hay suficientes cuadraditos a la derecha");
  752. break;
  753. }
  754. HastaFila = DesdeFila-JuntosRequeridos+1;
  755. if (HastaFila<0) {
  756. // Para ganar se necesitaría más casilleros hacia...
  757. // arriba de los que hay, terminar análisis:
  758. // trace ("No hay suficientes cuadraditos arriba");
  759. break;
  760. }
  761. PunteroDeColumna = DesdeColumna;
  762. PunteroDeFila = DesdeFila;
  763. // trace ("Comenzando chequeo desde columna "+DesdeColumna+" y fila "+DesdeFila);
  764. // trace ("hasta columna "+HastaColumna+" y fila "+HastaFila);
  765. // Puede cambiar:
  766. Win = "Sí";
  767. do {
  768. CasilleroaMirar = PunteroDeFila*CasillerosPorFila+PunteroDeColumna;
  769. // trace ("Chequando el casillero "+CasilleroaMirar);
  770. if (Situacion[Action] != Situacion[CasilleroaMirar]) {
  771. Win = "No";
  772. DesdeColumna = PunteroDeColumna+1;
  773. DesdeFila = PunteroDeFila-1;
  774. break;
  775. }
  776. PunteroDeColumna++;
  777. PunteroDeFila--;
  778. } while (PunteroDeColumna<=HastaColumna);
  779. } while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
  780. // trace("Win: "+Win);
  781. }


En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.687


Hackentifiko!


Ver Perfil
Re: Posible aporte: Código para jugar bien Signos en línea, aún no probado.
« Respuesta #1 en: 20 Septiembre 2025, 03:45 am »

No comenzaba, debido a errores que corregí, pero la etapa 3 no funciona bien. Intenté poner traces en ella para entender mejor qué está pasando pero me entrevera lo de mejor resultado hallado y resultado esperado.
Código
  1. // Signos en línea en tableros cuadrados:
  2. // Este programa tiene básicamente 3 etapas,
  3. // que se pueden resumir así:
  4. // Nota: La situación inicial, en que hay 0 signos colocados,
  5. // estará guardada en la lista nro 0.      
  6. // 1:
  7. // Probar acciones en cada situación de la lista nro 0,
  8. // guardando en una nueva lista las nuevas situaciones (que no...
  9. // sean victoria ni empate). Repetir con cada nueva lista hasta...
  10. // la que tenga situaciones en que sólo 1 acción es posible
  11. // (por ejemplo en el 3 en línea es la 8).
  12. // 2:
  13. // Probar acciones en cada situación de la última lista,
  14. // guardando datos sobre las consecuencias (victoria o empate)
  15. // de realizar la única acción posible.
  16. // 3:
  17. // En las situaciones no resueltas, empezando por las...
  18. // penúltimas listas, probar las acciones.
  19. // Guardar cuántas acciones causan victoria de uno, de otro y...
  20. // de empate. Averiguar la mejor acción en cada situación,
  21. // basado en el mejor resultado seguro que causa (asumiendo...
  22. // que el rival juega bien), y en 2nda instancia el más probable
  23. // (asumiendo que el rival juegue al azar).
  24. // Repetir hasta resolver la lista 0.
  25. JuntosRequeridos = 2;
  26. CasillerosPorFila = 2;
  27. // Contando desde 0:
  28. MaxColumna = CasillerosPorFila-1;
  29. Casilleros = CasillerosPorFila*CasillerosPorFila;
  30. // Están numerados así:
  31. // 0 1
  32. // 2 3
  33. MaxCasillero = Casilleros-1;
  34. // En las listas L_SaE se irán poniendo las situaciones a...
  35. // experimentar que tengan _ signos colocados.
  36. // En la lista 0 se agregará una situación:
  37. L0SaE1 = [];
  38. // A continuación se especifica cual, agregando v
  39. // (que significa vacío) en lo que serían los casilleros,
  40. // los elementos del array:
  41. ValoraAgregar = -1;
  42. do {
  43. ValoraAgregar++;
  44. L0SaE1.push("v");
  45. } while (ValoraAgregar < MaxCasillero);
  46. delete ValoraAgregar;
  47. // Los datos de las situaciones no están en las listas,
  48. // se crean aparte. Con esta variable se evita repetidamente...
  49. // convertir en texto y concatenar:
  50. S_ = "S"+(L0SaE1.join(""));
  51. // Datos de la situación:
  52. // Usada para fácilmente saber de qué signo es turno:
  53. set (S_+"Turno", "X");
  54. // En otros casos usada para evitar probar acciones...
  55. // innecesarias y con LastAPosible para saber si sólo queda 1:
  56. set (S_+"FirstAPosible", 0);
  57. set (S_+"LastAPosible", MaxCasillero);
  58. NroDeListaRevisandose = -1;
  59. // Última lista que se revisará en la etapa 1:
  60. // LastListaDeEt1 = Casilleros;
  61. // /////////////////////////////////////////////
  62. // /////////////////  Etapa 1  /////////////////
  63. // /////////////////////////////////////////////
  64. // Consiste en llegar a nuevas situaciones y guardarlas,
  65. // si no son victoria. Termina antes de que pueda haber empates.
  66. //
  67. // Usada a continuación y durante la etapa 1 (Et1)...
  68. // cuando no hay más situaciones en la lista revisándose:
  69. function BuscarOtraListaEt1 () {
  70. trace("Ejecutando BuscarOtraListaEt1");
  71. NroDeListaRevisandose++;
  72. PrepararUsoDeLista();
  73. PrepararSaE();
  74. // Si las situaciones de la lista tienen más de 1 opción:
  75. if (NroDeListaRevisandose < MaxCasillero) {
  76. // Para evitar concatenar cosas al guardar datos de situaciones nuevas:
  77. NextL_SaE = "L"+(NroDeListaRevisandose+1)+"SaE";
  78. // trace("NextL_SaE: "+NextL_SaE);
  79. // Usado en EvaluarConocimientoSobreSEt1 para...
  80. // nombrar las situaciones nuevas que se logren:
  81. SituacionesNuevas = 0;
  82. } else {
  83. trace( "La lista actual tiene situaciones de sólo 1 opción; inicia la etapa 2.");
  84. // Iniciar Etapa 2:
  85. gotoAndStop(3);
  86. }
  87. }
  88. BuscarOtraListaEt1();
  89. // Usada cuando se cambia de lista, en BuscarOtraListaEt1,
  90. // al comenzar Et2 y en Et3:
  91. function PrepararUsoDeLista () {
  92. trace("Ejecutando PrepararUsoDeLista");
  93. // Para evitar concatenar repetidamente:
  94. L_SaE = "L"+NroDeListaRevisandose+"SaE";
  95. // trace("L_SaE: "+L_SaE);
  96. NroDeSExperimentandose = 1;
  97. // También para evitar concatenar repetidamente:
  98. // L_SaE_ = L_SaE+NroDeSExperimentandose;
  99. L_SaE_ = L_SaE+"1";
  100. // trace("L_SaE_: "+L_SaE_);
  101. trace("La lista preparada es la "+NroDeListaRevisandose);
  102. }
  103. // Usada cuando se elige una SaE, en BuscarOtraListaEt1,
  104. // BuscarOtraSituacionEt1, BuscarOtraSituacionEt2 y PrepararSaEEt3:
  105. function PrepararSaE () {
  106. trace("Ejecutando PrepararSaE");
  107. SituacionBase = eval(L_SaE_).slice();
  108. trace("Se inician experimentos en otra situación de la lista, la nro "+NroDeSExperimentandose+", que es "+SituacionBase);
  109. S_ = "S"+(SituacionBase.join(""));
  110. Turno = eval(S_+"Turno");
  111. FirstActionPosible = eval(S_+"FirstAPosible");
  112. LastActionPosible = eval(S_+"LastAPosible");
  113. Action = FirstActionPosible;
  114. }
  115. // Usada en frame 2 (o etapa 1) repetidamente:
  116. function ResetearSituacionEt1 () {
  117. trace("Ejecutando ResetearSituacionEt1");
  118. // Plantear situación porque puede modificarse pero...
  119. // podría requerirse su estado original luego:
  120. Situacion = SituacionBase.slice();
  121. // trace("La situación experimentándose es "+Situacion);
  122. EvaluarAplicabilidadEt1();
  123. }
  124. // Usada luego de que cambia la SaE y/o la acción, en Et1:
  125. function EvaluarAplicabilidadEt1 () {
  126. trace("Ejecutando EvaluarAplicabilidadEt1");
  127. if (Situacion[Action] == "v") {
  128. trace("La acción "+Action+" es realizable.");
  129. AplicarAccionEt1();
  130. } else {
  131. trace("La acción "+Action+" no es realizable.");
  132. SinResetBuscarOtraAccionEt1();
  133. }
  134. }
  135. // Usada luego de EvaluarAplicabilidadEt1,
  136. // si una acción es realizable:
  137. function AplicarAccionEt1 () {
  138. trace("Ejecutando AplicarAccionEt1");
  139. Situacion[Action] = Turno;
  140. trace("Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  141. // ¿Ganó?
  142. // Si no se detecta victoria vertical,
  143. // revisa de otros modos (ver las funciones Chequear):
  144. ChequearVertical();
  145. if (Win == "No") {
  146. EvaluarConocimientoSobreSEt1();
  147. }
  148. // ¿Queda alguna acción sin probar en la situación?
  149. BuscarOtraAccionEt1();
  150. }
  151. // Usada en EvaluarAplicabilidadEt1 cuando una acción no es...
  152. // realizable:
  153. function SinResetBuscarOtraAccionEt1 () {
  154. trace("Ejecutando SinResetBuscarOtraAccionEt1");
  155. if (Action < LastActionPosible) {
  156. // Si queda alguna acción sin probar...
  157. // en la situación, probarla:
  158. Action++;
  159. EvaluarAplicabilidadEt1();
  160. } else {
  161. trace("No hay más acciones realizables.");
  162. BuscarOtraSituacionEt1();
  163. }
  164. }
  165. // Usada luego de AplicarAccionEt1:
  166. function BuscarOtraAccionEt1 () {
  167. trace("Ejecutando BuscarOtraAccionEt1");
  168. if (Action < LastActionPosible) {
  169. // Si queda alguna acción sin probar...
  170. // en la situación, probarla:
  171. Action++;
  172. trace("La nueva acción a probar es "+Action);
  173. // Se ejecutará ResetearSituacionEt1.
  174. } else {
  175. trace("No hay más acciones realizables.");
  176. BuscarOtraSituacionEt1();
  177. }
  178. }
  179. // Usada en AplicarAccionEt1 cuando no hay victoria (ni empate,
  180. // aunque por ahora no ocurren):
  181. function EvaluarConocimientoSobreSEt1 () {
  182. trace("Ejecutando EvaluarConocimientoSobreSEt1");
  183. // Estas 3 variables son para evitar reconcatenar:
  184. SituacionJoined = Situacion.join("");
  185. NewS_ = "S"+SituacionJoined;
  186. NewS_BestAction = NewS_+"BestAction";
  187. // ¿Se ha llegado antes a la situación?
  188. if (eval(NewS_BestAction) == undefined) {
  189. // No, anotar que debe investigarse:
  190. SituacionesNuevas++;
  191. // Copiar array (porque no se puede normalmente):
  192. trace("Situación a copiar a "+NextL_SaE+SituacionesNuevas+" es "+Situacion);
  193. set (NextL_SaE+SituacionesNuevas, Situacion.slice());
  194. trace("Esa situación no está anotada; se anota como nro "+SituacionesNuevas);
  195. // trace(" NewS_: "+NewS_);
  196. // trace(" NewS_BestAction: "+NewS_BestAction);
  197. set(NewS_BestAction, "Desconocida");
  198. if (Turno == "X") {
  199. set (NewS_+"Turno", "0");
  200. } else {
  201. set (NewS_+"Turno", "X");
  202. }
  203. // Averiguar cual es su 1er acción posible:
  204. AccionRevisandose = -1;
  205. do {
  206. AccionRevisandose++;
  207. if (Situacion[AccionRevisandose] == "v") {
  208. set (NewS_+"FirstAPosible", AccionRevisandose);
  209. break;
  210. }
  211. } while (true);
  212. // Averiguar cual es su última acción posible:
  213. AccionRevisandose = Casilleros;
  214. do {
  215. AccionRevisandose--;
  216. if (Situacion[AccionRevisandose] == "v") {
  217. set (NewS_+"LastAPosible", AccionRevisandose);
  218. break;
  219. }
  220. } while (true);
  221. }
  222. }
  223. // Usada en BuscarOtraAccionEt1 cuando no hay más acciones posibles,
  224. // y en SinResetBuscarOtraAccionEt1:
  225. function BuscarOtraSituacionEt1 () {
  226. trace("Ejecutando BuscarOtraSituacionEt1");
  227. NroDeSExperimentandose++;
  228. if (eval(L_SaE+NroDeSExperimentandose) != undefined) {
  229. // Hay otra situación en la lista,
  230. // prepararse a usarla:
  231. L_SaE_ = L_SaE+NroDeSExperimentandose;
  232. PrepararSaE();
  233. } else {
  234. trace("No hay más situaciones a experimentar en la lista actual, se mirará otra.");
  235. BuscarOtraListaEt1();
  236. }
  237. }
  238. // /////////////////////////////////////////////
  239. // /////////////////  Etapa 2  /////////////////
  240. // /////////////////////////////////////////////
  241. // Consiste en guardar el resultado de las situaciones en que...
  242. // sólo 1 acción es posible. Puede ser victoria o empate.
  243. //
  244. // Usada en frame 3 (o etapa 2) repetidamente:
  245. function ResetearSituacionEt2 () {
  246. trace("Ejecutando ResetearSituacionEt2");
  247. // Plantear situación porque puede modificarse pero...
  248. // podría requerirse su estado original luego:
  249. Situacion = SituacionBase.slice();
  250. trace("La situación experimentándose es "+Situacion);
  251. AplicarAccionEt2();
  252. }
  253. // Usada luego de ResetearSituacionEt2, parece innecesario que sea función:
  254. function AplicarAccionEt2 () {
  255. trace("Ejecutando AplicarAccionEt2");
  256. Situacion[Action] = Turno;
  257. trace("Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  258. // ¿Ganó?
  259. // Si no se detecta victoria vertical,
  260. // revisa de otros modos (ver las funciones Chequear):
  261. ChequearVertical();
  262. set(S_+"BestAction", Action);
  263. if (Win == "Sí") {
  264. trace("Victoria conseguida, guardando datos.");
  265. if (Turno == "X") {
  266. // Estas son las chances de que gane...
  267. // X, 0 o que haya empate:
  268. set(S_+"VictoriasDeX", 1);
  269. set(S_+"VictoriasDe0", 0);
  270. set(S_+"ResultadoEsperado", "X");
  271. } else {
  272. set(S_+"VictoriasDeX", 0);
  273. set(S_+"VictoriasDe0", 1);
  274. set(S_+"ResultadoEsperado", "0");
  275. }
  276. set(S_+"DistanciaaGanar", 1);
  277. set(S_+"Empates", 0);
  278. } else {
  279. trace("Empate conseguido, guardando datos.");
  280. set(S_+"VictoriasDeX", 0);
  281. set(S_+"VictoriasDe0", 0);
  282. set(S_+"Empates", 1);
  283. set(S_+"ResultadoEsperado", "E");
  284. }
  285. // ¿Queda alguna situación en la lista experimentándose?
  286. BuscarOtraSituacionEt2();
  287. }
  288. // Usada luego de AplicarAccionEt2, parece innecesario que sea función:
  289. function BuscarOtraSituacionEt2 () {
  290. trace("Ejecutando BuscarOtraSituacionEt2");
  291. NroDeSExperimentandose++;
  292. if (eval(L_SaE+NroDeSExperimentandose) != undefined) {
  293. // Hay otra situación en la lista,
  294. // prepararse a usarla:
  295. L_SaE_ = L_SaE+NroDeSExperimentandose;
  296. PrepararSaE();
  297. } else {
  298. trace("No hay más situaciones a experimentar en la lista actual, inicia la etapa 3.");
  299. BuscarOtraListaEt3();
  300. gotoAndStop(4);
  301. }
  302. }
  303. // /////////////////////////////////////////////
  304. // /////////////////  Etapa 3  /////////////////
  305. // /////////////////////////////////////////////
  306. // Consiste en guardar los resultados de las acciones en...
  307. // situaciones en que más de 1 acción es posible.
  308. // Particularmente se guarda la mejor acción.
  309. // El resultado de las acciones puede ser victoria,
  310. // una situación con posibles resultados,
  311. // y en la penúltima lista una situación con un único posible...
  312. // resultado.
  313. //
  314. // Usada antes y durante esta etapa...
  315. // cuando no hay más situaciones en la lista revisándose:
  316. function BuscarOtraListaEt3 () {
  317. trace("Ejecutando BuscarOtraListaEt3");
  318. NroDeListaRevisandose--;
  319. if (NroDeListaRevisandose > -1) {
  320. // Si se halla una lista:
  321. PrepararUsoDeLista();
  322. PrepararSaEEt3();
  323. } else {
  324. trace("No hay más listas a revisar; programa terminado.");
  325. // En este frame nada hay, es sólo para mostrar el mensaje:
  326. gotoAndStop(5);
  327. }
  328. }
  329. // Casi como PrepararSaE. Usada cuando se elige una SaE,
  330. // en BuscarOtraListaEt3 y BuscarOtraSituacionEt3:
  331. function PrepararSaEEt3 () {
  332. trace("Ejecutando PrepararSaEEt3");
  333. PrepararSaE();
  334. // Para evitar evals y concatenaciones repetidamente:
  335. BestAction = "";
  336. VictoriasDeX = 0;
  337. VictoriasDe0 = 0;
  338. Empates = 0;
  339. // Establecer que hasta ahora los resultados hallados...
  340. // son peores que lo posible, para que se sustituyan por...
  341. // cualquier acción:
  342. if (Turno == "X") {
  343. // La E antes de Obtenido es Esperado:
  344. BestResultadoEObtenido = "0";
  345. } else {
  346. BestResultadoEObtenido = "X";
  347. }
  348. // Si 2 acciones causan victoria segura,
  349. // esto sirve para elegir la mejor de ellas:
  350. BestDistanciaaGanar = Casilleros;
  351. // Si 2 acciones causan empate seguro,
  352. // esto sirve para elegir la mejor de ellas:
  353. BestChanceDeGanarEnE = -1;
  354. BestChanceDeEmpatarEnE = -1;
  355. // Si 2 acciones causan derrota segura,
  356. // esto sirve para elegir la mejor de ellas:
  357. LowestChanceDePerderEnD = -1;
  358. BestChanceDeGanarEnD = -1;
  359. }
  360. // Usada en frame 4 (o etapa 3) repetidamente:
  361. function ResetearSituacionEt3 () {
  362. // Plantear situación porque puede modificarse pero...
  363. // podría requerirse su estado original luego:
  364. Situacion = SituacionBase.slice();
  365. trace("La situación experimentándose es "+Situacion);
  366. EvaluarAplicabilidadEt3();
  367. }
  368. // Usada luego de que cambia la SaE y/o la acción, en Et3:
  369. function EvaluarAplicabilidadEt3 () {
  370. trace("Ejecutando EvaluarAplicabilidadEt3");
  371. if (Situacion[Action] == "v") {
  372. trace("La acción "+Action+" es realizable.");
  373. AplicarAccionEt3();
  374. } else {
  375. trace("La acción "+Action+" no es realizable.");
  376. SinResetBuscarOtraAccionEt3();
  377. }
  378. }
  379. // Usada luego de EvaluarAplicabilidadEt3,
  380. // si una acción es realizable:
  381. function AplicarAccionEt3 () {
  382. // Los datos se guardarán bien en GuardarDatosEt3.
  383. // Por ahora varios se están guardando en variables más simples de nombrar.
  384. // Además algunos no se pueden guardar aún (VictoriasDeX, NewVictoriasDe0...).
  385. // Y DistanciaaGanar se está guardando como -1 de lo que debe, para no tener que estar sumando.
  386. trace("Ejecutando AplicarAccionEt3");
  387. Situacion[Action] = Turno;
  388. trace("Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  389. // ¿Ganó?
  390. // Si no se detecta victoria vertical,
  391. // revisa de otros modos (ver las funciones Chequear):
  392. ChequearVertical();
  393. if (Win == "No") {
  394. trace("No hubo victoria, agregando datos...");
  395. // Agregar los posibles resultados de la...
  396. // situación obtenida:
  397. // Estas 5 variables son para evitar reconcatenar:
  398. SituacionJoined = Situacion.join("");
  399. NewS_ = "S"+SituacionJoined;
  400. NewVictoriasDeX = eval(NewS_+"VictoriasDeX");
  401. NewVictoriasDe0 = eval(NewS_+"VictoriasDe0");
  402. NewEmpates = eval(NewS_+"Empates");
  403. VictoriasDeX = VictoriasDeX+NewVictoriasDeX;
  404. VictoriasDe0 = VictoriasDe0+NewVictoriasDe0;
  405. Empates = Empates+NewEmpates;
  406. trace(VictoriasDeX+", "+VictoriasDe0+", "+Empates);
  407. // Si en la SaE ya se halló una acción que...
  408. // causa victoria segura:
  409. if (BestResultadoEObtenido == Turn) {
  410. trace("El mejor resultado logrado es victoria");
  411. // Si la acción recién usada también causa eso:
  412. if (eval(NewS_+"ResultadoEsperado") == Turn) {
  413. trace("La acción causa victoria segura (no inmediata)");
  414. trace("Pero ya se halló otra, se verá cual causa más rápido");
  415. // Si dicha acción la causa faster:
  416. if (eval(NewS_+"DistanciaaGanar") < BestDistanciaaGanar) {
  417. // Sustituir datos:
  418. trace("La nueva fue mejor, sustituyendo datos...");
  419. BestDistanciaaGanar = eval(NewS_+"DistanciaaGanar");
  420. BestAction = Action;
  421. }
  422. // SINO SI LA CAUSA IGUAL DE RÁPIDO HABRÍA QUE AVERIGUAR CHANCES, pero se gana igual...
  423. // sino dicha acción es peor, no prestarle más atención.
  424. }
  425. // idem.
  426. // sino si el mejor resultado esperado hallado...
  427. // en esta SaE es empate:
  428. } else if (BestResultadoEObtenido == "E") {
  429. trace("Por ahora el mejor resultado logrado es empate");
  430. // Si la acción recién usada causa que...
  431. // el resultado esperado sea victoria:
  432. if (eval(NewS_+"ResultadoEsperado") == Turn) {
  433. // Sustituir datos:
  434. trace("La acción causa victoria segura (no inmediata)");
  435. trace("Sustituyendo datos...");
  436. BestResultadoEObtenido = Turn;
  437. BestDistanciaaGanar = eval(NewS_+"DistanciaaGanar");
  438. BestAction = Action;
  439. // sino si es empate:
  440. } else if (eval(NewS_+"ResultadoEsperado") == "E") {
  441. trace("La acción causa empate seguro (no inmediato)");
  442. // Averiguar chance de victoria:
  443. Posibilidades = NewVictoriasDeX+NewVictoriasDe0+NewEmpates;
  444. ChanceDeGanar = eval("NewVictoriasDe"+Turno)*100/Posibilidades;
  445. // Si es mejor que la hallada antes:
  446. if (ChanceDeGanar > BestChanceDeGanarEnE) {
  447. // Sustituir datos:
  448. BestChanceDeGanarEnE = ChanceDeGanar;
  449. BestChanceDeEmpatarEnE = NewEmpates*100/Posibilidades;
  450. BestAction = Action;
  451. // sino si la chance es igual:
  452. } else if (ChanceDeGanar == BestChanceDeGanarEnE) {
  453. // Averiguar chance de empate:
  454. ChanceDeEmpatar = NewEmpates*100/Posibilidades;
  455. // Si es mejor que la hallada antes:
  456. if (ChanceDeEmpatar > BestChanceDeEmpatarEnE) {
  457. // Sustituir datos:
  458. // BestChanceDeGanarEnE = ChanceDeGanar;
  459. BestChanceDeEmpatarEnE = ChanceDeEmpatar;
  460. BestAction = Action;
  461. }
  462. }
  463. // SINO SI LAS CHANCES SON LAS MISMAS HABRÍA QUE DECIDIR SI SE PREFIERE LA QUE LO CAUSA MÁS RÁPIDO O NO.
  464. // sino dicha acción no es mejor, no prestarle más atención.
  465. // idem.
  466. }
  467. // El resultado esperado es derrota:
  468. } else {
  469. // Si la acción recién usada causa que...
  470. // el resultado esperado sea victoria:
  471. if (eval(NewS_+"ResultadoEsperado") == Turn) {
  472. // Sustituir datos:
  473. BestResultadoEObtenido = Turn;
  474. BestDistanciaaGanar = eval(NewS_+"DistanciaaGanar");
  475. BestAction = Action;
  476. // sino si es empate:
  477. } else if (eval(NewS_+"ResultadoEsperado") == "E") {
  478. // Averiguar chances y sustituir datos:
  479. Posibilidades = NewVictoriasDeX+NewVictoriasDe0+NewEmpates;
  480. BestChanceDeGanarEnE = eval("NewVictoriasDe"+Turno)*100/Posibilidades;
  481. BestChanceDeEmpatarEnE = NewEmpates*100/Posibilidades;
  482. BestResultadoEObtenido = "E";
  483. BestAction = Action;
  484. // sino es derrota:
  485. } else {
  486. // Averiguar chance de perder:
  487. Posibilidades = NewVictoriasDeX+NewVictoriasDe0+NewEmpates;
  488. ChanceDePerder = 100-(eval("NewVictoriasDe"+Turno)+NewEmpates)*100/Posibilidades;
  489. // Si es más baja (mejor) que la hallada antes:
  490. if (ChanceDePerder < LowestChanceDePerderEnD) {
  491. // Sustituir datos:
  492. LowestChanceDePerderEnD = ChanceDePerder;
  493. BestChanceDeGanarEnD = eval("NewVictoriasDe"+Turno)*100/Posibilidades;
  494. BestAction = Action;
  495. // sino si la chance es igual:
  496. } else if (ChanceDePerder == LowestChanceDePerderEnD) {
  497. // Averiguar chance de victoria:
  498. ChanceDeGanar = eval("NewVictoriasDe"+Turno)*100/Posibilidades;
  499. // Si es mejor que la hallada antes:
  500. if (ChanceDeGanar > BestChanceDeGanarEnD) {
  501. // Sustituir datos:
  502. LowestChanceDePerderEnD = ChanceDePerder;
  503. BestChanceDeGanarEnD = ChanceDeGanar;
  504. BestAction = Action;
  505. }
  506. }
  507. }
  508. }
  509. // sino la acción causa una victoria inmediata:
  510. } else {
  511. // Incrementar victorias:
  512. // Esta es para evitar reconcatenar:
  513. VariableaIncrementar = "VictoriasDe"+Turno;
  514. set (VariableaIncrementar, eval(VariableaIncrementar)+1);
  515. if (BestDistanciaaGanar > 0) {
  516. // Sustituir datos:
  517. BestResultadoEObtenido = Turn;
  518. BestDistanciaaGanar = 0;
  519. BestAction = Action;
  520. }
  521. }
  522. // ¿Queda alguna acción sin probar en la situación?
  523. BuscarOtraAccionEt3();
  524. }
  525. // Usada en EvaluarAplicabilidadEt3 cuando una acción no es...
  526. // realizable:
  527. function SinResetBuscarOtraAccionEt3 () {
  528. trace("Ejecutando SinResetBuscarOtraAccionEt3");
  529. if (Action < LastActionPosible) {
  530. // Si queda alguna acción sin probar...
  531. // en la situación, probarla:
  532. Action++;
  533. EvaluarAplicabilidadEt3();
  534. } else {
  535. trace("No hay más acciones realizables.");
  536. BuscarOtraSituacionEt3();
  537. }
  538. }
  539. // Usada luego de AplicarAccionEt3:
  540. function BuscarOtraAccionEt3 () {
  541. trace("Ejecutando BuscarOtraAccionEt3");
  542. if (Action < LastActionPosible) {
  543. // Si queda alguna acción sin probar...
  544. // en la situación, probarla:
  545. Action++;
  546. // Se ejecutará ResetearSituacionEt3.
  547. } else {
  548. trace("No hay más acciones realizables.");
  549. BuscarOtraSituacionEt3();
  550. }
  551. }
  552. // Usada cuando no hay más acciones posibles:
  553. function GuardarDatosEt3 () {
  554. trace("Ejecutando GuardarDatosEt3");
  555. set(S_+"VictoriasDeX", VictoriasDeX);
  556. set(S_+"VictoriasDe0", VictoriasDe0);
  557. set(S_+"Empates", Empates);
  558. set(S_+"BestAction", BestAction);
  559. set(S_+"DistanciaaGanar", BestDistanciaaGanar+1);
  560. set(S_+"ResultadoEsperado", BestResultadoEObtenido);
  561. }
  562. // Usada en BuscarOtraAccionEt3 cuando no hay más acciones posibles,
  563. // y en SinResetBuscarOtraAccionEt3:
  564. function BuscarOtraSituacionEt3 () {
  565. trace("Ejecutando BuscarOtraSituacionEt3");
  566. NroDeSExperimentandose++;
  567. if (eval(L_SaE+NroDeSExperimentandose) != undefined) {
  568. // Hay otra situación en la lista,
  569. // prepararse a usarla:
  570. L_SaE_ = L_SaE+NroDeSExperimentandose;
  571. PrepararSaEEt3();
  572. } else {
  573. trace("No hay más situaciones a experimentar en la lista actual, se mirará otra.");
  574. BuscarOtraListaEt3();
  575. }
  576. }
  577. // /////////////////////////////////////////////
  578. // /////////////////  Chequeos  ////////////////
  579. // /////////////////////////////////////////////
  580. // Usada en ChequeoHorizontal y requerida en otros casos:
  581. function ObtenerColumnayFilaDelMarcado () {
  582. FilaDelMarcado = Math.floor(Action/CasillerosPorFila);
  583. ColumnaDelMarcado = Action%CasillerosPorFila;
  584. }
  585. function ChequearVertical () {
  586. // trace ("Ejecutando ChequearVertical");
  587. //
  588. // SOLO FUNCIONA SI CasillerosPorFila >= JuntosRequeridos.
  589. //
  590. // Se revisará la vertical. Desde el casillero más arriba...
  591. // que pueda estar incluído en la línea,
  592. // hasta el casillero marcado. Si se halla alguno que no...
  593. // tenga la marca requerida, se repite el proceso mirando...
  594. // desde uno más abajo del fallado, y mirando ahora hasta...
  595. // más abajo, según corresponda:
  596. Desde = Action-CasillerosPorFila*(JuntosRequeridos-1);
  597. // Mientras el casillero no exista:
  598. while (Desde<0) {
  599. // trace ("Desde es "+Desde+", se aumentará");
  600. // Indicar que se empiece a mirar desde más abajo:
  601. Desde = Desde+CasillerosPorFila;
  602. }
  603. do {
  604. Hasta = Desde+CasillerosPorFila*(JuntosRequeridos-1);
  605. if (Hasta>MaxCasillero) {
  606. // Para ganar se necesitaría más casilleros hacia...
  607. // abajo de los que hay, terminar análisis:
  608. // trace ("No hay suficientes cuadraditos abajo");
  609. break;
  610. }
  611. Puntero = Desde;
  612. // trace ("Comenzando chequeo desde "+Desde+" hasta "+Hasta);
  613. // Puede cambiar:
  614. Win = "Sí";
  615. do {
  616. // trace ("Chequando el casillero "+Puntero);
  617. if (Situacion[Action] != Situacion[Puntero]) {
  618. Win = "No";
  619. Desde = Puntero+CasillerosPorFila;
  620. break;
  621. }
  622. Puntero = Puntero+CasillerosPorFila;
  623. } while (Puntero<=Hasta);
  624. } while (Desde<=Action && Win == "No");
  625. if (Win == "No") {
  626. // ChequearHorizontal();
  627. }
  628. }
  629. function ChequearHorizontal () {
  630. // trace ("Ejecutando ChequearHorizontal");
  631. // Es similar al chequeo vertical, pero aquí no sirve...
  632. // sumar o restar a un puntero que marque el casillero...
  633. // porque puede existir ese casillero pero no estar en...
  634. // un costado. En vez de eso, se obtiene su columna y...
  635. // fila, se modifica la columna si es posible,
  636. // y se calcula cual es el casillero a mirar:
  637. ObtenerColumnayFilaDelMarcado();
  638. DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
  639. // Para que no mire cuadraditos inexistentes en la izq:
  640. if (DesdeColumna<0) {
  641. DesdeColumna = 0;
  642. }
  643. do {
  644. HastaColumna = DesdeColumna+JuntosRequeridos-1;
  645. if (HastaColumna>MaxColumna) {
  646. // Para ganar se necesitaría más casilleros hacia...
  647. // la derecha de los que hay, terminar análisis:
  648. // trace ("No hay suficientes cuadraditos a la derecha");
  649. break;
  650. }
  651. Puntero = DesdeColumna;
  652. // trace ("Comenzando chequeo desde "+DesdeColumna+" hasta "+HastaColumna);
  653. // Puede cambiar:
  654. Win = "Sí";
  655. do {
  656. CasilleroaMirar = FilaDelMarcado*CasillerosPorFila+Puntero;
  657. // trace ("Chequando el casillero "+CasilleroaMirar);
  658. if (Situacion[Action] != Situacion[CasilleroaMirar]) {
  659. Win = "No";
  660. DesdeColumna = Puntero+1;
  661. break;
  662. }
  663. Puntero++;
  664. } while (Puntero<=HastaColumna);
  665. } while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
  666. if (Win == "No") {
  667. ChequearDesdeUpIzq();
  668. }
  669. }
  670. // La diagonal así \
  671. function ChequearDesdeUpIzq () {
  672. // trace ("Ejecutando ChequearDesdeUpIzq");
  673. DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
  674. // trace("DesdeColumna: "+DesdeColumna);
  675. DesdeFila = FilaDelMarcado-JuntosRequeridos+1;
  676. // trace("DesdeFila: "+DesdeFila);
  677. // Para que no mire cuadraditos inexistentes:
  678. if (DesdeColumna<DesdeFila) {
  679. Sumar = DesdeColumna;
  680. } else {
  681. Sumar = DesdeFila;
  682. }
  683. // trace("Sumar: "+Sumar);
  684. if (Sumar<0) {
  685. // trace("Sumando.");
  686. DesdeColumna = DesdeColumna-Sumar;
  687. // trace("DesdeColumna: "+DesdeColumna);
  688. DesdeFila = DesdeFila-Sumar;
  689. // trace("DesdeFila: "+DesdeFila);
  690. }
  691. do {
  692. HastaColumna = DesdeColumna+JuntosRequeridos-1;
  693. if (HastaColumna>MaxColumna) {
  694. // Para ganar se necesitaría más casilleros hacia...
  695. // la derecha de los que hay, terminar análisis:
  696. // trace ("No hay suficientes cuadraditos a la derecha");
  697. break;
  698. }
  699. HastaFila = DesdeFila+JuntosRequeridos-1;
  700. // Sirve usar MaxColumna en vez de crear MaxFila...
  701. // porque como el tablero es cuadrado serían iguales:
  702. if (HastaFila>MaxColumna) {
  703. // Para ganar se necesitaría más casilleros hacia...
  704. // abajo de los que hay, terminar análisis:
  705. // trace ("No hay suficientes cuadraditos abajo");
  706. break;
  707. }
  708. PunteroDeColumna = DesdeColumna;
  709. PunteroDeFila = DesdeFila;
  710. // trace ("Comenzando chequeo desde columna "+DesdeColumna+" y fila "+DesdeFila);
  711. // trace ("hasta columna "+HastaColumna+" y fila "+HastaFila);
  712. // Puede cambiar:
  713. Win = "Sí";
  714. do {
  715. CasilleroaMirar = PunteroDeFila*CasillerosPorFila+PunteroDeColumna;
  716. // trace ("Chequando el casillero "+CasilleroaMirar);
  717. if (Situacion[Action] != Situacion[CasilleroaMirar]) {
  718. Win = "No";
  719. DesdeColumna = PunteroDeColumna+1;
  720. DesdeFila = PunteroDeFila+1;
  721. break;
  722. }
  723. PunteroDeColumna++;
  724. PunteroDeFila++;
  725. } while (PunteroDeColumna<=HastaColumna);
  726. } while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
  727. if (Win == "No") {
  728. ChequearDesdeDownIzq();
  729. }
  730. }
  731. // La diagonal así /
  732. function ChequearDesdeDownIzq () {
  733. // trace ("Ejecutando ChequearDesdeDownIzq");
  734. DesdeColumna = ColumnaDelMarcado-JuntosRequeridos+1;
  735. // trace("DesdeColumna: "+DesdeColumna);
  736. DesdeFila = FilaDelMarcado+JuntosRequeridos-1;
  737. // trace("DesdeFila: "+DesdeFila);
  738. // Para que no mire cuadraditos inexistentes:
  739. ColumnasInexistentes = 0;
  740. if (DesdeColumna<0) {
  741. ColumnasInexistentes = DesdeColumna*-1;
  742. }
  743. FilasInexistentes = 0;
  744. // Está bien usar MaxColumna porque MaxFila sería igual:
  745. if (DesdeFila>MaxColumna) {
  746. FilasInexistentes = DesdeFila-MaxColumna;
  747. }
  748. if (ColumnasInexistentes>=FilasInexistentes) {
  749. Ajuste = ColumnasInexistentes;
  750. } else {
  751. Ajuste = FilasInexistentes;
  752. }
  753. // trace("Ajuste: "+Ajuste);
  754. if (Ajuste>0) {
  755. // trace("Ajustando.");
  756. DesdeColumna = DesdeColumna+Ajuste;
  757. // trace("DesdeColumna: "+DesdeColumna);
  758. DesdeFila = DesdeFila-Ajuste;
  759. // trace("DesdeFila: "+DesdeFila);
  760. }
  761. do {
  762. HastaColumna = DesdeColumna+JuntosRequeridos-1;
  763. if (HastaColumna>MaxColumna) {
  764. // Para ganar se necesitaría más casilleros hacia...
  765. // la derecha de los que hay, terminar análisis:
  766. // trace ("No hay suficientes cuadraditos a la derecha");
  767. break;
  768. }
  769. HastaFila = DesdeFila-JuntosRequeridos+1;
  770. if (HastaFila<0) {
  771. // Para ganar se necesitaría más casilleros hacia...
  772. // arriba de los que hay, terminar análisis:
  773. // trace ("No hay suficientes cuadraditos arriba");
  774. break;
  775. }
  776. PunteroDeColumna = DesdeColumna;
  777. PunteroDeFila = DesdeFila;
  778. // trace ("Comenzando chequeo desde columna "+DesdeColumna+" y fila "+DesdeFila);
  779. // trace ("hasta columna "+HastaColumna+" y fila "+HastaFila);
  780. // Puede cambiar:
  781. Win = "Sí";
  782. do {
  783. CasilleroaMirar = PunteroDeFila*CasillerosPorFila+PunteroDeColumna;
  784. // trace ("Chequando el casillero "+CasilleroaMirar);
  785. if (Situacion[Action] != Situacion[CasilleroaMirar]) {
  786. Win = "No";
  787. DesdeColumna = PunteroDeColumna+1;
  788. DesdeFila = PunteroDeFila-1;
  789. break;
  790. }
  791. PunteroDeColumna++;
  792. PunteroDeFila--;
  793. } while (PunteroDeColumna<=HastaColumna);
  794. } while (DesdeColumna<=ColumnaDelMarcado && Win == "No");
  795. // trace("Win: "+Win);
  796. }

Necesito practicar con un juego más sencillo :/


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines