A la base, l'idée fût de concevoir quelques jeux d'éveil et de réflexion, en collaboration avec les enseignants. Dans le cadre du R.A.D., nous avons commencé par leur présenter un puzzle en DHTML trouvé sur le site webreference. Cette application présentait de nombreux avantages :
- le principe du puzzle est connu par tous les enfants
- le jeu n'est pas statique : on peut choisir l'image à reconstituer, le fractionnement
- visuellement l'application est légère et agréable : les pièces du puzzle semblant être véritablement éparpillées à l'écran
3.2.1 Choix technologiques
Ayant l'aval des enseignants, nous avons étudié cette application afin de la reproduire et l'étendre selon nos besoins. Ceci nous a permis d'apprendre le DHTML et de constater que cette technologie était particulièrement adaptée pour faire de façon relativement simple et efficace toutes sortes de jeux.
En effet, deux techniques semblaient possibles à l'origine :
- le couple Java-applet (application au sein d'un navigateur web)
- le DHTML (HTML dynamique)
La première solution permet de disposer de toute la puissance de Java, de sa portabilité et de ses nombreuses APIs qui permettent de tout faire ou presque. Mais cette puissance a un prix : un code certes clair mais néanmoins important et surtout une lenteur de chargement et d'exécution dès l'instant où l'on a recours à des primitives graphiques.
La seconde solution qui consiste en fait à manipuler des objets du DOM (Document Object Model) au moyen de routines JavaScript, permet de créer des applications graphiques interactives relativement facilement. Le code correspondant est certes moins élégant que du 100% objet mais il a l'avantage d'être concis et surtout d'être exécuté rapidement. Enfin, le DHTML permet de gérer facilement et efficacement le drag and drop, manipulation que l'on trouve à la base de nombreux jeux.
La rapidité de chargement et d'exécution fût déterminante dans le choix de DHTML. En effet, l'utilisateur lambda n'aime pas attendre et les enfants encore moins ! Le temps de chargement d'une applet couplé à celui d'une image aurait été simplement rédhibitoire pour obtenir au final une application d'apparence simple.
C'est donc ainsi que le DHTML a été retenu pour développer des applications ßimples" (i.e. des jeux à un joueur), les applications "complexes" (i.e. des jeux multi-joueurs à travers le réseau) nécessitant une architecture client/serveur que n'offrent évidemment pas DHTML et JavaScript.
L'ensemble des applications DHTML développées pour ce projet fonctionne exclusivement sous le navigateur Internet Explorer (à partir de la version 4 et de façon optimale sous sa version 5). C'est un choix délibéré. En effet, c'est le navigateur qui exploite au mieux le DHTML : code concis, machine graphique performante etc. Il est possible de transformer ces applications dédiées en applications cross-browsing (i.e. fonctionnant sur tous les navigateurs) moyennant un code de taille double (au minimum) chaque navigateur ayant ses propres noms d'objets, de méthodes et des fonctions plus ou moins puissantes. Ceci n'étant pas l'objectif du projet et sachant que les écoles partenaires étaient toutes équipées d'IE5 nous avons donc décidé, dans un premier temps, de développer ces applications exclusivement pour IE5.
3.2.2 Principes généraux
Quatre jeux ont été créés :
- Puzzle : un puzzle "classique"
- Anagramme : retrouver un mot à partir de ses lettres
- Symboles : associer des symboles identiques
- Symétrie : reconstituer un motif selon un axe de symétrie
Dans un souci de clarté, chaque jeu se compose de deux pages HTML consécutives : la première permet de le paramètrer et éventuellement de l'administrer, la seconde correspond au jeu proprement dit.
Le paramétrage
Ces différents jeux s'adressant à un large public, aussi bien des maternelles que des primaires, il est donc indispensable de pouvoir paramètrer leur difficulté de façon à les adapter au niveau du joueur.
Ce paramétrage de la difficulté du jeu permet non seulement de l'adapter au joueur mais aussi d'augmenter sa durée de vie. Il incite également le joueur à progresser en choisissant un niveau toujours plus difficile.
Certains jeux offrent la possibilité de choisir les ressources à utiliser (choix de l'image pour le Puzzle ou choix des pièces dans Symboles) au moyen d'un formulaire.
L'administration
Afin de maintenir un intérêt aux jeux, nous avons vu qu'il était impératif que ceux-ci soient renouvelés : il est hors de question de proposer un puzzle avec cinq images ou trois motifs différents à reproduire.
Pour palier à ce problème de durée de vie nous avons opté pour deux solutions :
- Si le jeu le permet, le contenu est renouvelé automatiquement par génération aléatoire,
- sinon les enseignants ou même les élèves peuvent enrichir le jeu avec leurs propres ressources.
C'est ainsi que, par exemple, on peut ajouter des nouvelles images pour le puzzle ou que le jeu Symétrie propose à chaque fois un nouveau motif généré aléatoirement.
Le plus simple pour ajouter des ressources aux différents jeux aurait été de demander aux utilisateurs d'utiliser un client FTP afin d'uploader leurs fichiers sur le serveur du site. Cette solution a été rejetée en raison du cahier des charges : pour un non informaticien, uploader un fichier n'est pas chose facile. En effet, il faut utiliser une nouvelle application, connaître l'adresse du serveur, éventuellement un mot de passe, savoir où mettre le fichier etc.
Pour que l'ajout de ressource se fasse simplement, il fallait arriver à masquer toute cette partie technique et se contenter d'indiquer le fichier à ajouter. Pour ce faire, nous avons conçu un formulaire d'administration propre à chaque jeu, permettant de l'enrichir de façon totalement transparente. Un ensemble de fonctions PHP se chargent ainsi d'ajouter ou supprimer des ressources sur le serveur.
Le déroulement du jeu
Tous les jeux DHTML sont basés sur le trio HTML, CSS, JavaScript.
Le DHTML (Dynamic HTML) permet de réaliser des pages HTML animées et interactives réagissant à des événements souris ou clavier.
Les CSS (Cascading Style Sheet) ou feuilles de style permettent de définir des classes d'objets et de les doter d'attributs : couleur du texte, position, visibilité, z-index etc.
Le JavaScript est un langage de script offrant une vision orientée objet du document et toutes les structures d'un langage de programmation. Il permet en particulier de manipuler les objets constituant la page HTML que l'on a défini dans la feuille de style.
Les différents jeux sont très proches techniquement et reprennent donc un grand nombre de fonctions. En effet, tous (jeu des symétries excepté) consistent à déplacer par drag and drop des composants dynamiques (pièces) pour les replacer correctement. Pour faciliter l'évaluation et la correction, chaque jeu dispose d'une zone graphique sensitive dite "zone de correction". C'est dans cette zone que les pièces doivent être disposées.
Les paramètres du jeu fixés à la première page sont enregistrés dans un cookie, la seconde page de jeu est composé de façon dynamique par une fonction JavaScript init() appelée lors du chargement de la page grâce au tag < BODY ... onLoad="init()" > .
Cette fonction init() initialise l'ensemble des paramètres et du jeu génère les divisions HTML adéquates : les composants dynamiques et la zone de correction.
L'exemple ci-dessous correspond à la création des divisions pour le jeu du Puzzle. Une pièce du puzzle correspond à une division, la variable puzzPieces au nombre total de pièces à créer.
// Creation des divisions des pieces du puzzle :
for (i=1; i<=puzzPieces; i++) {
divStr = "<DIV ID=PIECE"+i+" CLASS=clPiece>";
divStr+= "<IMG name=imPiece" +i+"></DIV>";
document.body.insertAdjacentHTML("BeforeEnd", divStr);
eval("PIECE"+i).style.pixelLeft = origineX;
eval("PIECE"+i).style.pixelTop = origineY;
}
Une fois la page et ses composants générés, il faut implémenter des fonctions pour prendre une division (function grabEl(e)), la déplacer (function moveEl(e)) et la relâcher (function dropEl(e)).
Les fonctions grabEl(e) et moveEl(e) sont quasiment identiques pour tous les jeux et sont relativement simples.
La fonction dropEl(e) est par contre plus complexe puisqu'elle correspond, en quelque sorte, à la fin d'un tour de jeu. Tout d'abord, il faut détecter si la pièce manipulée est lâchée au-dessus de la zone de correction. Si oui, il faut ensuite placer automatiquement la pièce par "magnétisation" (on ne demande pas au joueur d'ajuster la pièce au pixel près mais simplement de la lâcher au-dessus d'un quadrillage "virtuel" ) mais avant, il faut vérifier qu'il n'y a pas déjà une pièce en dessous afin de ne pas masquer celle-ci. Si tel est le cas, la pièce est rejetée sur le côté. Enfin, une fois la pièce placée, il faut encore évaluer la nouvelle configuration du jeu : Est-ce fini ? ... et dans l'affirmative, est-ce gagnant ?
L'évaluation
Nous nous sommes rapidement aperçus qu'un système d'évaluation se contentant de comparer la configuration proposée dans la zone de correction avec la configuration gagnante et, en cas d'adéquation, de signaler au joueur qu'il a gagné, était insuffisant. En effet, face à un tel ßilence", le joueur se sent vite seul et son intérêt pour le jeu décline rapidement.
Devant ce problème, nous avons réfléchi à une fonction d'évaluation qui, après chaque coup joué (i.e. un composant placé sur la zone de correction), calcule le pourcentage de pièces bien placées et détermine le niveau d'avancement de la configuration courante du jeu par rapport à la solution. En fonction du niveau atteint, on génère un commentaire adapté : "c'est un bon début", "déjà une moitié de faite", etc.
En plus de cette détection de progression, on va également détecter les erreurs pour encourager le joueur en cas d'échecs successifs.
Pour ce faire, on fixe ün taux d'erreur acceptable" fixant le nombre de coups incorrects pouvant être joués à la suite et on compte le nombre de coups incorrects consécutifs. Dès que cette variable dépasse le taux d'erreur : on génère un commentaire de type Ättention, concentre-toi un peu plus !". Dès qu'un coup est correct, un message d'encouragement le signale au joueur et le compteur d'erreurs est réinitialisé.
Cette méthode est plus agréable et plus pédagogique qu'une analyse mécanique signalant systématiquement "coup incorrect" à chaque erreur. En effet, il vaut mieux laisser le joueur constater ses erreurs et l'encourager lorsqu'il les résout.
Cette évaluation automatique est composée de deux fonctions :
- function nbOK() qui retourne le nombre de pièces bien placées
- function evalGame () qui évalue et commente le jeu après chaque coup
La fonction init() appelée au chargement de la page HTML se charge de fixer les paliers d'avancement ainsi que le taux d'erreur acceptable. Après chaque coup evalGame() grâce à nbOK() détermine le niveau d'avancement du jeu et génère un commentaire adéquat.
La correction
Il est impératif d'aider un élève en difficulté pour éviter qu'il se sente dans une impasse. Plutôt que d'afficher directement la solution, nous préférons lui offrir la possibilité de repartir sur de bonnes bases. Tout les jeux proposent donc une fonction de correction qui, à son appel, se charge d'annuler tous les coups incorrects.
3.2.3 Le jeu du Puzzle
Ce jeu est un puzzle "classique" : il s'agit de reconstituer une image préalablement éclatée. L'écran de paramétrage (cf. Figure 7) permet de choisir l'image à reconstituer ainsi que le fractionnement horizontal et vertical.
Figure 7 : paramétrage du Puzzle
Grâce au formulaire d'administration (cf. Figure 8), le puzzle peut être enrichi en ajoutant de nouvelles images. Il est également possible de supprimer une image. Actuellement, la taille des images doit être fixée à 300x300 pixels. Cette contrainte peut être abolie mais il faut impérativement contrôler la taille des images proposées de façon à éviter un puzzle avec une image en 800x600 (problèmes de temps de chargement et de mise en page !).
Figure 8 : administration du Puzzle
Une fois les paramètres fixés, le joueur arrive sur l'écran de jeu (cf. Figure 9) où il peut voir l'image à reconstituer. Un clic sur le bouton Mélanger provoque son éclatement. Les pièces du puzzle peuvent être manipulées par drag and drop ; celles-ci doivent être placées sur la zone de correction qui donne le gabarit de l'image. A tout moment le joueur peut afficher l'image à recomposer en cliquant sur le bouton Modèle.
Figure 9 : écran de jeu du Puzzle
Au fur et à mesure du jeu, la fonction évalue la reconstitution de l'image et génère un commentaire adéquat.
En cliquant sur Correction, l'application nettoie la zone de correction en ne conservant que les pièces bien placées.
3.2.4 Le jeu des Anagrammes
Anagramme consiste à retrouver un mot dont les lettres ont été mélangées. Pour faciliter le jeu, le joueur choisit au départ une liste de mots de même longueur dans laquelle le mot à retrouver sera choisit aléatoirement (cf. Figure 10).
Comme pour le puzzle, Anagramme dispose d'une fonction d'administration (cf. Figure 11) similaire où l'on peut saisir ses propres listes de mots. Ici, la seule contrainte est de rentrer, pour une même liste, des mots de même longueur.
Figures 10 et 11 : paramétrage et administration d'Anagramme
Une fois la liste choisie, le joueur arrive sur l'écran de jeu (cf. Figure 12) où sont éparpillées les lettres d'un mot choisit aléatoirement dans la liste. Ces lettres, semblables à des pièces de Scrabble, se manipulent par drag and drop de la même façon que pour le puzzle. Là aussi la magnétisation des pièces pour faciliter leur disposition ainsi que le recouvrement.
En bas de l'écran, s'affiche la liste précédemment choisie afin de permettre de retrouver le mot plus facilement.
Figure 12 : écran de jeu d'Anagramme
Après chaque coup, evalGame() compare la chaîne de caractères proposée dans la zone de correction avec le mot à retrouver et génère un commentaire en fonction du nombre de lettres bien placées.
Un clic sur le bouton Correction rejette les lettres incorrectes, un clic sur le bouton Nouveau permet de rejouer avec un nouveau mot tiré dans la même liste.
3.2.5 Le jeu des Symboles
Le jeu des Symboles est basé sur le principes des associations. Le programme tire aléatoirement une série de symboles dans une liste fixée par le joueur ensuite, le joueur doit associer les symboles par paire afin de reproduire la même séquence.
Ce jeu doit permettre d'aider les élèves à distinguer des formes symétriquement proches pour éviter de confondre ainsi les lettres dont la graphie est semblable : b et d, p et q etc.
Dix huit symboles différents sont disponibles, de forme plus ou moins complexe. L'écran de paramétrage (cf. Figure 13) permet de choisir avec lesquels on veut jouer ainsi que la longueur de la séquence à reproduire.
Figure 13 : paramétrage des Symboles
L'écran de jeu (cf. Figure 14) propose la séquence à reproduire ainsi que le jeu de symboles que l'on a fixé à l'écran précédent. Les pièces se manipulent également par drag and drop et doivent être disposées sur la zone de correction placée sous la séquence à reproduire.
Figure 14 : écran de jeu des Symboles
Après chaque coup, evalGame() compare les symboles deux à deux et génère un commentaire en fonction du nombre de couples corrects.
Un clic sur le bouton Correction rejette les symboles mal associés, un clic sur le bouton Nouveau permet de retirer une nouvelle séquence.
3.2.6 Le jeu des Symétries
Le jeu des Symétries est sensiblement différents des jeux précédents. En effet, celui-ci ne propose pas de composants à manipuler. Ici, il s'agit de reproduire un motif (damier) généré aléatoirement selon un axe de symétrie.
L'écran de paramétrage permet de fixer le complexité du motif (nombre de lignes et de colonnes) ainsi que l'axe de symétrie (horizontal ou vertical). Il n'y a pas de formulaire d'administration la ressource du jeu étant générée aléatoirement.
L'écran de jeu (cf. Figure 15) propose donc deux damiers, l'un correspond au motif généré aléatoirement l'autre, vierge, correspond à la zone de jeu.
Figure 15 : écran de jeu des Symétries
Le jeu consiste donc à reproduire le motif sur le damier vierge selon l'axe de symétrie fixé. Pour ce faire, le joueur, clique sur les cases du damier vierge afin d'en modifier la couleur.
Comme pour les jeux précédents, l'évaluation et le commentaire du jeu se fait au moyen de la fonction evalGame() qui, après chaque coup génère un commentaire en fonction de l'état du jeu.
On retrouve là aussi les boutons Correction et Nouveau.