Voir le résultat Retour à la page du projet
Afficher/Masquer les commentaires
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8"/>
<title>Memory</title>
En CSS, on peut définir la forme du pointeur de la souris avec la propriété cursor
.
Dans notre programme, lorsque le pointeur de la souris passe sur un élément img
, il prend l'aspect de la main d'indicateur de lien.
<style>
img{
cursor:pointer;
}
</style>
</head>
<body>
L'interface utilisateur est un élément table
qui contient 20 images qui correspondent aux différentes cartes du jeu.
<table id="tapis">
<tr>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
</tr>
<tr>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
</tr>
<tr>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
</tr>
<tr>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
<td><img src="fondcarte.png"/></td>
</tr>
</table>
Le code source du programme en JavaScript débute ici.
<script>
Le jeu comporte 10 motifs différents qui sont numérotés de 1 à 10.
Le tableau est initialisé avec les numéros de motifs qui se suivent.
var motifsCartes=[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10];
Le codage utilisé pour l'état des cartes est le suivant :
0 : face cachée
1 : face visible
-1 : enlevée
Au départ toutes les cartes sont présentées de dos.
var etatsCartes=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
Tableau contenant les numéros des cartes retournées à un moment donné du jeu.
var cartesRetournees=[];
Cette variable contient le nombre de paires de cartes qui ont déjà été trouvées.
var nbPairesTrouvees=0;
Le tableau imgCarte
contient les objets des éléments img
de l'interface utilisateur.
var imgCartes=document.getElementById("tapis").getElementsByTagName("img");
On parcourt le tableau des objets des éléments img
, chacun d'eux reçoit une fonction
déclenchée par l'événement onclick
.
La fonction ainsi définie est exécutée à chaque fois que l'utilisateur clique sur l'image son rôle
est d'appeller controleJeu
avec le numéro de l'image cliquée.
for(var i=0;i<imgCartes.length;i++){
imgCartes[i].noCarte=i; //Ajout de la propriété noCarte à l'objet img
imgCartes[i].onclick=function(){
controleJeu(this.noCarte);
}
}
Appel de la fonction initialiseJeu
pour mélanger les cartes.
initialiseJeu();
La fonction majAffichage
met à jour l'affichage de la carte dont on passe le numéro en paramètre.
L'affichage rendu dépend de l'état actuel de la carte (donné par le tableau etatsCartes
) :
état 0 : carte face cachée, on affichage l'image de dos de carte : fondcarte.png
,
état 1 : carte retournée, on affiche l'image du motif correspondant, on notera que les
différentes images des motifs sont dans les fichiers nommés carte1.png
, carte2.png
, etc.,
état -1 : carte enlevée du jeu, on cache l'élément img
.
function majAffichage(noCarte){
switch(etatsCartes[noCarte]){
case 0:
imgCartes[noCarte].src="fondcarte.png";
break;
case 1:
imgCartes[noCarte].src="carte"+motifsCartes[noCarte]+".png";
break;
case -1:
imgCartes[noCarte].style.visibility="hidden";
break;
}
}
La fonction rejouer
affiche un message de félicitations et permet de jouer à nouveau
en rechargeant la page dans le navigateur.
function rejouer(){
alert("Bravo !");
location.reload();
}
La fonction initialiseJeu
mélange les numéros de motif des cartes.
Pour cela un algorithme de mélange est utilisé : [explications de l'algorithme](/programmation-en-javascript/melanger-les-elements-d-un-tableau/6)
function initialiseJeu(){
for(var position=motifsCartes.length-1; position>=1; position--){
var hasard=Math.floor(Math.random()*(position+1));
var sauve=motifsCartes[position];
motifsCartes[position]=motifsCartes[hasard];
motifsCartes[hasard]=sauve;
}
}
C'est la fonction controleJeu
qui contient le coeur du programme : elle est appelée
chaque fois que l'utilisateur clique sur une carte en passant en paramètre le numéro de la carte
cliquée.
function controleJeu(noCarte){
Il est impossible d'avoir plus de deux cartes retournées en même temps, ce test évite que cela arrive, par exemple, si un utilisateur clique à toute vitesse sur plusieurs cartes.
if(cartesRetournees.length<2){
Si la carte cliquée est de dos (état 0) :
on fait passer son état à 1,
on ajoute son numéro au tableau des cartes retournées,
on fait la mise à jour de son affichage.
On notera que rien n'est fait pour les états 1 et -1 : cliquer sur une carte déjà retournée ne change rien et cliquer sur une zone de carte enlevée non plus.
if(etatsCartes[noCarte]==0){
etatsCartes[noCarte]=1;
cartesRetournees.push(noCarte);
majAffichage(noCarte);
}
Si on se retrouve avec deux cartes retournées, il faut déterminer si elles ont le même motif :
si oui : les deux cartes prennent le nouvel état -1 (c'est à dire qu'il faut les enlever) et
on incrémente la variable qui compte le nombre de paires trouvées (nbPairesTrouvees
),
si non : les deux cartes prennent le nouvel état 0 (c'est à dire qu'on les remet de dos).
if(cartesRetournees.length==2){
var nouveauEtat=0;
if(motifsCartes[cartesRetournees[0]]==motifsCartes[cartesRetournees[1]]){
nouveauEtat=-1;
nbPairesTrouvees++;
}
etatsCartes[cartesRetournees[0]]=nouveauEtat;
etatsCartes[cartesRetournees[1]]=nouveauEtat;
Afin que le joueur ait le temps de voir ce qu'il se passe, on différe la mise à jour de l'affichage des cartes de 750 ms.
Enfin au cas où toutes les paires ont été trouvées, on appelle la fonction rejouer
setTimeout(function(){
majAffichage(cartesRetournees[0]);
majAffichage(cartesRetournees[1]);
cartesRetournees=[];
if(nbPairesTrouvees==10){
rejouer();
}
},750);
}
}
}
</script>
</body>
</html>