196Fermer198
EthanielLe 03/09/2004 à 22:33
Hop là, petit repêchage du topic juste avant qu'il se fasse attraper par les méchants cadenas grin !

Je refais une synthèse (complétée et remise à jour) du comportement que devront avoir les IA et les interface pour permettre à un humain de jouer (je qualifierai cependant génériquement le tout d'IA) ...

* Le jeu de Puissance 4 (rappel : 7 colonnes et 6 lignes) se joue sur TI 89/92+/V200
* Les IA peuvent être programmées en n'importe quel langage acceptée par ces calculatrices (TI-Basic, C, Asm)
* Les IA sont lancées à tour de rôle par un méta-programme, l'arbitre
* L'IA dispose d'un répertoire complet de nom quelconque pour y faire ce qu'elle veut
* Par défaut, le programme principal de l'IA s'appelle joueur(), mais n'importe quel autre nom peut être choisi, il suffit d'en avertir le programme arbitre (ceci n'est pas de votre ressort, vous n'avez pas à vous en occuper)
* Le programme joueur() (ou tout autre nom) ne devra pas utiliser d'arguments
* Pour communiquer avec l'arbitre, l'IA utilise 2 variables appelées par défaut colonne (qui servira toute la partie) et nom (qui ne servira qu'au début) ; là aussi, d'autres noms peuvent être choisis
* C'est au programme joueur de gérer sa représentation de la partie en cours, en sachant uniquement dans quelle colonne vient de jouer son adversaire

* L'arbitre se charge de compléter les variables colonne et nom de l'IA qui va jouer, puis lance le programme principal joueur()
* Une fois lancé (le répertoire courant est celui de l'IA), joueur() analyse les variables colonne et nom, ainsi que toutes les variables de son répertoire qu'il aura jugé bon de créer pour enregistrer l'état de la partie, puis modifie en conséquence les variables colonne et nom avant de se terminer normalement
* Une fois le programme joueur() terminé, l'arbitre récupère les variables colonne et nom modifiées et les vérifie, met à jour l'affichage graphique, avant de recommencer le cycle pour l'autre IA

* Lorsque joueur() est lancé, la variable colonne contient une valeur numérique (type NUM) entière comprise inclusivement entre -1 et 10

* Si colonne = -1 :
>> l'IA sait qu'elle est le joueur 2 (pions X) et qu'une nouvelle partie a été lancée
>> la variable nom contient une valeur numérique valant soit 1 (jeu sur 89), soit 2 (jeu sur 92+/V200)
>> la nouvelle partie n'étant pas encore commencée, joueur() doit en profiter pour initialiser ses variables
>> au moment où joueur() se termine et rend la main à l'arbitre, la variable colonne doit toujours valoir -1, et la variable nom doit contenir une chaîne de caractère nommant l'IA et faisant au maximum N caractères, N dépendant de la taille de l'écran de la calculatrice, donc dépend de la valeur de nom (1 ou 2) au moment du lancement de joueur() (je n'ai pas terminé la partie graphique de l'arbitre, donc je ne sais pas encore combien vaudront N, désolé ...)

* Si colonne = 0 :
>> l'IA sait qu'elle est le joueur 1 (pions O) et qu'une nouvelle partie a été lancée
>> la variable nom contient une valeur numérique valant soit 1 (jeu sur 89), soit 2 (jeu sur 92+/V200)
>> la nouvelle partie venant de commencer, joueur() doit en profiter pour initialiser ses variables, avant de jouer le premier coup
>> au moment où joueur() se termine et rend la main à l'arbitre, la variable colonne doit contenir une valeur numérique entière comprise inclusivement entre 1 et 7, et désignant le numéro de la colonne jouée (les colonne sont numérotées normalement d'un bord à l'autre), et la variable nom doit contenir une chaîne de caractère nommant l'IA et faisant au maximum N caractères, N dépendant de la taille de l'écran de la calculatrice

* Si colonne est compris inclusivement entre 1 et 7 :
>> la variable colonne contient le numéro de la colonne venant d'être jouée par l'adversaire
>> au moment où joueur() se termine et rend la main à l'arbitre, la variable colonne doit contenir le numéro de la colonne que l'IA décide de jouer, tandis que la variable nom n'a dorénavant plus d'utilité

* Si colonne = 8 :
>> l'IA sait qu'elle vient de gagner et que la partie est finie
>> si nom = "N", l'IA a gagné par victoire 'normale', alors que si nom = "D", l'IA a gagné par disqualification de l'adversaire
>> la partie venant de s'achever, joueur() doit en profiter pour effacer ses variables au besoin

* Si colonne = 9 :
>> l'IA sait qu'elle vient de perdre et que la partie est finie
>> si nom = "N", l'IA a perdu par victoire 'normale' de l'adversaire, alors que si nom = "D", l'IA a perdu par disqualification
>> la partie venant de s'achever, joueur() doit en profiter pour effacer ses variables au besoin

* Si colonne = 10 :
>> l'IA sait qu'il y a match nul et que la partie est finie
>> la partie venant de s'achever, joueur() doit en profiter pour effacer ses variables au besoin

* Si une IA ne respecte pas les règles venant d'être définies sur la gestion des variables colonne et nom, ou si elle joue un coup interdit (dans une colonne pleine), elle est immédiatement disqualifiée
* Chaque IA dispose d'une zone graphique de l'écran où elle est libre d'afficher ce qu'elle veut (mais qu'elle doit elle-même effacer pour écrire par-dessus), zone qui est déterminée par son numéro de joueur (selon que colonne vaille -1 ou 0 en début de partie) et la taille de l'écran (selon que nom vaille 1 ou 2 en début de partie) (je n'ai pas terminé la partie graphique de l'arbitre, donc je ne sais pas encore quelles sont ces zones, désolé ...)
* Une fois la partie finie, le programme arbitre affecte dans son propre dossier des variables colonne et nom (ces noms ne peuvent pas être changés) qui pourront éventuellement être récupérée par un méta-méta-programme (typiquement, un programme d'algorithme génétique) avant de se terminer normalement :
>> colonne vaudra soit 0 (match nul), soit 1 (IA 1 gagnante), soit 2 (IA 2 gagnante)
>> nom vaudra soit "N" (fin de partie normale), soit "D" (fin de partie par disqualification d'une IA)
* Il est à noter que l'arbitre enregistre un log de chaque partie, et un petit programme annexe permet de visionner pas à pas ces parties

Si quelqu'un veut utiliser un algorithme génétique, donc un méta-méta-programme qui lance l'arbitre de nombreuses fois de suite, je me dépêcherai de terminer complètement l'arbitre pour donner ici comment se fait son interfaçage ...

@++