fredjust:
on peut s’apercevoir un ou deux coups plus tard que l'on s'est planté et là ce risque d’être complexe de revenir en arrière tout en gardant l'incohérence en mémoire
Ben justement, personnellement c'est par là que j'aurais tendance à creuser : un algo qui soit capable de se rendre compte qu'il est dans une impasse, et de revenir un peu en arrière pour prendre un meilleur chemin.
Voici comment j'aborderais le sujet de prime abord, quitte ensuite à l'adapter aux difficultés rencontrées :
En premier lieu, pour que la suite de mon propos ne soit pas ambiguë, dotons-nous d'un vocabulaire commun :
La position est à prendre au sens échiquéen du terme, c'est-à-dire que cela comprend l'ensemble des pièces bien identifiées avec leur emplacement, la couleur au trait, ainsi que les caractéristiques sous-jacentes (roque et/ou prise en passant autorisés, etc.).
La signature est la matrice 8x8 d’état des capteurs de présence d’une pièce sur chaque case.
On peut calculer la signature associée à une position.
L’inverse est justement l’objet du problème : reconstituer la position à partir d’une simple signature.
Plusieurs positions peuvent en effet avoir la même signature.
La position de départ d’une partie d’échecs est connue. L’objectif est donc d’analyser les variations de signature pour reconstituer le fil de la partie.
Par ailleurs, le postulat incontournable est que seuls des coups légaux sont joués sur l’échiquier.
Deux autres notions me semblent également intéressantes dans l’analyse des variations de signature :
Le poids d’une signature désigne le nombre de bits à 1, c’est-à-dire le nombre total de pièces présentes sur l’échiquier.
Il est intéressant de noter qu’en dehors d’un mouvement en cours pour déplacer une pièce, le poids ne peut aller qu’en décroissant. Et en cours de mouvement il ne peut augmenter que d’1 (disons 2 si le joueur soulève simultanément le roi et la tour lors d’un roque avant de les reposer, ce qui ne se fait normalement pas).
La distance entre deux signatures désigne le nombre de bits différents entre deux signatures.
Là aussi, il est intéressant de noter que cette distance ne peut excéder 2, entre les signatures de deux positions consécutives (4 dans le cas d'un roque)
Le principe général de l’analyse est de procéder par itérations successives, position après position, depuis la position de départ.
A partir d’une position, calculer tous les coups légaux et signatures théoriques associées, et les comparer à la signature réelle constatée sur l’échiquier. Plusieurs résultats sont possibles :
a) La signature réelle correspond à une et une seule signature théorique
Le coup joué et la nouvelle position sont alors bien identifiés
b) La signature réelle correspond à plusieurs signatures théoriques
Il y a alors ambiguïté sur la position.
Toutes les positions candidates sont mémorisées et les itérations suivantes seront basées sur l’analyse de l’ensemble de ces positions.
Dans la pratique, le nombre de positions candidates devrait être assez restreint, ce qui évitera toute explosion combinatoire.
Dans ces situations, la reconstitution temps réel de la partie pourra avoir un voire plusieurs coups de retard, qui seront rattrapés lorsqu’un nouveau coup lèvera l’ambigüité.
c) La signature réelle ne correspond à aucune signature théorique
Dans ce cas, l’analyse va remonter les itérations précédentes, à la recherche d’un nouveau chemin possible vers la nouvelle signature réelle.
Là aussi, le risque d’explosion combinatoire me semble maitrisé, grâce à la limitation des poids et distances de signature. Pas la peine de remonter jusqu’au début de la partie, on cherche des chemins courts.
Si aucun chemin n’est trouvé, le programme ignore la signature réelle et attend la suivante pour essayer de retomber sur ses pieds.
Ainsi :
-
pour une glissade de pièce, par exemple une tour glissée de d1 à d4 : dans un premier temps, le programme va considérer que le coup joué est d1-d2, puis ne trouver aucun chemin sur un coup adverse amenant la libération de la case d2 et l’occupation de la case d3. La recherche va reprendre depuis la position précédente, et le programme va considérer que le coup joué est d1-d3. Et ainsi de suite jusqu’au bon coup d1-d4.
-
pour un simple déplacement de pièce soulevée : la signature associée au moment où la pièce est en l’air sera ignorée (sauf si cette pièce a un mouvement possible de type prise, mais lorsqu’elle sera reposée l’analyse arrière invalidera cette prise).
-
etc : décompose les mouvements d’un roque de toutes les manières possibles, le programme va rapidement retomber sur ses pattes.
Avec ces règles d’analyse, je n’arrive pas à identifier de cas où le programme échouerait à reconstituer 100% des coups légaux d’une partie.
Lorsque le joueur est en train jouer son coup, le programme va temporairement envisager des coups bizarres à chaque signature éphémère, mais je le vois toujours converger vers la bonne analyse.
La vitesse de déplacement n’entre pas en compte. Les joueurs peuvent faire des glissades sur 10 secondes, ou au contraire blitzer à mort en zeitnot, sans perturber le programme.
Et il n’y a même plus besoin de se soucier du sens de collage des aimants.
Les calculs peuvent également être optimisés avec quelques règles simples.
Par exemple, un coup des blancs ne peut pas entraîner la libération d’une case occupée par une pièce noire, et inversement. Ainsi, pas la peine d’évaluer les coups légaux d’un camp pour chercher une signature impliquant la libération d’une case occupée par une pièce du camp adverse.
Je pourrais aussi poursuivre sur la partie implémentation software sur arduino, mais là c’est déjà beaucoup pour aujourd’hui.