Puissance 4 intelligent I3 Algorithmique Nicol Delestre Puissance 4. v2.0 1 / 29
Plan 1 Force brute 2 Analyse 3 Conception préliminaire 4 Conception détaillée 5 Développement 6 Conclusion Puissance 4. v2.0 2 / 29
Force brute La recherche de solution en force brute (ou recherche exhaustive) est l une des méthodes utilisée en informatique pour faire jouer des ordinateurs Elle utilise trois algorithmes Un générateur de coup qui pour une position et un joueur donnés est capable de lister l ensemble des coups possibles Une fonction d évaluation qui pour une position et un joueur donnés est capable de calculer qui a l avantage Une algorithme de sélection de coup qui pour une position et un joueur donnés est capable de calculer le meilleur coup pour ce joueur. L algorithme le plus connu est celui du MinMax. Position Joueur calculermeilleurcoup Coup Position Joueur générercoups Coups Position Joueur évaluer Entier Puissance 4. v2.0 3 / 29
L algorithme min-max 1 / 6 Principe La fonction d évaluation retourne un entier (ou un réel) tel que : le signe indique qui a l avantage (positif pour celui pour qui on calcule le meilleur coup, négatif pour l autre) la valeur absolue indique l importance de cet avantage Pour avoir l avantage, il faut maximiser son score On considère que l adversaire joue au mieux, c est-à-dire qu il essaye de maximiser son score, c est-à-dire minimiser celui pour qui on cherche à calculer le meilleur coup Puissance 4. v2.0 4 / 29
L algorithme min-max 2 / 6 Principe : générateur de coups et fonction d évaluation Coup du joueur (ordinateur) Coup adversaire Position P P 11 P 12 P 13 P 21 P 22 P 23 P 24 P 25 P 26 P 27 P 31 P 32 P 33 P 34 P 35 P 36 P 37 P 38 P 39 P 310 P 311 P 312 P 313 P 314 P 315 P 316 + P 41 P 42 P 43 P 44 P 45 P 46 P 47 P 48 P 49 P 410 P 411 P 414 P 415 P 416 P 417 P 418 P 419 P 420 P 421 P 422 P 423 P 424 P 425 P 426 P 427 P 428 P 429 P 430 P 431 P 432 3-4 5 6 2-3 0-4 5 10 3 5 - -6 0 6-2 -7 3 2 5-4 -1 0 1 3-8 8 2 0 Puissance 4. v2.0 5 / 29
L algorithme min-max 3 / 6 Remonter des scores (min, max) Coup du joueur (ordinateur) MAX Coup adversaire MIN Position P P 11 P 12 P 13-3 2 0 P 21 P 22 P 23 P 24 P 25 P 26 P 27 2-3 + 6 2 0 0 P 31-4 P 32 2 P 33-3 P 34-4 3 P 35 P 36 + P 37 P 38 P 39 5-6 P 310 P 311-7 2 P 312-4 P 313 P 314-1 0 P 315 P 316-8 0 + P 41 P 42 P 43 P 44 P 45 P 46 P 47 P 48 P 49 P 410 P 411 P 414 P 415 P 416 P 417 P 418 P 419 P 420 P 421 P 422 P 423 P 424 P 425 P 426 P 427 P 428 P 429 P 430 P 431 P 432 3-4 5 6 2-3 0-4 5 10 3 5 - -6 0 6-2 -7 3 2 5-4 -1 0 1 3-8 8 2 0 Puissance 4. v2.0 6 / 29
L algorithme min-max 4 / 6 Choix du coup Coup du joueur (ordinateur) MAX Coup adversaire MIN Position P P 11 P 12 P 13-3 2 0 P 21 P 22 P 23 P 24 P 25 P 26 P 27 2-3 + 6 2 0 0 P 31-4 P 32 2 P 33-3 P 34-4 3 P 35 P 36 + P 37 P 38 P 39 5-6 P 310 P 311-7 2 P 312-4 P 313 P 314-1 0 P 315 P 316-8 0 + P 41 P 42 P 43 P 44 P 45 P 46 P 47 P 48 P 49 P 410 P 411 P 414 P 415 P 416 P 417 P 418 P 419 P 420 P 421 P 422 P 423 P 424 P 425 P 426 P 427 P 428 P 429 P 430 P 431 P 432 3-4 5 6 2-3 0-4 5 10 3 5 - -6 0 6-2 -7 3 2 5-4 -1 0 1 3-8 8 2 0 Puissance 4. v2.0 7 / 29
L algorithme min-max 5 / 6 Synthèse Le sous-programme de choix d un coup a besoin : d un générateur de coups d un calcul de score d un coup Le sous-programme de calcul de score a besoin : d une fonction d évaluation de l algorithme min-max Le sous-programme min-max a besoin : d une générateur de coups d un calcul de score d un coup Puissance 4. v2.0 8 / 29
L algorithme min-max 6 / 6 Analyse descendante Position Joueur obtenirmeuilleurcoup Coup Position Joueur scoreduncoup Joueur Coup Entier Position Joueur Joueur minmax Entier Position Coup coupgagnant Position Joueur Booléen evaluer Entier Position Joueur obtenircoups Possibles Coups Position jeufini Booléen Position Joueur score Puissance 4. v2.0 9 / 29
Force brute pour le puissance 4 Générateur de coups Il suffit de répertorier toutes les colonnes du plateau qui ne sont p totalement remplies Fonction d évaluation (version très simple) Faire la somme du nombre de pions alignés multipliée par un coefficient pour chaque joueur : 1 pour un alignement d un pion 5 pour un alignement de deux pions 50 pour un alignements de trois pions 1000 pour un alignements de quatre pions Faire la différence des scores des deux joueurs Puissance 4. v2.0 10 / 29
Les types de données et leurs opérations 1 / 2 Nous avions les types : Pion qui est jaune ou rouge Contenu d une ce d un plateau qui est soit vide soit remplie par un pion qui est un ensemble de ce organisé en colonnes et lignes EtatPartie l état finale de la partie (partie gagnée ou partie nulle) Auxquels on ajoute Coups qui un ensemble de coups, avec un coup qui est le numéro d une colonne du plateau Puissance 4. v2.0 11 / 29
Les types de données et leurs opérations 2 / 2 Opérations de Coups obtenir un ensemble de coups vide (coups) Sortie : Coups obtenir le nb de coups (nb) Entrée : Coups Sortie : ajouter un coups (ajouter) Entrée : Coups, Sortie : Coups obtenir le ième coups (ieme) Entrée : Coups, Sortie : Puissance 4. v2.0 12 / 29
Analyse descendante (rappel) 1 / 3 faire une partie Afficher ObtenirCoup ObtenirCoup faireunepartie EtatPartie Pion vider plateautotalementrempli Booléen Pion jouer coupgagnant Booléen Puissance 4. v2.0 13 / 29
Analyse descendante (rappel) 2 / 3 coup gagnant coupgagnant Booléen 0..NB_LIGNES hauteur Ligne nbpionsalignes Verticalement Ligne nbpionsalignes Horizontalement Ligne nbpionsalignes Dialgonalement Ligne nbpionsalignes Dialgonalement GaucheADroite Ligne nbpionsalignes Dialgonalement DroiteAGauche Puissance 4. v2.0 14 / 29
Analyse descendante (rappel) 3 / 3 totalementrempli plateautotalement Rempli Booléen hauteur 0..NB_LIGNES Puissance 4. v2.0 15 / 29
Nouvelle analyse descendante pour l IA obtenircoup Pion obtenircoup Entier Pion scoreduncoup Pion Pion Pion minmax Entier coupgagnant Pion Booléen evaluer Entier obtenircoups Possibles Coups plateautotalement Rempli Booléen Pion score Ligne nbpionsalignes Verticalement 1..4 scorealignement Ligne nbpionsalignes Horizontalement Ligne nbpionsalignes Diagonalement Puissance 4. v2.0 16 / 29
Conception préliminaire, nouvelles fonctions / procédures 1 / 2 Opérations de Coups fonction coups () : Coups fonction nb (cps : Coups) : procédure ajouter (E/S cps : Coups,E col : ) fonction ieme (cps : Coups, ieme : ) : précondition(s) 0 < ieme et ieme nb(cps) Puissance 4. v2.0 17 / 29
Conception préliminaire, nouvelles fonctions / procédures 2 / 2 Opérations pour faire jouer l ordinateur au puissance 4 (IA) fonction obtenircoup (un : plateau, joueur : Pion, profondeur : ) : précondition(s) non plateautotalementrempli(un) fonction obtenircoupspossibles (un : plateau) : Coups fonction scoreduncoup (un : plateau, joueurref,joueurcourant : Pion, uncoup :, profondeur : ) : Entier fonction minmax (un : plateau, joueurref,joueurcourant : Pion, profondeur : ) : Entier fonction evaluer (un : plateau, joueurref : Pion) : Entier fonction score (un : plateau, joueur : Pion) : Entier Puissance 4. v2.0 18 / 29
Conception détaillée - Coups 1 / 2 Type Coups Type Coups = Structure lescoups : Tableau[1..NB COLONNES] de nbcoups : finstructure Opérations du type Coups fonction coups () : Coups Déclaration resultat : Coups debut resultat.nbcoups 0 retourner resultat fin fonction nb (cps : Coups) : debut retourner cps.nbcoups fin Puissance 4. v2.0 19 / 29
Conception détaillée - Coups 2 / 2 Opérations du type Coups (suite) procédure ajoutercoup (E/S cps : Coups,E cp : ) debut cps.nbcoups cps.nbcoups+1 cps.lescoups[cps.nbcoups] cp fin fonction ieme (cps : Coups, i : ) : précondition(s) 0 < ieme et ieme nb(cps) debut retourner cps.lescoups[i] fin Puissance 4. v2.0 20 / 29
Conception détaillée - IA 1 / 6 obtenircoup fonction obtenircoup (un :, joueur : Pion, profondeur : ) : Déclaration resultat :, cps : Coups, score,meilleurscore : Entier, i : debut cps obtenircoupspossibles(un) resultat ieme(cps,1) meilleurscore scoreduncoup(un,resultat,joueur,joueur,profondeur) pour i 2 à nb(cps) faire score scoreduncoup(un,ieme(cps,i),joueur,joueur,profondeur) si score>meilleurscore alors resultat ieme(cps,i) meilleurscore score finsi finpour retourner resultat fin Puissance 4. v2.0 21 / 29
Conception détaillée - IA 2 / 6 obtenircoupspossibles fonction obtenircoupspossibles (un : ) : Coups précondition(s) non plateautotalementrempli(un) Déclaration i : resultat : Coups debut resultat coups() pour i 1 à NB COLONNES faire si hauteur(un,i)<nb LIGNES alors ajouter(resultat,i) finsi finpour retourner resultat fin Puissance 4. v2.0 22 / 29
Conception détaillée - IA 3 / 6 scoreduncoup fonction scoreduncoup (un :, uncoup :, joueurref,joueurcourant : Pion, profondeur : ) : Entier debut jouer(un,uncoup,joueurcourant) si plateautotalementrempli(un) ou coupgagnant(un,uncoup) ou profondeur=0 alors retourner evaluer(un,joueurref) sinon retourner minmax(un,joueurref,autrejoueur(joueurcourant),profondeur-1) finsi fin Puissance 4. v2.0 23 / 29
Conception détaillée - IA 4 / 6 minmax fonction minmax (un :, joueurref,joueurcourant : Pion, profondeur : ) : Entier Déclaration resultat : Entier, cps : Coups, score : Entier, i : debut cps obtenircoupspossibles(un) resultat scoreduncoup(un,ieme(cps,1),joueurref,joueurcourant,profondeur) pour i 2 à nb(cps) faire score scoreduncoup(un,ieme(cps,i),joueurref,joueurcourant,profondeur) si joueurcourant=joueurref alors resultat max(resultat,score) sinon resultat min(resultat,score) finsi finpour retourner resultat fin Puissance 4. v2.0 24 / 29
Conception détaillée - IA 5 / 6 evaluer fonction evaluer (un :, joueurref : Pion) : Entier debut retourner score(un,joueurref)-score(un,autrejoueur(joueurref)) fin score fonction scorealignement (nbpionsalignes : 1..4) : Entier Déclaration resultat : Entier debut c où nbpionsalignes vaut 1: resultat 1 2: resultat 5 3: resultat 50 4: resultat 1000 finc retourner resultat fin Puissance 4. v2.0 25 / 29
Conception détaillée - IA 6 / 6 score fonction score (un :, joueur : Pion) : Entier Déclaration resultat : Entier, i :, j : Ligne debut resultat 0 pour i 1 à NB COLONNES faire pour j 1 à NB LIGNES faire si contenuce(un,i,j)=joueurref alors resultat resultat+ scorealignement(nbpionsalignesverticalement(un,i,j)) resultat resultat+ scorealignement(nbpionsaligneshorizontalement(un,i,j)) resultat resultat+ scorealignement(nbpionsalignesdiagonalementgaucheadroite(un,i,j)) resultat resultat+ scorealignement(nbpionsalignesdiagonalementdroiteagauche(un,i,j)) finsi finpour finpour retourner resultat fin Puissance 4. v2.0 26 / 29
Développement en Pcal 1 / 2 Ancien diagramme d unités - Texte et graphique Puissance 4. v2.0 27 / 29
Développement en Pcal 2 / 2 Nouveau diagramme d unités - Texte et graphique Puissance 4. v2.0 28 / 29
Conclusion Conclusion Sans la méthodologie du cycle en V : Il aurait été difficile d atteindre le résultat Il aurait été impossible de séparer le travail Ce qu il reste à faire pour avoir un bon programme Compléter la documentation du code Finir les tests unitaires Améliorer : la fonction d évaluation (prendre en compte qu une suite de pions non entourés compte plus qu une suite de pions entourés) les performances : élagage de l arbre de récursion (algorithme α β) Puissance 4. v2.0 29 / 29