85 lines
2.8 KiB
Markdown
85 lines
2.8 KiB
Markdown
|
|
#### Ex1 : modele MVC et pattern strategy
|
|||
|
|
|
|||
|
|
> Stratégie est un patron de conception comportemental qui permet de définir une
|
|||
|
|
> famille d’algorithmes, de les mettre dans des classes séparées et de rendre
|
|||
|
|
> leurs objets interchangeables. (source wikipédia)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
Le but est de réaliser ce pattern de conception dans le jeu très simple du chifoumi.
|
|||
|
|
|
|||
|
|
<div align="center">
|
|||
|
|
<img src="./img/chifoumi.png">
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
Pour l'instant, le jeu utilise le pattern MVC. Le modèle, qui calcule le coup de l'ordinateur utilise
|
|||
|
|
un tirage aléatoire. On veut pouvoir utilisé d'autres méthodes, qui utilisent l'historique des coups
|
|||
|
|
joués par le joueur.
|
|||
|
|
|
|||
|
|
1. Modifiez le modèle et la vue pour que le jeu affiche le pourcentage de victoires, matchs nuls et défaites du joueur depuis le début
|
|||
|
|
de la partie.
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
On veut maintenant séparer la façon dont l'ordinateur choisit son coup de la logique du jeu. Le modèle utilisera
|
|||
|
|
une stratégie donnée.
|
|||
|
|
|
|||
|
|
2. Créez un sous-répétoires `stratégies` dans lequel on stokera les différentes stratégies disponibles.
|
|||
|
|
|
|||
|
|
Les différentes stratégies réaliseront l'interface
|
|||
|
|
|
|||
|
|
```js
|
|||
|
|
getChoice(playerHistory)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
qui calcule le coup de l'ordinateur, en fonction de l'historique des différents coups du joueur.
|
|||
|
|
|
|||
|
|
3. Ecrivez 3 stratégies simples `RandomStrategy.js` (stratégie initiale), `CopyPlayerStrategy.js`
|
|||
|
|
(joue le même coup que le joueur) `CounterMostUsedStrategy.js` (joue le coup le plus joué par le joueur) :
|
|||
|
|
|
|||
|
|
Chaque fichier implémente la stratégie correspondante sous la forme :
|
|||
|
|
```js
|
|||
|
|
export default class RandomStrategy {
|
|||
|
|
getChoice(playerHistory) {
|
|||
|
|
....
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. Mettez à jour le modèle pour qu'il puisse utiliser une stratégie donnée.
|
|||
|
|
5. testez dans le main.
|
|||
|
|
|
|||
|
|
#### Ajout d'une stratégie
|
|||
|
|
|
|||
|
|
On va ajouter une stratégie markovienne d'ordre 1. On fait
|
|||
|
|
l'hyptohése que le coup du joueur dépend de son coup précedent (ordre 1).
|
|||
|
|
On met à jour au fur et à mesure la matrice de transitions entre
|
|||
|
|
les coups joué par le joueur. Par exemple,
|
|||
|
|
|
|||
|
|
```js
|
|||
|
|
{
|
|||
|
|
rock: { rock: 2, paper: 5, scissors: 1 },
|
|||
|
|
paper: { rock: 1, paper: 3, scissors: 4 },
|
|||
|
|
scissors: { rock: 6, paper: 1, scissors: 2 }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
signifie qu'après paper, le joueur a joué 1 fois rock, 3 fois paper, et 4 fois scissors.
|
|||
|
|
|
|||
|
|
On se sert de la matrice pour contrer la prédiction.
|
|||
|
|
|
|||
|
|
5. Écrivezz cette stratégie, et testez la.
|
|||
|
|
|
|||
|
|
#### Stratégie mixte
|
|||
|
|
Le but est d'implanter une stratégie mixte. On se donne une probabilité `p`.
|
|||
|
|
|
|||
|
|
- la stratégie markovienne est jouée avec la probabilité `p`.
|
|||
|
|
- la stratégie aléatoire est jouée avec la probabilité `1-p`
|
|||
|
|
|
|||
|
|
Écrivez la stratégie mixte, et testez.
|
|||
|
|
|
|||
|
|
#### Stratégie adaptative
|
|||
|
|
La probabilité `p` dépend du score. On l'adapte au fur et à mesure. Si on gagne beaucoup (trop),
|
|||
|
|
on joue au hasard, sinon avec Markov.
|
|||
|
|
|