? users online
  • Logout
    • Open hangout
    • Open chat for current file
<div class="notebook">

<div class="nb-cell markdown" name="md1">
# Pierre-Feuille-Ciseaux, stratégies IA symboliques adverses

Ce mini-projet ProLog a pour cadre le jeu "pierre/feuille/ciseaux" (cf. [wpkd](https://fr.wikipedia.org/wiki/Pierre-feuille-ciseaux)). 

L'objectif est de programmer plusieurs stratégies de jeu (des IA symboliques). Trois stratégies seront envisagées :

* stratégie IA adverse **StratIAdvCst** pour combattre des stratégies de joueurs **constant-e-s** ou quasi-constant-e-s (Strat-0)
* stratégie IA adverse **StratIAdvSpl** pour combattre des stratégies de joueurs **simples** reposant sur une mémoire limitée à une information unique récente (Strat-1) ; l'information, peut être le dernier coup joué par le joueur ou l'ia, ou le gain de la dernière manche
* stratégie IA adverse **StratIAdvHmn** pour combattre des stratégies **humaines** reposant sur une mémoire limitée à quelques informations venant des dernières manches (Strat-3 pour ce mini-projet, reposant sur 3 informations en tout, issues des 3 dernières manches au plus ; pourquoi 3 ? typiquement, pour un joueur humain, on pourrait prendre 6-8, mais dans ce mini-projet, on se limitera à 3, ce sera probablement déjà assez)
</div>

<div class="nb-cell markdown" name="md2">
Un début de code est fourni ci-après, comprenant :
* une partie consacrée aux stratégies, avec quelques exemples de stratégies
* une partie consacrée à la gestion d'une partie
</div>

<div class="nb-cell markdown" name="md3">
Travail à faire et suggestions d'extensions :  

* Dupliquer ce document sur swish (se connecter, par exemple avec un compte google ; dupliquer ce document File/Save/Fork)
* compléter cette introduction par vos noms, date, formation, objectifs de travail, etc.
* supprimer/modifier les éléments d'introduction qui n'ont pas d'intérêt ou sont obsolètes (ex. : ce paragraphe)  
* ajouter d'autres éléments s'ils vous semblent nécessaire (par exemple une partie introductive sur les stratégies adverses)
</div>

<div class="nb-cell markdown" name="md9">
**Important : le hasard est interdit dans ce mini-projet, tout doit être reproductible et explicable.**

rem. : librairies chargées (dif, clpq)
</div>

<div class="nb-cell program" data-background="true" name="p1">
:- use_module(library(dif)).		% Sound inequality
:- use_module(library(clpq)).		% Constraints over rational numbers
</div>

<div class="nb-cell markdown" name="md4">
## 1. Stratégies

Les stratégies sont des prédicats ayant le profil suivant :

```
%% nomStratégie(en entrée une liste Historique, en sortie : un coup CoupProposé pour la prochaine manche)
%%   rem. l'historique est la liste des coups joués
%%   ex. d'historique : [[pierre,feuille],[pierre,pierre],[feuille,ciseaux]]
%%   pour faciliter l'accès à l'historique, la dernière manche jouée est en premier dans la liste
%%   en premier dans une manche, se trouve le coup joué par l'adversaire, votre coup (le coup de l'IA) est en second
```

Exemple :
</div>

<div class="nb-cell program" data-background="true" name="p3">
%% stratégie (de joueur) constant-e qui donne toujours la pierre
strategieCstPierre(_R,pierre).

%% stratégie (adverse) simple, qui combat la stratégie constante pierre et sinon joue lui-même la pierre
strategieSimpleContrePierre([],pierre).
strategieSimpleContrePierre([[pierre,_Autre]|_Historique],feuille).
strategieSimpleContrePierre([[feuille,_Autre]|_Historique],pierre).  %%il y a probablement mieux à faire ici
strategieSimpleContrePierre([[ciseaux,_Autre]|_Historique],pierre).
</div>

<div class="nb-cell markdown" name="md5">
Suggestions d'extensions :  

* ajouter des stratégies de joueur pour tester vos programmes et stratégies adverses (Strat-0, Strat-1, Strat-3, Strat-oo {Strat-oo : stratégie globale qui peut reposer sur tout l'historique})
* ajouter des stratégies adverses pour les stratégies de joueur précédentes
  * pour contrer les stratégies constantes (Strat-0), une stratégie adverse à une mémoire (Strat-1) existe, elle est presque donnée
  * pour contrer les stratégies à une mémoire unique (Strat-1), il y a des stratégies adverses à une mémoire limitée (Strat-3) qui marchent plus ou moins (n'y passez pas trop de temps), pour avoir une stratégie qui marche tout le temps (ou presque), il faut peut-être une stratégie adverse globale {Strat-oo}).
  * pour contrer les stratégies à une mémoire limitée (Strat-3), il faut probablement une stratégie adverse globale {Strat-oo}).
</div>

<div class="nb-cell markdown" name="md7">
## 2. Gestion d'une partie et comparaison entre stratégies

Une partie est composée de plusieurs manches (le nombre de ces manches doit être défini à l'avance). Chaque manque est composée d'un couple de coups : CoupJoueur, CoupAdverse (IA). Chaque coup est à choisir entre pierre, feuille, ciseaux.

Les prédicats suivants gèrent une partie entre deux stratégies fixes :
</div>

<div class="nb-cell program" data-background="true" name="p5">
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% gestion d'une partie entre 2 stratégies fixes %%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
jouerUneMancheStrategieFixeVsStrategieAdverseFixe(ResultatsPrecedents,[CoupJoueur,CoupAdverse]):-
    strategieCstPierre(ResultatsPrecedents,CoupJoueur), %% ici la stratégie est la stratégie strategieCstPierre
    strategieSimpleContrePierre(ResultatsPrecedents,CoupAdverse). %% ici la stratégie (adverse) est la stratégie strategieSimpleContrePierre
   
jouerUnePartieStrategieFixeVsStrategieAdverseFixe(0,[]).
jouerUnePartieStrategieFixeVsStrategieAdverseFixe(NombreDeManches,[ResultatManche|ResultatsPrecedents]):-
    {NombreDeManches&gt;0, NMoins = NombreDeManches-1},
    jouerUnePartieStrategieFixeVsStrategieAdverseFixe(NMoins,ResultatsPrecedents),
    jouerUneMancheStrategieFixeVsStrategieAdverseFixe(ResultatsPrecedents,ResultatManche).
</div>

<div class="nb-cell markdown" name="md10">
Exemple de partie :
</div>

<div class="nb-cell query" name="q4">
jouerUnePartieStrategieFixeVsStrategieAdverseFixe(3,Resultat).
</div>

<div class="nb-cell markdown" name="md11">
À part la première manche (en fin d'historique), cette stratégie adverse de l'IA (strategieSimpleContrePierre) l'emporte toujours sur la stratégie du joueur (strategieCstPierre). Ce serait pareil contre une stratégie du joueur de type strategieCstCiseaux, par contre, face à une stratégie du joueur strategieCstFeuille, elle serait perdante.  

Pour automatiser l'évaluation des stratégies, la gestion suivante d'une partie est proposée (avec mise en paramètre des stratégies) :
</div>

<div class="nb-cell program" data-background="true" name="p8">
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%  gestion d'une partie entre stratégies données en paramètre   %%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
jouerUneMancheParametree(StrategieJoueur, StrategieAdverse, ResultatsPrecedents, [CoupAdversaire,CoupIA]):-
    call(StrategieJoueur, ResultatsPrecedents, CoupAdversaire), 
    call(StrategieAdverse, ResultatsPrecedents, CoupIA). 

jouerUnePartieParametree(_StrategieJoueur, _StrategieAdverse,0,[]).
jouerUnePartieParametree(StrategieJoueur,StrategieAdverse,NManches,[ResultatManche|ResultatsPrecedents]):-
    {NManches&gt;0, NMoins = NManches-1},
    jouerUnePartieParametree(StrategieJoueur,StrategieAdverse,NMoins,ResultatsPrecedents),
    jouerUneMancheParametree(StrategieJoueur,StrategieAdverse,ResultatsPrecedents,ResultatManche).
</div>

<div class="nb-cell markdown" name="md12">
Exemple d'utilisation :
</div>

<div class="nb-cell query" name="q1">
jouerUnePartieParametree(strategieCstPierre,strategieSimpleContrePierre,5,R).
</div>

<div class="nb-cell markdown" name="md13">
Suggestions d'extensions : 
* améliorer l'affichage des résultats d'une parties (on ne sait même pas qui a gagné à la fin !)
* étendre la gestion d'une partie à des listes de stratégies, pour savoir quelle stratégie est la plus efficace, par exemple, par analyse d'un tournoi entre stratégies.
* ajouter une gestion de partie interactive avec un joueur humain.
</div>

<div class="nb-cell markdown" name="md6">
## 3. Travail à faire (en binôme)

* Dupliquer ce document sur swish (se connecter, par exemple avec un compte google ; dupliquer ce document File/Save/Fork)
* Réfléchir à un objectif global de travail pour ce mini-projet, le rédiger succinctement en début de document.
* Compléter les cellules de codes et de tests de ce document, en ajouter en fonction de vos objectifs
* Rédiger les parties explicatives, ajouter si nécessaire une organisation hiérarchique plus riche (parties/sous-parties)
* À la fin, finaliser la rédaction de ce document pour en faire un compte-rendu que l'on aura envie de lire (avec codes, tests, exemples et explications)
</div>

<div class="nb-cell markdown" name="md8">
rem. :  

* pour tester vos stratégies adverses, 3 exercices sur Caseine sont disponibles, un exercice pour chaque forme de stratégie adverse
  * [https://moodle.caseine.org/mod/vpl/view.php?id=85914](https://moodle.caseine.org/mod/vpl/view.php?id=85914) 
  * [https://moodle.caseine.org/mod/vpl/view.php?id=85927](https://moodle.caseine.org/mod/vpl/view.php?id=85927)
  * [https://moodle.caseine.org/mod/vpl/view.php?id=86179](https://moodle.caseine.org/mod/vpl/view.php?id=86179)
</div>

<div class="nb-cell markdown" name="md14">
Fin.

À vous de jouer.

Et/ou bon travail !
</div>

</div>