Ce chapitre va vous conduire pas à pas dans la réalisation d’un jeu de morpion (tic-tac-toe). Rappel rapide des règles : deux joueurs placent alternativement des croix et des cercles sur un damier de 3 × 3 cases. Le premier joueur qui aligne 3 symbôles identiques remporte la partie.
Dans un répertoire morpion, créez un fichier index.html contenant un élément <canvas>
et deux liens JavaScript : - l’un vers le fichier fabric.min.js, que vous recopiez dans votre répertoire, - l’autre vers le fichier morpion.js que vous créez également dans votre répertoire. Le travail qui suit concerne l’écriture du code JavaScript dans le fichier morpion.js.
Créez une constante canvas
qui identifie l’élément <canvas>
créé dans le fichier index.html.
Fixez les dimensions du canvas : 250 × 250 pixels.
Ecrivez une fonction ligne
qui prend 4 arguments :
x1, y1, x2, y2 : les coordonnées des deux extrémités de la ligne
couleur : la couleur de la ligne. Par défaut, la ligne est de couleur noire. Cette fonction retourne un objet fabric.Line tel que :
la largeur du trait soit de 5 pixels,
la propriété selectable
soit fausse.
Ecrivez une fonction ligneH
retourne une ligne horizontale, et qui prend 3 arguments :
Ecrivez une fonction ligneV
retourne une ligne verticale
Ecrivez le code qui utilise les deux fonctions ligneH
et ligneV
pour dessiner le damier suivant :
Ecrivez une fonction cercle
qui retourne un objet fabric.Circle. Cette fonction prend 4 arguments :
Ecrivez une fonction croix
qui retourne deux objets fabric.Line. Pour cela, cette fonction fait appel à la fonction ligne
que vous avez créée précédemment. Cette fonction prend 4 arguments :
Attention : En JavaScript, une fonction f peut retourner plusieurs valeurs en même temps en utilisant la syntaxe return [v1,v2]
. Pour appeler la fonction f, on écrit alors [x,y] = f(), où x
et y
sont des variables. Ci desous un exemple complet que vous pouvez tester :
function f(){
const x=10, y=20;
return [x,y];
}
let [z1,z2] = f();
console.log("z1=",z1);
console.log("z2=",z2);
Les éléments graphiques étant complets, il faut maintenant intercepter un click de souris dans le canvas, et en fonction de l’endroit où il s’est produit, afficher un symbôle (croix ou cercle), ou pas.
A l’aide de la méthode on
, les différents objets graphiques définis par Fabric.js
réagissent à des évènements. La liste des évènements auxquels ils réagissent est donnée ici. Pour identifier à quel endroit un évènement click s’est produit dans le canvas, testez le code suivant:
canvas.on('mouse:down', options => {
const evt = canvas.getPointer(options.e, false);
console.log("x,y=",evt.x,evt.y);
}
Ecrivez une fonction coordonnées
qui prend un évènement en argument, et qui retourne les coordonnées de l’endroit où on a cliqué dans la grille. Cette fonction retourne deux valeurs :
Réagissez à un click
pour afficher les coordonnées cliquées dans la grille. Si on a cliqué en dehors de la grille, il ne faut rien afficher.
Créez la variable joueur
, dont la valeur initiale est égale à 0. Dans la suite du code, cette variable prendra alternativement les valeurs 0 et 1 en fonction du joueur dont c’est le tour.
Créez le tableau à deux dimensions suivant :
const grille = [[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]];
Ce tableau va servir à mémoriser les cases qui ont déjà été jouées, et aussi de savoir qui a joué où. Lorsque la case de coordoonées (i,j) a pour valeur -1, cela signifie que personne n’a encore jouée en ligne i et colonne j. Si la valeur dans cette case et 0 ou 1 cela signifie que le joueur 0 ou 1 y a déjà joué.
Modifiez le code de la fonction déclenchée par l’évènement mouse:down
de sorte que :
Ecrivez une fonction gagne
qui prend en argument un numéro de joueur, et qui retourne true
ou false
selon que ce joueur a aligné trois symbôles identiques ou non (lignes, colonnes, diagonales).
Utilisez cette fonction pour afficher un message (alert
) lorsqu’un joueur a gagné.
Faites en sorte qu’il ne soit plus possible de jouer lorsqu’un joueur a gagné.
A l’aide de la classe Text, affichez différents messages :
Ajoutez un bouton reset qui permet de jouer une nouvelle partie
On souhaite maintenant jouer contre la machine.
f
. Lorsque vous raffraichissez la page, plus rien ne s’affiche. Pour cela, vous devez faire appel à votre fonction f
en la lançant comme ceci :f()
. Ce fonctionnement est plus complexe qu’il n’y paraît. Rendez-vous sur cette page pour plus d’explications.