#### 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.

