Afin de ne pas me perdre dans les détails de mon code ou des réflexions stériles sur la stratégie à adopter et afin d'introduire les explications des perfectionnement et nombreuses astuces qui m'ont permis de faire entrer autant d'AI dans un SHARP PC1211 quarantenaire rustique, lent et poussif,
je me propose pour illustrer tout cela de lever le voile sur sa mécanique en rejouant certaines des manches que j'ai gagnées ou perdu lors de ce concours.
Pour commencer, je vais prendre à titre de première illustration la sixième manche jouée contre
dprtl lors de
notre amicale confrontation du 31 janvier 2021.
Cette manche a été un moment très fort puisque c'est le moment où j'ai égalisé le score après avoir été écrasé par un début de partie sans aucune victoire. Elle a de plus quelques caractéristiques qui ont fait que l'algorithme interne du PC-1211 c'est déroulé sans accrocs ni complications. Je laisse les manches plus compliquées pour les illustrations et explications pus détaillés à venir.
Commençons par le commencement et les faits les plus simples.
Je lance le programme en mode DEF par [SHFT][ Z ], c'est d'après ce que j'ai vu sur les blogs et site des utilisateurs du PC-1211 un grand classique de lancer l'unique programme par cette touche en bas à gauche du clavier. Pourquoi pas !
Avant d'avoir charger la mémoire du PC-1211, la baignoire est vide apparait sur les captures toute bleue !
Il y a cependant au centre une zone plus blue que les bords, car j'ai fais le choix de ne toujours jouer que sur une position possible de la savonnette et surtout de chercher à en toucher le centre. Je ne préoccupe donc absolument pas des positions en périphérie de la baignoire. Ces positions ne sont même pas représentées en mémoire. L'adversaire peut les jouer mais certainement pas mon PC-1211.
C'est un choix stratégique, le jeu étant une sorte de course, je ne veux pas perdre de temps et fournir des informations à mon adversaire en jouant une case où je ne peux trouver la savonnette/ pas de temps à perdre !
Je ne m'intéresse donc qu'aux 32 cases au centre de la baignoire. Avec un peu de chance je tomberai sur le centre de la savonnette juste par simple chance !
En plus ce choix fait une énorme économie: coder l'état de 32 case c'est presque la moitié de travail et de mémoire que les 60 case de la baignoire entière ! Et l'on comprends que je n'ai pas de mémoire ou registre à gaspiller.
- Fig1_dprtl manche 6.gif (21.67 Kio) Vu 5079 fois
la première opération au début de toute manche est de réinitialiser la mémoire du PC-1211 en chargeant les registres contenant le tapis de jeux, le pré-calcul des touches et des déplacement ainsi que l'évaluation (le score) de chacune des 32 cases. tout cela est précalculé. Le chargement fait un bruit d'enfer qui rappelle les années 80-90 mais ne prend qu'environ 1'20" au lieu du quart d'heure nécessaire à la réinitialisation manuelle partielle.
Le calcul complet des registre a été fait sur d'autre machine. En théorie le calcul complet prends plus de quinze heures au rythme lent du SHARP PC-1211.
Je lance le chargement depuis l'interface cassette en répondant 1 [ENTER] à l'invite "<TAPE_". La flèche vers la gauche est historique, c'est ainsi que j'indiqué en 1982 à l'utilisateur (moi en fait) qu'il fallait rebobiner la cassette et la positionner au début. Bon aujourd'hui c'est un lecteur numérique qui lit en boucle l'enregistrement en *.WAV
Mais que de souvenir et péripétie avec ces cassettes et leur gestion !
A la fin du chargement, le PC-1211 affiche la version des données. ce qui permet de vérifier que tout est bien entré en mémoire et qu'il n'y a pas un bout de code qui traine. J'utilise tous les registres jusqu'à l'avant dernier. Un petit programme laissé en mémoire et ça n'entre plus.
La capture du tableau de jeu permet de voir que mon PC-1211 a maintenant une petite idée en tête:
Trouver la savonnette en prenant le moins de risque possible, c'est à dire en évitant de se mettre dans le rouge.
Il a pour instructions de choisir la position la plus verte !
A l'invite "SEED _" j'entre la semence du générateur pseudo-aléatoire. Bonne idée d'avoir imposer le même à tout le monde. Et cela permet de reproduire à l'infini les parties déjà jouées. Le PC-1211 n'ayant pas d'instruction de génération aléatoire, tout tirage au sort utilise ce sous-programme (très court en plus, bien ).
J'ai marqué la position de la savonnette d'un petit carré noir pour nous aider à suivre ce qui se passe. Mais au moment du jeu personne ne sais où elle est.
Elle est en zone rouge (assez clair) donc à priori pas un placement très favorable car j'évite les zones rouges
. Nous verrons bien !
Le prompt "YOU _" indique que mon PC-1211 attend le jeu de son adversaire.
dprtl joue en 6.4. je saisi ces coordonnées et valide par un appuie sur [ENTER]
Immédiatement après avoir saisi celui-ci, mon PC-1211 indique qu'il s'agit d'un coup dans l'eau en affichant le position 6.4 et son résultat 0.
Je valide alors le coup par une nouvelle pression sur [ENTER] après avoir informé mon adversaire du résultat.
En pressant ENTER, je valide et mon PC-1211 met à jour le tableau de jeu
- Cela consiste à retirer des coups possibles la position jouée et les huit cases adjacentes. Pour désactiver ces cases, leur LEVEL mémorisé par la partie entière des registres concernés est mis à zéro.
- Mais aussi de marquer les cases limitrophes dont l'évaluation (le score) est impactée par ce coup. Chaque registre de ces positons limitrophes est marqué d'un signe négatif. Comme je n'ai pas le temps de réévaluer systématiquement ces cases, elles sont simplement marqué pour une éventuelle réévaluation ultérieure
Sur les captures ci-dessus, on voit l'effet des LEVEL désactivé par l'apparition d'une zone rouge autours de la position jouée.
Les cases mises en attente d'évaluation sont représentées par des hachures. Elles garde leur couleur car l'ancien score n'est pas modifié. I ly a une raison, en début de partie, en général les scores se dégradent (avec l'inactivation des cases adjacentes en général les choix se simplifient mais il y a encore trop de case voisine pour qu'une case prenne subitement de l'importance. Je garde donc l'évaluation obsolète afin de pouvoir déterminer quelles case à évaluer en priorité. Rien ne sert de perdre du temps de calcul à évaluer une case au score trop faible (le nouveau score étant, dans un premier temps, certainement plus faible que le précèdent). Par contre, si une case marquée ayant un bon score (plus fort que l'actuel record des cases précalculées), il peut être important de la mettre à jour en priorité afin d'évaluer s'il n'a pas trop perdu de sa précédente splendeur. Si c'est le cas, il pourrait faire l'objet d'un bon coup !
Une sonnerie indique que cette première tache est accomplie et donne furtivement le décompte des positions encore actives (1. = phase1 (pas de touche) 26.= cases actives restantes.
Je rappelle que je sais qu'arriver à la neuvième touche, la phase passera à 10. et mon code s'écroule et catastrophe. Pouvoir suivre cela m'aide à combattre le stress de chaque manche ...
Ce code, c'est de la dynamite ... .. il peut péter à tout moment !
- Fig2_dprtl manche 6.gif (25.42 Kio) Vu 5079 fois
Une fois le "bip" retenti, mon PC-1211 cherche un bon coup à jouer. Pour cela, il parcours les registres encore actifs et retient celui qui présente le meilleurs score. En réalité cette tache est facilité par l'ordre des info dans le registre; il suffit de prendre la valeur absolue +L.Srrrrrr
Si une valeur absolue est supérieur à la meilleurs position alors retenue, il faut vérifier qu'il ne s'agit pas d'un registre négatif. Dans ce cas, une réévaluation sera nécessaire avant de retenir cette nouvelle position comme étant la meilleure.
Pour ce premier coup, aucune position active en attente ou non de réévaluation n'est meilleure que la position 1.1 qui est retenue (pendant la recherche le signe $ marque le meilleur coup trouvé) puis jouée :
L'affichage "ME 1.1" indique que mon PC-1211 souhaite jouer cette position.
JE valide par [ENTER]
Il affiche alors le résultat 0. pour ce coup qui tombe à l'eau sans rien toucher.
En pressant ENTER, je valide le jeu de mon PC-1211 qui met immédiatement (mais lentement) à jour le tableau de jeu.
Il procède exactement comme pour le jeu de son adversaire. C'est d'ailleurs la même partie de code qui entre en action.
Sur la capture on voit apparaitre une nouvelle zone rouge et l'accroissement de la zone hachuré marquant les positions en attente de réévaluation dont le score est impacté par les coups joués.
Au bout d'un certain temp, un bip annonce la fin de la mise à jour. La phase de jeu et le nombre de position encore actives sont affichés?
On voit que mon jeu n'a écarté que quatre position. Par contre il y a une majorité de positions à réévaluer.
Mais c'est à mon adversaire de jouer; cela qui va changer la donne et éliminer "naturellement" quelques positions en attente d'évaluation.
Le prompt "YOU _" est renseigné avec le nouveau coup de
dprtl qui joue en 8.3
Décidément, mon adversaire aime prendre des risques ! Il aime le rouge et le rosé.
Mais malheureusement pour moi, son coup de touche rien. Mon PC-1211 indique un coup dans l'eau.
En pressant ENTER, je valide le coup et lance la mise à jour du tableau de jeu.
La capture montre l'apparition du rouge au niveau de la positon jouée et des positions adjacentes.
Quatre nouvelles positions sont éliminées (c'était des positions en attente de réévaluation) et trois nouvelles positions sont marquées.
Puis un Bip indique la fin de la mise à jour et mon PC-1211 évalue les coups à jouer. Il sélectionne dans un premier temps la position 4.1 puis la position 5.1
Aucune des positions en attentes ne sembles être suffisamment forte pour déclencher une réévaluation.
Par "ME 5.1", il annonce son intention de jouer en 5.1 (case la plus verte : c'est dire celle qui donne le plus de mal à mon adversaire quelque soit la position inconnue du savon)
Je valide par [ENTER].
Alors, mon PC-1211 sonne pour indiquer un rebond. Il y a donc eut une touche. ce qui est immédiatement indiqué par l'affichage de la réponse 1.1
Dans l'encadré en fond vert, je donne une vison simplifiée de la façon dont le nombre de rebonds ainsi que la nouvelle position de la savonnette est déterminée.
La position de la savonnette était BA=4.2 , le coup joué est DC=5.1 on a donc une proximité suffisante pour toucher la savonnette avec les écarts I= +1 et J=-1.
Ce qui fait que l'on touche la savonnette dans sa zone de touche n° T=5-3I-J=5-3+1=3; la savonnette se déplace donc de trois cases. Mais le PC-1211 se sert de sa table mémorisée:
Le nombre R de rebonds est donné par le registre G=30+8A+B=50 à la 1+T=4ième décimale. Soit R = 1 rebond.
La nouvelle position X de la savonnette est donnée par le registre G=26+A=28 à la même 4ième décimale X=3 (troisième ligne zone centrale)
La nouvelle position Y de la savonnette est donnée par le registre G=30+B=34 à la même 4ième décimale Y=1 (première colonne zone centrale)
On constatera que l'adresse des registres de ligne ne dépend pas de la colonne de la savonnette et respectivement les registre de déplacement en colonne ne dépend pas de la ligne. C'est une propriété liée au mode de rebond de la savonnette. Je ne m'en était pas rendu compte lors des première version à la tapis de jeu nécessité 32 registre pour les rebonds, 2x32 registres pour les déplacements. C'est en codant ces 64 registres que je me suis rendu compte des très nombreuses répétitions. A y réfléchir, c'est assez logique, mais ce fut une bonne surprise qui justifia d'utiliser le pré-calcul des positons et libéra suffisamment de mémoire (bon facteur re réduction de 64 je passe à 12 registres seulement) pour envisager une stratégie active.
En effet, le pré-calcul rend la détermination de la situation ou l'évaluation de diverses hypothèses très rapide. c'est ce qui rend possible de mettre à jour le dernier tableau Excel du post de Danny dynamiquement à jour au fur et à mesure des événements. Surtout que la technique d'évaluation paresseuse "lazy Eval" marche bien et minimise encore l'impact de cette stratégie.
Sur la capture, je marque d'un petit carré noir la nouvelle position de la savonnette pour nous aider à suivre l'intrigue.
- Fig3_dprtl manche 6.gif (26.94 Kio) Vu 5079 fois
Mais revenons au jeu où les intervenant ne se doutent de rien :
Le PC-1211 sonne un rebond et annonce le résultat : SAVONETTE TOUCHEE, UN REBOND. Aïe, ça craint pour moi ! Je donne d'un seul coup beaucoup d'information. En pressant ENTER, je valide le coup et lance la mise à jour du tableau de jeu.
Utilisant le tableau où sont précalculés les touches et déplacements de la savonnette, mon PC-1211 établit la liste des nouvelles positions possibles.
Il ajoute simplement une unité à leur status ce qui a pour effet de rendre les anciennes positons caduques.
Toutes les nouvelles positions sont marquées négativement; elles sont toutes en attente d'une réévaluation.
La fin de la mise à jour est annoncée par un Bip et l'affichage transitoire indique que nous sommes maintenant en phase 2. et qu'il y seulement 3 positions actives.
Je saisie le nouveau coup de mon adversaire, il joue en 4.1
Ah! La position préférée de
Marge. Là je me suis dit, c'est fini
dprtl va gagner !
Mais ! Oh! Surprise, mon PC-1211 annonce un chou blanc ! Alors que la cote est de 1 pour 3 de gagner, pas de bol ça tombe à coté !
Vite, je valide par ENTER pour tenter ma chance.
J'ai maintenant 1/2 chance de tomber juste ! Je croise les doigts.
- Fig4_dprtl manche 6.gif (25.26 Kio) Vu 5079 fois
Le Bip et l'affichage transitoire de la fin de la mise à jour du plateau de jeu annonce la phase 2. et qu'il reste effectivement 2. positions possibles.
Mon PC-1211 commence donc les évaluations par la position 6.1 et affiche transitoirement "6.1 ^" puis il sélectionne cette position avant d'évaluer la seconde en 1.3
Je n'en dirais pas plus aujourd'hui sur la procédure d'évaluation, surtout à partir de ces deux positions de fin de jeu atypiques qui ne permettent pas d'illustrer le fonctionnement de ce sous-programme.
Comme il n'y a pas de position possible adjacente le score est maximisé artificiellement.
La seconde position est retenue à son tours: par chance son registre a une valeur un peu supérieure car il y a plus de rebonds possibles et donc elle est préférée à la précédente. Mais c'est un effet secondaire induit et indirect (presque involontaire).
Comme quoi gagner à ce jeu tiens à un fil.
C'est lors de cette manche que je remonte mon score face à dprtl qui mener quelques temps avant 3 à 0.