From 8536d0b1bb0415b49ac8ba7b498892458effec4a Mon Sep 17 00:00:00 2001 From: Denis Monnerat Date: Fri, 6 Feb 2026 13:50:53 +0100 Subject: [PATCH] tp3 --- R4.01_R4.A.10/td_tp/tp3/README.md | 84 +++++++++++++++++++ R4.01_R4.A.10/td_tp/tp3/img/chifoumi.png | Bin 0 -> 31376 bytes R4.01_R4.A.10/td_tp/tp3/src/css/style.css | 41 +++++++++ R4.01_R4.A.10/td_tp/tp3/src/index.html | 40 +++++++++ R4.01_R4.A.10/td_tp/tp3/src/js/controller.js | 18 ++++ R4.01_R4.A.10/td_tp/tp3/src/js/main.js | 9 ++ R4.01_R4.A.10/td_tp/tp3/src/js/model.js | 29 +++++++ R4.01_R4.A.10/td_tp/tp3/src/js/view.js | 50 +++++++++++ 8 files changed, 271 insertions(+) create mode 100644 R4.01_R4.A.10/td_tp/tp3/README.md create mode 100644 R4.01_R4.A.10/td_tp/tp3/img/chifoumi.png create mode 100644 R4.01_R4.A.10/td_tp/tp3/src/css/style.css create mode 100644 R4.01_R4.A.10/td_tp/tp3/src/index.html create mode 100644 R4.01_R4.A.10/td_tp/tp3/src/js/controller.js create mode 100644 R4.01_R4.A.10/td_tp/tp3/src/js/main.js create mode 100644 R4.01_R4.A.10/td_tp/tp3/src/js/model.js create mode 100644 R4.01_R4.A.10/td_tp/tp3/src/js/view.js diff --git a/R4.01_R4.A.10/td_tp/tp3/README.md b/R4.01_R4.A.10/td_tp/tp3/README.md new file mode 100644 index 0000000..c1ac127 --- /dev/null +++ b/R4.01_R4.A.10/td_tp/tp3/README.md @@ -0,0 +1,84 @@ +#### 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. + +
+ +
+ +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. + diff --git a/R4.01_R4.A.10/td_tp/tp3/img/chifoumi.png b/R4.01_R4.A.10/td_tp/tp3/img/chifoumi.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc9d1fe79f935f5a58402f9c06c4c53f901a056 GIT binary patch literal 31376 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 literal 0 HcmV?d00001 diff --git a/R4.01_R4.A.10/td_tp/tp3/src/css/style.css b/R4.01_R4.A.10/td_tp/tp3/src/css/style.css new file mode 100644 index 0000000..16ae716 --- /dev/null +++ b/R4.01_R4.A.10/td_tp/tp3/src/css/style.css @@ -0,0 +1,41 @@ + +.game { +} +.choices{ + display : flex; + align-items:stretch; + height:8em; +} +.choices > span:nth-child(2) { + margin-left:3em; +} + +.choices span i{ + font-size: 2em; + cursor: pointer; + border: none; + margin-right:0.25em; + transition: transform 0.2s, color 0.2s; +} + +#player,#computer{ + font-size: 3em; + border: none; + margin-right:0.25em; +} + + +.choices span i:hover { + color:#398712 +} + +#player { + color:#398712 +} + +#computer { + color:#D93526; +} + + + diff --git a/R4.01_R4.A.10/td_tp/tp3/src/index.html b/R4.01_R4.A.10/td_tp/tp3/src/index.html new file mode 100644 index 0000000..d05cf97 --- /dev/null +++ b/R4.01_R4.A.10/td_tp/tp3/src/index.html @@ -0,0 +1,40 @@ + + + + + Pierre Feuille Ciseaux + + + + + + + + +
+

+ Pierre - Feuille - Ciseaux +

+
+ + + + + + + + + +
+
+

+

+
+
+ + + + diff --git a/R4.01_R4.A.10/td_tp/tp3/src/js/controller.js b/R4.01_R4.A.10/td_tp/tp3/src/js/controller.js new file mode 100644 index 0000000..3fdd070 --- /dev/null +++ b/R4.01_R4.A.10/td_tp/tp3/src/js/controller.js @@ -0,0 +1,18 @@ +export default class GameController { + constructor(model, view) { + this.model = model; + this.view = view; + + this.view.bindPlay(this.handlePlay); + this.view.displayScore(this.model.getScore()); + } + + handlePlay = (playerChoice) => { + const computerChoice = this.model.getComputerChoice(); + const result = this.model.getResult(playerChoice, computerChoice); + + this.view.displayResult(playerChoice, computerChoice, result); + this.view.displayScore(this.model.getScore()); + } +} + diff --git a/R4.01_R4.A.10/td_tp/tp3/src/js/main.js b/R4.01_R4.A.10/td_tp/tp3/src/js/main.js new file mode 100644 index 0000000..41c419f --- /dev/null +++ b/R4.01_R4.A.10/td_tp/tp3/src/js/main.js @@ -0,0 +1,9 @@ +import GameModel from "./model.js"; +import GameView from "./view.js"; +import GameController from "./controller.js"; + +const app = new GameController( + new GameModel(), + new GameView() +); + diff --git a/R4.01_R4.A.10/td_tp/tp3/src/js/model.js b/R4.01_R4.A.10/td_tp/tp3/src/js/model.js new file mode 100644 index 0000000..053e363 --- /dev/null +++ b/R4.01_R4.A.10/td_tp/tp3/src/js/model.js @@ -0,0 +1,29 @@ +export default class GameModel { + constructor() { + this.choices = ["rock", "paper", "scissors"]; + this.score = { player: 0, computer: 0}; + } + + getComputerChoice() { + const index = Math.floor(Math.random() * this.choices.length); + return this.choices[index]; + } + + getResult(player, computer) { + if (player === computer) return "égalité"; + + if ( + (player === "rock" && computer === "scissors") || + (player === "paper" && computer === "rock") || + (player === "scissors" && computer === "paper") + ) { + this.score.player++; + return "gagné"; + } + this.score.computer++; + return "perdu"; + } + getScore() { + return this.score; + } +} diff --git a/R4.01_R4.A.10/td_tp/tp3/src/js/view.js b/R4.01_R4.A.10/td_tp/tp3/src/js/view.js new file mode 100644 index 0000000..98c77eb --- /dev/null +++ b/R4.01_R4.A.10/td_tp/tp3/src/js/view.js @@ -0,0 +1,50 @@ +export default class GameView { + #icons = { + "rock" : "far fa-hand-rock", + "paper" : "far fa-hand-paper", + "scissors" : "far fa-hand-scissors" + } + + constructor() { + this.resultEl = document.getElementById("result"); + this.scoreEl = document.getElementById("score"); + this.buttons = document.querySelectorAll(".choices span i"); + this.player = document.getElementById("player"); + this.computer = document.getElementById("computer"); + + } + + bindPlay(handler) { + this.buttons.forEach(button => { + button.addEventListener("click", () => { + handler(button.dataset.choice); + }); + }); + } + + displayResult(player, computer, result) { + let i = document.createElement("i"); + i.classList.add(...this.#icons[player].split(' ')) + this.player.replaceChildren(i) + + i = document.createElement("i"); + i.classList.add(...this.#icons[computer].split(' ')) + this.computer.replaceChildren(i) + + + this.resultEl.innerHTML = + `Joueur , ordinateur → ${result}`; + + } + + displayScore(score) { + + let winRate = ((score.player * 100 / score.count) || 0).toFixed(2) + let lossRate = ((score.computer * 100 / score.count) ||0).toFixed(2) + let drawRate = (100 - winRate - lossRate).toFixed(2) + + this.scoreEl.textContent = + `Score — Joueur: ${score.player} | Ordinateur: ${score.computer}`; + } +} +