Dagaz: Détails

image Ne comptez pas les nombres en "pi",
"E" est infiniment le même.
Et si vous les écrivez de la fin, quoi de plus?

Martin Gardner "Tic Tac Toe"

Pour cet article, j'ai voulu choisir une autre épigraphe, mais je l'ai trouvée trop pathétique. La prochaine version a de nouveau été retardée. Pendant ce temps, j'ai réussi à changer d'emploi! Travailler dans un nouvel endroit demande beaucoup d'énergie, mais je continue de trouver du temps pour mon petit passe-temps. Et je dois dire que ce à quoi je dois faire face dans le processus devient de plus en plus difficile. Je vais vous en parler. Je voulais commencer par une autre épigraphe, mais celle-ci n'est pas mal non plus.

Cette fois, il y a eu de nouveaux mankals et des " jeux de transition " (ce sont Halma et ses proches). Une sorte de course dans laquelle vous devez prendre la maison de votre adversaire avec vos pièces devant lui. Les chiffres (les nôtres et les autres) peuvent être sautés (comme dans les dames ), mais il n'y a pas de captures. Qu'est-ce que je vous explique? Certes, beaucoup d'entre vous ont joué des Corners dans votre enfance.


À première vue, le jeu semble simple, mais les problèmes ont déjà commencé au niveau du noyau. Rappelez-vous, j'ai parlé de mouvements composés? Pour de nombreuses raisons, il est plus pratique de les représenter comme des éléments composites - comme un tout unique, et non comme une séquence de mouvements partiels. C'est plus pratique pour l'IA, et du point de vue de la conception, il existe des jeux dont la description sous forme de mouvements composés semble beaucoup plus naturelle. Mais il y a un problème.

Dans les pions, lorsque vous effectuez un mouvement composite, les pièces sont retirées du plateau (éventuellement à la fin du mouvement). Dans les coins - vous pouvez sauter par-dessus vos propres pièces ou celles de votre adversaire à l'infini. Littéralement. Et aucune extension ici n'est sauvegardée, car tout se déroule en cycles sans les atteindre, dans le noyau, même au stade de la génération de la liste des mouvements. J'ai dû changer cette logique, en y mettant en œuvre l'option ( detect-loops ), qui mériterait réflexion à l'avance.

Ce n'était pas facile non plus avec le bot.
Le principal problème avec cette famille de jeux est qu'il n'est pas si facile de sélectionner une fonction d'évaluation qui représente adéquatement la situation au tableau. Puisque le but du jeu est d'atteindre la «maison» de l'adversaire, il est possible d'estimer la distance totale de toutes les pièces aux champs cibles ( Manhattan ou Euclidienne - aucune différence), mais à Halm, dans un ensemble de circonstances réussies, les pièces peuvent sauter la planche entière en une seule fois, donc une telle estimation donne peu.

Avec les champs cibles, tout n'est pas clair non plus. Vous ne pouvez pas diriger toutes les figures vers le même champ. La première figure qui l'attrape juste là et la prend. Il serait idéal de déterminer les champs cibles optimaux pour chacune des figures et de les déplacer, mais cela est difficile, dans le plan de calcul. De plus, la situation sur le plateau change à chaque coup. En général, j'ai décidé de ne pas regarder trop loin et de me limiter à un algorithme purement heuristique .

Avec une telle évaluation de la qualité de l'AVC
Dagaz.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; } 

Ce n'est pas une solution idéale, mais pour commencer, cela fonctionne très bien. Si le bot voit un mouvement par lequel il est possible de "sauter" dans la "maison" de l'ennemi, il le choisit. Sinon, il réduit progressivement la distance jusqu'à la cible, en essayant d'éviter la congestion. La situation la plus triste peut se produire si un joueur (accidentellement ou intentionnellement) laisse sa figurine dans la "maison", et l'autre - la "verrouille" avec une double rangée de ses figurines.

Bien sûr, la probabilité d'une telle situation est assez faible.
Grâce à la règle proposée par Sidney Saxon, l'inventeur et collectionneur de jeux de New York. Sa suggestion est la suivante: si une pièce a la capacité de quitter sa "maison", en sautant à travers la pièce d'un adversaire ou par une chaîne de sauts à partir d'un tel mouvement, elle doit le faire. J'ai essayé différentes versions des règles, excluant la possibilité de verrouiller les personnages dans leur propre "maison" et j'ai trouvé la règle Sidney Saxon la plus réussie. Après avoir quitté sa «maison», la pièce ne peut plus y retourner (bien qu'elle ait le droit de la traverser dans le processus de réalisation du déménagement).

Juste au cas où, j'interdis les mouvements de "verrouillage" de l'adversaire (si vous n'avez pas à regarder beaucoup de mouvements devant vous, vous pouvez vous permettre des heuristiques assez compliquées) en leur attribuant des notes négatives, mais la situation de "verrouillage" des champs cibles vides n'est pas moins dangereuse pour le bot (en particulier ceci notable dans Halma classique , avec ses mouvements purement orthogonaux). En général, ce bot a de la place pour grandir.

Dans les jeux où il est permis de prendre des pièces, c'est encore plus compliqué. Et il y a beaucoup de tels jeux! Le plus célèbre d'entre eux est peut-être le Camelot , inventé par George Parker en 1930. Mais personnellement, j'aime beaucoup les jeux moins connus, construits sur la base des mêmes mécaniques.


Ce jeu est l'histoire elle-même! En 1908, les suffragistes l'ont proposé pour faire avancer leurs opinions politiques. Tout est là: la Chambre des communes, Albert Hall , la prison de la ville et l'hôpital. Les suffragettes combattent les flics. Leur objectif est d'amener 6 de leurs membres à la Chambre des communes. Ils ne peuvent pas entrer dans leur quartier général, Albert Hall. Les formes se déplacent dans toutes les directions. Sauter par-dessus les pièces amies et ennemies est également autorisé.

Cependant, une série de sauts peut être arbitrairement longue. Si l'affaire se déroule dans «l'arène», les personnages ennemis, lorsqu'ils sautent à travers eux, sont abattus et envoyés dans une prison ou un hôpital. Les figures ordinaires ne sont coupées qu'en diagonale, grandes (constables et chefs suffragistes) - dans n'importe quelle direction. Lorsque 6 personnages sont recrutés dans la prison et l'hôpital, ils peuvent être "échangés" en rentrant dans le jeu. Ainsi, les pièces, comme dans Shogi ou Pillar Checkers , ne quittent jamais le jeu.

En général, l'intégralité de cette version concerne uniquement ces options. Par exemple, j'ai finalement maîtrisé la transformation correcte des pièces dans les échecs (jusqu'à présent, tous les pions ne se transformaient qu'en reines, ce qui, en général, est faux). Je ne me suis pas beaucoup soucié de cela et j'ai dessiné une boîte de dialogue de sélection directement sur la toile. Cela s'est plutôt bien passé (si j'avais pu retirer mes mains pour pouvoir les distinguer du tapis, ça aurait été merveilleux en général).


Un autre raffinement «nucléaire» a été associé à l'amélioration de l'interface utilisateur et possède son propre bagage. Il y a un mécanisme dans le projet depuis assez longtemps qui vous permet d'encoder la position actuelle en la passant par l'URL. Étant donné que les descriptions de tous les états de jeu dans ce format sont écrites dans le journal, cela aide beaucoup au débogage. C'est juste l'utilisateur qui ne sait rien du journal du navigateur, c'est de peu d'utilité.

Non, non, ce n'est pas tout bon!
Il existe un certain nombre de jeux, dont le gameplay se compose de nombreuses étapes (éventuellement hétérogènes). À titre d'exemple, vous pouvez citer le jeu populaire de 2008 - Kamisado . Chaque étape de ce jeu (avant de passer l'une des figures à la dernière horizontale) est relativement courte, mais une fois terminée, le jeu continue. Les joueurs, selon les règles convenues, réorganisent leurs pièces sur la première ligne et tentent à nouveau d'atteindre la dernière horizontale avant l'adversaire (la figure qui a remporté la victoire à l'étape précédente reçoit de nouvelles capacités).


C'est cet aspect du jeu que l'option « niveaux progressifs » automatise, qui passe automatiquement à l'étape suivante du jeu lorsque l'un des joueurs gagne. Et puisque la disposition initiale des figures diffère d'une étape à l'autre, elle est calculée par le module de configuration commune et passée à l'étape suivante du jeu via l' URL .


Cette opportunité va de pair, vous permettant de diversifier la disposition initiale des chiffres. L'option " sélecteur " vous permet d'encoder plusieurs dispositions initiales (et même des configurations de carte) dans un seul fichier JS . Actualisez votre page d'accueil Reversi et vous comprendrez ce que je veux dire.

Le nouveau plug-in est conçu pour résoudre le problème. Structurellement, il s'agit d'un arbre ordinaire dans lequel tous les états de jeu qui figuraient dans la session de jeu sont enregistrés (et puisque cet arbre, à l'avenir, l'historique complet du jeu peut être téléchargé dans le fichier SGF ). L'utilisateur a la possibilité de «retourner» ces états à l'aide des boutons qui apparaissent en haut de l'écran.


C'est vraiment pratique, mais vous pouvez profiter encore plus des deux flèches en haut. C'est exactement ce que fait l'option " mode conseiller ". Si l'utilisateur réfléchit plus longtemps que le temps spécifié, le bot avec lequel il joue, calcule le parcours pour lui et met le nouvel état du jeu dans le "gestionnaire de session". Le mouvement proposé peut être accepté simplement en appuyant sur le bouton «avant». Et si vous n'aimez pas le mouvement, vous pouvez toujours le faire reculer.

Beaucoup de joie, dans le processus de développement, a apporté du son (il semblerait, ce qui est beaucoup plus facile). La première implémentation était trop naïve. Je ne sais pas à quoi il est connecté, mais quelque part au milieu du jeu, le son a simplement cessé de jouer sans aucun message dans le journal. Cela s'est manifesté dans tous les navigateurs que j'avais, jusqu'à ce que je commence à mettre en cache les objets Sound créés en mémoire. Mais un autre problème est venu.

Si le son a été joué pendant longtemps et que le bot a pensé assez vite (comme dans les leurres , par exemple), alors le son de son mouvement a été simplement «avalé», ce qui semblait extrêmement désagréable. Ici j'ai du chaman pendant longtemps et ça s'est terminé avec des béquilles . Avec le drapeau «clonable», je crée toujours plusieurs instances de Sound, une pour chaque joueur (même si elles perdent le même son). Bien sûr, cela n'a aidé en aucune façon IE, qui a refusé (évidemment pour des raisons religieuses) de traiter à la fois les fichiers «wav» et «ogg». Ce navigateur, pour moi, fonctionne en silence!

Sinon, la libération s'est déroulée sans incident. Halme et mankalam étaient constitués de deux jeux d' échecs , ainsi que de nombreuses variantes de Shogi que j'ai lues dans le prochain numéro d' Il fogliaccio degli astratti et d'un autre jeu simple de camarades chinois. Oh oui, voici une autre chose:


Juste un petit simulateur de mémoire à court terme. Il est nécessaire d'ouvrir les mêmes paires (reine avec reine, roi avec roi, etc.) de la même couleur. Des points sont accordés pour cela et pour tout ce qui concerne les 200 clics. Étant donné que des bonus sont accordés aux points (pour l'alternance de costumes rouges et noirs, par exemple), vous pouvez rivaliser avec des amis pour savoir qui a une meilleure mémoire. Allez-y!

Et bonne année à tous!

Source: https://habr.com/ru/post/fr429494/


All Articles