Puissance 4, Javascript et le DOM
Le but de ce TD est de se familiariser avec le langage Javascript. Nous allons uniquement travailler côté client. Pour réussir ce TD, vous avez besoin uniquement d’une connexion internet. En effet, il vous faudra chercher par vous-même certaines questions délicates.
- Commence par te créer un nouveau projet sur Glitch.
On s’échauffe avec le CSS
-
Crée d’abord un document HTML qui contient une balise
<div>
contenant une table avec trois lignes et 2 colonnes. Chaque cellule étant vide et pense à identifier le<div>
. -
Rajoute une feuille de style et donne une largeur et une hauteur aux cellules de ta table. Rajoute des bords bleus à ta cellule (
border
). En utilisantborder-radius
, fais en sorte d’obtenir ceci:Enfin, en utilisant
background-color
fais en sorte d’obtenir ceci: -
Le but va être de jouer des jetons dans la grille de deux couleurs différentes. Rajoute deux classes
player1
etplayer2
par exemple et fais en sorte de remplir la couleur des cellules en fonction de la classe.
Unobtrusive (discret) JavaScript
On veut pouvoir jouer sur un grand tableau. Comme vu en cours, on essaye d’avoir une page qui peut être affichée même si le javascript est désactivé.
Ici, on va sortir un message d’erreur si ca ne marche pas, mais toujours afficher la page ref.
-
Enlève l’ancienne table et remplace le
div
par<div id="...">Activez JavaScript pour jouer.</div>
-
Rajoute un script javascript, utilise
defer
pour attacher le script. En utilisantconsole.log
dans le script et en affichant la console (Shift+Ctrl+K
pour Firefox,F12
pour Chrome) quand tu affiches ton site, vérifie que tout fonctionne comme il faut. -
Dans ce jeu, on va séparer la logique du jeu et le code qui tourne dans un tableau javascript des éléments du DOM du document HTML. Déclare une variable globale
board
et initialise à un tableau d’entiers de taille 6×7 contenant que des zéros. Pense à utiliserconsole.log
pour vérifier ce que tu fais !Note: contrairement à C ou Java, les tableaux en JavaScript n’ont pas une taille fixée et les tableaux à deux dimensions peuvent être simulés ou bien par un tableau à une dimension ou bien par un tableau de tableaux.
Utilise
Array(n)
et/ou.fill()
-
Déclare une fonction
set(row, column, player)
qui prend en entrée une ligne et une colonne et un entier et change la valeur du tableauboard
à cet endroit. -
Génération du DOM: écris une fonction
render()
qui:- Trouve l’élément
<div>
en utilisantdocument.querySelector
. - Vide cet élément (
.innerHTML = ''
) - Crée la
<table>
du noeud du DOM node en utilisantdocument.createElement
, et ajoute cet élément à la bonne place (.appendChild
). - Crée les
<tr>
et<td>
dans ta<table>
. Teste ta fonction et vérifie que ta page affiche bien ce qu’il faut.
- Trouve l’élément
-
Modifie
render()
pour que le<td>
à la position (i,j) a la bonne classe en fonction de sa valeur contenue dans leboard
. Tu peux utilisermy_element.className = 'some_class_name';
Teste ton travail avec la console en appelant
set
etrender
. -
Definis une variable globale
turn
, qui indique à qui c’est le tour de jouer. -
Déclare une fonction
play(column)
qui- prend en entrée une colonne,
- regarde dans le
board
et trouve la première cellule vide. - si aucune cellule n’est vide, return
false
, - sinon change la valeur de la cellule à la valeur de
turn
, change la valeur deturn
et renvoie la valeur de la ligne correspondante.
Teste ta fonction !
événements !
C’est le momnet de jouer. Il faut lier le click (événement) au code Javascript. On pourrait associer un événement à chaque cellule, mais en JS on peut faire mieux: créer un événement pour la table en entière et utiliser .currentTarget
à la place de .target
.
Pour réagir et savoir où on est, il y a plusieurs solutions. En voici une:
-
Utilise
.addEventListener()
, et définis un handler pour l’événementclick
sur le tableau (<table>
element). Pour voir ce que cela fait, éxécuteconsole.log(event.target)
Teste tout cela en cliquant, et essaye avec
.currentTarget
. -
Modifie
render()
pour que chaque cellule<td>
contienne un attributdata-column
égal à la colonne contenant le<td>
. Ces attributsdata-*
ont une API spéciale en Javascript: chaque noeud du DOM possède un champsdataset
qui premet de lire et écrire à cesdata-*
.Par exemple, simy_cell
represente un élément<td>
le code suivant// example using dataset my_row.appendChild(my_cell); my_cell.dataset.column = 0;
va insérer un noeud
<td data-column="0"></td>
dans le document. Attention, les propriétés
dataset
sont converties en string par JS.Modifie alors l’événement du clic pour qu’il affiche la valeur contenue dans
data-column
. Encore une fois, teste avant de continuer. -
Maintenant on peut jouer ! Modifie l’événemtn du clic pour répondre et jouer ou ne fait rien si le clic est en dehors d’une cellule. (Tu peux tester l’exitence de
dataset.column
).
Optionnel, à faire chez soi pour s’entrainer.
Si tu veux continuer à t’entrainer avant de commencer les projets, ce qui suit peut t’aider.
-
Contruis une fonction qui vérifie si un coup est gagnant ou pas.
-
Modifie l’application de telle sorte que: si un coup est gagnant, on affiche le vainqueur, et si on clique encore, on recommence le jeu.
-
Utilise la propriété
animation
de CSS pour changer ce que fait l’interface pour les 4 jetons gagnant. guide sur animations CSS). -
Utilise la propriété
box-shadow
. -
Mets ton code dans une classe javascript et enlève les variables globales pour avoir plusieurs jeux par page.
-
Teste le jeu sur ton smartphone et essaye d’avoir quelque chose de responsive. Tu eux voir cela aussi en faisant
Shfit+Ctrl+M
sur chrome ou firefox. guide on mobile development).