No cuente los números en "pi",
"E" es infinitamente igual.
Y si los escribes desde el final, ¿qué será más?
Martin Gardner "Tic Tac Toe"Para este artículo, quería elegir un epígrafe diferente, pero lo encontré demasiado patético. El próximo
lanzamiento se retrasó nuevamente. ¡Durante este tiempo, logré cambiar de trabajo! Trabajar en un lugar nuevo requiere mucha energía, pero sigo encontrando tiempo para mi pequeño pasatiempo. Y debo decir que lo que tengo que enfrentar en el proceso es cada vez más difícil. Te lo contaré. Quería comenzar con otro epígrafe, pero este tampoco es malo.
Esta vez, hubo nuevos
mankals y "
juegos de transición " (estos son
Halma y sus parientes). Una especie de carrera en la que tienes que tomar la casa de tu oponente con tus piezas delante de él. Las cifras (tanto las nuestras como las de otros) se pueden saltar (como en las
fichas ), pero no hay capturas. ¿Qué te estoy explicando? Seguramente, muchos de ustedes jugaron
Esquinas en su infancia.
A primera vista, el juego parece simple, pero los problemas ya comenzaron a nivel del núcleo. ¿Recuerdas que
hablé de movimientos compuestos? Por muchas razones, es más conveniente representarlos como compuestos, como un todo único y no como una secuencia de movimientos parciales. Esto es más conveniente para la IA, y desde el punto de vista del diseño, hay juegos cuya descripción en forma de movimientos compuestos se ve mucho más natural. Pero hay un problema.
En las damas, cuando se realiza un movimiento compuesto, las piezas se retiran del tablero (posiblemente al final del movimiento). En las esquinas, puedes saltar sobre las piezas propias o de tu oponente hasta el infinito. Literalmente Y aquí no se guardan extensiones, porque todo va en ciclos sin llegar a ellas, en el núcleo, incluso en la etapa de generar la lista de movimientos. Tuve que cambiar esta lógica, implementando allí la opción (
detect-loops ), en la que vale la pena pensar de antemano.
Tampoco fue fácil con el bot.El principal problema con esta familia de juegos es que no es tan fácil seleccionar una función de evaluación que represente adecuadamente la situación en el tablero. Dado que el objetivo del juego es llegar a la "casa" del oponente, es posible estimar la distancia total de todas las piezas a los campos objetivo (
Manhattan o
Euclidiana , sin diferencia), pero en Halm, en un conjunto exitoso de circunstancias, las piezas pueden saltar sobre todo el tablero de una vez, por lo que tal estimación da poco.
Con los campos de destino, tampoco todo está claro. No puede dirigir todas las figuras al mismo campo. La primera figura que lo alcanza allí y lo toma. Sería ideal determinar los campos objetivo óptimos para cada una de las figuras y pasar a ellas, pero es difícil en el plan computacional. Además, la situación en el tablero cambia con cada movimiento. En general, decidí no mirar hacia el futuro y restringirme a un
algoritmo puramente
heurístico .
Con tal evaluación de la calidad del accidente cerebrovascularDagaz.AI.heuristic = function(ai, design, board, move) { var t = getTargets(design, board, board.player); var m = getMove(move); var r = 1; if (m !== null) { if (!design.inZone(0, board.player, m.start)) { if (_.indexOf(t.first, m.end) >= 0) { r = 1000 + getDistance(t.first, m.start) - getDistance(t.first, m.end); } if (_.indexOf(t.goal, m.end) >= 0) { r = 700 + getDistance(t.first, m.start) - getDistance(t.first, m.end); } if ((r == 1) && (_.indexOf(t.second, m.end) >= 0)) { r = 500 - getDistance(t.second, m.end); } } if (r == 1) { if (design.inZone(2, board.player, m.end) && !design.inZone(2, board.player, m.start)) { r = 300; } } if (bestFound(design, board, 300)) return -1; if (r == 1) { var goals = getGoals(design, board, board.player); if (!_.isUndefined(goals[m.start])) { var goal = goals[m.start]; if (m.next == goal.next) { r = 100 + distance(goal.end, m.start) - distance(goal.end, m.end); } } } if (notBest(design, board, r)) return -1; var b = board.apply(move); if (isRestricted(design, b, board.player)) return -1; } return r; }
No es una solución ideal, pero para empezar funciona bastante. Si el bot ve un movimiento por el cual es posible "saltar" a la "casa" del enemigo, lo elige. De lo contrario, reduce gradualmente la distancia al objetivo, tratando de evitar la congestión. La situación más triste puede suceder si un jugador (accidental o intencionalmente) deja su pieza en la "casa" y el otro la "bloquea" con una doble fila de sus piezas.
Por supuesto, la probabilidad de tal situación es bastante baja.Gracias a la regla propuesta por Sidney Saxon, el inventor y coleccionista de juegos de Nueva York. Su sugerencia es la siguiente: si una pieza tiene la capacidad de abandonar su "hogar", saltando a través de la pieza de un oponente o mediante una cadena de saltos a partir de tal movimiento, debe hacerlo. Probé varias versiones de las reglas, excluyendo la posibilidad de encerrar figuras en su propia "casa" y descubrí que la regla de Sidney Saxon era la más exitosa. Después de abandonar su "hogar", la pieza ya no puede volver a ella (aunque tiene el derecho de atravesarla en el proceso de completar el movimiento).
Por si acaso, prohíbo los movimientos de "bloqueo" del oponente (si no tiene que mirar muchos movimientos hacia adelante, puede permitirse una heurística bastante complicada) estableciendo calificaciones negativas para ellos, pero la situación de "bloquear" los campos objetivo vacíos no es menos peligroso para el bot (especialmente esto notable en
Halma clásico , con sus movimientos puramente ortogonales). En general, este bot tiene espacio para crecer.
En los juegos donde se permite tomar piezas, es aún más complicado. ¡Y hay muchos juegos de este tipo! Quizás el más famoso de estos es el
Camelot , inventado por George Parker en 1930. Pero personalmente, me gusta un juego mucho menos conocido, construido sobre la base de la misma mecánica.
¡Este
juego es la historia misma! En 1908, los sufragistas lo idearon para promover sus puntos de vista políticos. Todo está aquí: la Cámara de los Comunes,
Albert Hall , la prisión de la ciudad y el hospital. Las mujeres
sufragistas son policías de lucha. Su objetivo es llevar a 6 de sus personas a la Cámara de los Comunes. No pueden entrar a su cuartel general, Albert Hall. Las formas se mueven en cualquier dirección. Saltar sobre piezas amigas y enemigas también está permitido.
Sin embargo, una serie de saltos puede ser arbitrariamente larga. Si el caso tiene lugar en la "arena", las figuras enemigas, cuando saltan a través de ellas, son cortadas y enviadas a una prisión u hospital. Las figuras ordinarias se cortan solo en diagonal, grandes (agentes y líderes sufragistas), en cualquier dirección. Cuando se reclutan 6 figuras en la prisión y el hospital, se pueden "intercambiar" al volver a ingresar al juego. Por lo tanto, las piezas, como en
Shogi o
Pillar Checkers , nunca abandonan el juego.
En general, todo este lanzamiento es solo sobre el tema de tales opciones. Por ejemplo, finalmente dominé la transformación correcta de piezas en
Ajedrez (hasta ahora, todos los peones se convirtieron solo en reinas, lo que, en términos generales, está mal). No me molesté mucho con esto y dibujé un cuadro de diálogo de selección directamente en el lienzo. Resultó bastante bien (si hubiera podido quitarme las manos para poder distinguirlas del tapete, habría sido maravilloso en general).
Otro refinamiento "nuclear" se asoció con la mejora de la interfaz de usuario y tiene sus propios antecedentes. Ha habido un
mecanismo en el proyecto durante bastante tiempo que le permite codificar la posición actual pasándola a través de la URL. Teniendo en cuenta que las descripciones de todos los estados del juego en este formato están escritas en el registro, ayuda mucho en la depuración. Ese es solo el usuario que no sabe nada sobre el registro del navegador, es de poca utilidad.
No, no, ¡esto no es todo bueno!Hay una serie de juegos, cuya jugabilidad consta de muchas etapas (posiblemente heterogéneas). Como ejemplo, puedes citar el popular juego de 2008:
Kamisado . Cada etapa de este juego (antes de pasar una de las figuras a la última horizontal) es relativamente corta, pero al finalizar, el juego continúa. Los jugadores, de acuerdo con las reglas acordadas, reorganizan sus piezas en la primera línea e intentan alcanzar la última horizontal antes que el oponente (la figura que trajo la victoria en la etapa anterior recibe nuevas habilidades).
Es este aspecto del juego el que automatiza la opción de "
niveles progresivos ", que pasa automáticamente a la siguiente etapa del juego cuando uno de los jugadores gana. Y dado que la disposición inicial de las figuras difiere de una etapa a otra, se calcula mediante el módulo de
configuración común y se pasa a la siguiente etapa del juego a través de la
URL .
Mano a mano con esta oportunidad va de otra manera, permitiéndole diversificar la disposición inicial de las figuras. La opción "
selector " le permite codificar múltiples arreglos iniciales (e incluso configuraciones de placa) dentro de un solo
archivo JS . Actualice su página de inicio de
Reversi y comprenderá lo que quiero decir.
El nuevo complemento
está diseñado para resolver el problema. Estructuralmente, este es un árbol ordinario en el que se guardan todos los estados del juego que se presentaron en una sesión de juego (y dado que este árbol, en el futuro, toda la historia del juego se puede cargar en un archivo
SGF ). El usuario tiene la capacidad de "voltear" estos estados usando los botones que aparecen en la parte superior de la pantalla.
Esto es realmente conveniente, pero puede obtener aún más beneficios de las dos flechas en la parte superior. Esto es exactamente lo que hace la opción "
modo asesor ". Si el usuario piensa más que el tiempo especificado, el bot con el que está jugando calcula el curso por él y coloca el nuevo estado del juego en el "administrador de sesión". El movimiento propuesto puede aceptarse simplemente presionando el botón "adelante". Y si no le gusta el movimiento, siempre puede retrocederlo.
Mucha alegría, en el proceso de desarrollo, trajo el sonido (parece, lo cual es mucho más fácil). La primera
implementación fue demasiado ingenua. No sé con qué está conectado, pero en algún lugar en el medio del juego, el sonido simplemente dejó de reproducirse sin ningún mensaje en el registro. Esto se manifestó en todos los navegadores que tenía, hasta que comencé a almacenar en caché los objetos Sound creados en la memoria. Pero luego vino otro problema.
Si el sonido se reprodujo durante mucho tiempo, y el bot
pensó lo suficientemente rápido (como en
señuelos , por ejemplo), entonces el sonido de su movimiento fue simplemente "tragado", lo que parecía extremadamente desagradable. Aquí tuve que chamán durante mucho tiempo y terminó con
muletas . Con el conjunto de banderas "clonable", sigo creando varias instancias de sonido, una para cada jugador (incluso si pierden el mismo sonido). Por supuesto, esto no ayudó de ninguna manera con IE, que se negó (obviamente por razones religiosas) a tratar con archivos "wav" y "ogg". ¡Este navegador, para mí, funciona en silencio!
De lo contrario, la liberación fue sin incidentes.
Halme y
Mankalam estaban formados por un par
de juegos de ajedrez ,
así como por muchas variaciones de Shogi que leí en el próximo número de
Il fogliaccio degli astratti y otro
juego simple de camaradas chinos. Oh sí, aquí hay otra cosa:
Solo un pequeño simulador de memoria a corto plazo. Es necesario abrir los mismos pares (reina con reina, rey con rey, etc.) del mismo color. Se otorgan puntos por esto y por todo sobre los 200 clics. Dado que los bonos se otorgan a los puntos (por la alternancia de trajes rojos y negros, por ejemplo), puedes competir con amigos sobre quién tiene mejor memoria. ¡A por ello!
Y todo un feliz año nuevo!