TP 5 : puissance 4
Créer un jeu de puissance 4 en JavaScript.
Partie 1 : le moteur de jeu
Nous allons créer un moteur de jeu qui permet de jouer une partie de puissance 4.
Créer un fichier puissance4.js
qui contiendra le moteur de jeu.
Créer une classe Puissance4
qui contiendra les méthodes suivantes :
constructor()
: initialise le jeuplay(column)
: joue un coup dans la colonnecolumn
getCurrentPlayer()
: retourne le joueur dont c’est le tourgetWinner()
: retourne le joueur gagnant (ounull
si personne n’a gagné)getBoard()
: retourne le plateau de jeu (le tableau de tableau)logBoard()
: affiche le tableau de jeu dans la console (on pourra utiliserconsole.table
)
Le plateau de jeu sera représenté par un tableau de 6 lignes et 7 colonnes. Chaque case pourra contenir un des trois états suivants : null
(case vide), A
(joueur A) ou B
(joueur B).
constructor()
1. Le constructeur initialisera le plateau de jeu avec toutes les cases vides (initialisées à null
).
Le plateau est représenté par un tableau de 6 lignes, chaque ligne contenant un tableau de 7 éléments représentant les cases de chaque colonnes.
Ainsi, pour accéder à la case en ligne 3 et colonne 4, on pourra utiliser this.#grid[3][4]
.
Pour cela, on pourra utiliser la méthode Array.from
.
Exemple d’utilisation de Array.from
const nombreJusqua10 = Array.from({ length: 10 }, (v, i) => i);
logBoard()
2. La méthode logBoard()
permettra d’afficher le plateau de jeu dans la console. On pourra utiliser la méthode console.table
pour afficher le tableau.
Vérifier que votre code fonctionne en initialisant une instance de la classe Puissance4
et en affichant le plateau de jeu dans la console.
const game = new Puissance4();
game.logBoard();
getCurrentPlayer()
3. Le premier joueur sera le joueur A. La méthode getCurrentPlayer()
retournera le joueur dont c’est le tour. Ce dernier changera à chaque coup joué.
Faire en sorte que le joueur courant ne puisse pas être modifié directement depuis l’extérieur de la classe (on pourra utiliser le mot-clé private
).
play()
4. La méthode play(column)
permettra de jouer un coup dans la colonne column
. Le coup sera joué par le joueur dont c’est le tour (joueur A ou joueur B). La méthode retournera true
si le coup a été joué, false
sinon.
Vérifier que votre code fonctionne en jouant un coup dans une colonne.
const game = new Puissance4();
game.play(3);
game.logBoard();
getWinner()
5. La méthode getWinner()
retournera le joueur gagnant (ou null
si personne n’a gagné).
Indice : on pourra utiliser une méthode privée #checkWin(row, column)
qui vérifiera si un joueur a gagné à la fin de la méthode play
. De cette manière, on sait à partir de quel jeton il faut vérifier les alignements.
Vérifier que votre code fonctionne :
const game = new Puissance4();
game.play(3); // A
game.play(1);
game.play(3); // A
game.play(6);
game.play(3); // A
game.play(4);
game.play(3); // A
game.logBoard();
console.log(game.getWinner()); // A
Partie deux : l’interface
Créer un fichier
puissance4.html
qui contiendra l’interface du jeu, et un fichierindex.js
qui contiendra le code JavaScript permettant d’interagir avec le moteur de jeu.Vous pouvez utiliser le code HTML suivant :
<!doctype html> <html lang="fr"> <head> <meta charset="UTF-8" /> <title>Puissance 4</title> <link rel="stylesheet" href="style.css" /> </head> <body> <script src="index.js" type="module"></script> <h1>Puissance 4</h1> <div id="board"></div> </body> </html>
Pour pouvoir utiliser les modules avec votre projet, il faudra installer une extension VSCode qui permet de lancer un serveur local. Vous pouvez installer l’extension
Live Server
par exemple. Puis, faire un clic droit sur le fichierpuissance4.html
et choisirOpen with Live Server
.Créer une fonction
renderBord
qui affiche le plateau de jeu dans la divboard
. Cette fonction devra créer les éléments HTML du plateau de jeu. Le plateau sera représenté par plusieursdiv
représentant les colonnes et les cases du jeu.
<div id="board">
<div class="column">
<div class="case"></div>
...
</div>
</div>
Les case seront représentées par des div
avec la classe case
. Les cases du joueur A auront en plus la classe player-A
, les cases du joueur B auront la classe player-B
.
Pour styliser le plateau de jeu, vous pouvez utiliser le fichier style.css
suivant :
#board {
display: flex;
}
.column {
display: flex;
flex-direction: column;
}
.case {
width: 50px;
height: 50px;
border: 1px solid black;
}
.case.player-A {
background: radial-gradient(circle at 50% 50%, #ff0000 50%, #990000 50%, #990000 70%, white 70%);
}
.case.player-B {
background: radial-gradient(circle at 50% 50%, #0000ff 50%, #000099 50%, #000099 70%, white 70%);
}
- Faire en sorte que le jeu puisse être joué en cliquant sur les colonnes du plateau :
- Afficher en haut le joueur dont c’est le tour.
- Jouer un coup dans la colonne en cliquant dessus
- Si un joueur a gagné, on affichera un message de victoire
Partie 3 : Améliorations
Ces améliorations vous familiariseront avec des notions CSS plus avancées. Ces notions ne seront pas vues en cours, mais elles vous seront très utiles si vous souhaitez vous spécialiser en développement front-end.
Ajouter un jeton de la couleur du joueur au dessus de la colonne survolée par la souris. Vous pouvez le faire uniquement en CSS en utilisant la pseudo-classe
:hover
et la propriété::before
. Pour connaître la changer la couleur du jeton en fonction du joueur, vous pouvez ajouter une classe CSS à la grille de jeu contenant le joueur courant.- Voir la documentation sur ::before
- Tutoriel sur l’utilisation des pseudo-classes CSS
- Tutoriel sur les pseudo-éléments CSS
Faire en sorte que les joueurs puissent choisir la couleur de leur jeton.
Utiliser un
input
de typecolor
pour permettre aux joueurs de choisir leur couleursLorsque les couleurs seront modifiée, le code javascript devra mettre à jour une variable CSS contenant la couleur du joueur A et B. Les classes CSS des jetons devront être modifiées pour utiliser ces variables CSS.
Voir la documentation sur les input de type color
Voir une explication sur les variables CSS
Ajouter une animation lorsqu’un jeton est joué. Le jeton doit tomber depuis le haut et rebondir très lègerement sur le jeton du dessous. Pour cela, vous pourrez utiliser une animation CSS. Il vous faudra vous souvenir du dernier coup joué pour ajouter une classe spécifique déclenchant l’animation sur la case correspondante.
- Voir la documentation sur les animations CSS
- Tutoriel sur l’utilisation des animations CSS