Jeu de mémory pokémon en javascript

Tags :
  • POK
  • 2024-2025
  • temps 2
  • vert
  • web
  • jeu
  • site
  • javascript
Auteurs :
  • Lola Perdrix

Réalisation d'un site web sur lequel on peut jouer au mémory.

Bases de HTML, CSS, et Javascript. Il y a beaucoup de MON à ce sujet.

L'objectif de ce POK est de reprendre le site web que j'avais commencé à développer pendant le cours de dev web de 2A là où il en était resté. Je souhaite améliorer le style tout en refaisant la mécanique du jeu en javascript.

Il existe un autre POK sur le sujet, celui de William Lalanne, en revanche je n'ai pas trouvé tant de points communs entre nos deux façons de faire, je ne me suis donc pas vraiment appuyé dessus mais cela peut constituer une ressource complémentaire.

Lien vers le code du site

Le code est accessible ici : memory game repository

Ou vous pouvez accéder directement au site pour y jouer : mon site de mémory

Planning

Sprint 1

Reprendre le legacy code, remettre en marche le front.

Sprint 2

Refaire la mécanique du jeu, gestion des données

Mon objectif n'est pas forcément de faire un site magnifique mais fonctionnel pour qu'on puisse y jouer de manière assez plaisante. Ayant déjà la structre du site (pas forcément très complexe cela dit), je souhaite donc ne pas perdre trop de temps sur le style si je vois que cela semble plus chronophage que prévu. Je me concentrerai donc plus sur les fonctionnalités de la page.

Introduction

Je suis repartie du projet de groupe réalisé en 2e année avec M. Brucker. J'avais un sentiment d'inachevé et cela me motivait à réapprendre à manipuler le javascript. Cela dit, j'ai perdu la majeure partie du projet et n'ai pu récupérer que la structure du site avec le style (c'est déjà ça de gagné).

Voici à quoi ressemble ce que j'ai pu récupérer du projet, ce qui constituera mon point de départ :

Page d'accueil Page mémory
site site

Premier Sprint

Horodatage

Date Heures passées Indications
Jeudi 31 octobre 10min Récupération du projet
Samedi 2 novembre 2h Remémoration du cours de dev web
Mercredi 6 novembre 1h30 Reprise du code, changement du style
Jeudi 7 novembre 1h tutos grille
Lundi 11 novembre 2h Affichage de la grille
Lundi 11 novembre 30min Génération des id pokémons de la grille
Mardi 12 novembre 1h30 Tests pour affichage des images (et intensive recherche d'erreur)
Mardi 12 novembre 1h Modifications style et rédaction
lundi 18 novembre 20min Affichage des images

Style

Après m'être remise la tête dans le cours de 2e année pour me rappeler comment html et css marchent, j'ai commencé par changer le style du site pour le mettre à mon goût et surtout pour l'adapter à mon nouveau thème qui sera les pokémon.

Nouvelle page d'accueil Nouvelle page de jeu
style style

Grille

Ensuite pour ce premer sprint j'ai voulu réaliser l'affichage de la grille. J'ai choisi de garder les deux options déjà présentes (grille 4x4 et 6x6) pour garder le choix de la diffculté.

Je me suis rappelée que la manière utilisée pour cette tâche il y a deux ans était un peu complexe pour pas grand chose, j'ai donc essayé de trouver de meilleures pratiques en cherchant un peu sur le net comment je pourrais faire. J'ai décidé d'en faire un petit mix.

J'ai procédé avec deux classes de conteneur pour mes tuiles, de type display : grid, en différenciant le grid-template pour adapter le format, la taille des tuiles et leur nombre, et ai travaillé pas mal de temps sur la disposition de celles-ci pour que ce soit joli dans les deux cas. Je l'affiche au click des boutons avec une fonction javascript et j'obtiens :

4x4 6x6
style style

Emplacement des pokémon et affichage des images

Pour constituer ensuite mon jeu de mémory, plusieurs options s'offrent à moi. J'ai décidé de m'appuyer sur les attributs des tuiles pour constituer mon mécanisme. Celui-ci repose sur une fonction qui s'activera au click de chaque tuile.

Lors de la création de chacune de mes tuiles, je vais lui attribuer un attribut 'tile-id' qui contiendra le numéro du pokémon qu'elle représente. J'ai donc fait une fonction qui génère une liste aléatoire de paires de pokémons et les attribue ensuite à mes tuiles.

Sur la fin du sprint, j'ai également réussi à afficher l'image du pokémon correspondant à l'id de la tuile sur le click de celle-ci. J'ai cru ne pas pouvoir y arriver à cause de quelques soucis de débuggage, mais j'y suis parvenue !

J'ai eu des soucis liés à priori au cache de mon ordinateur, problème résolu en passant par un serveur local pour afficher le site (python -m http.server 3000).

Voilà où j'en suis donc à la fin du premier sprint :

image

Conclusion Sprint 1

Cela m'a beaucoup motivée de reprendre ce projet et de refaire un peu de développement web. Je pensais mieux me rappeler des bases d'HTML et de CSS ; mais j'ai finalement du y consacrer plus de temps que prévu. Au contraire, j'ai repris le coup de main assez facilement sur javascript qui me faisait un peu peur, donc j'ai réussi à équilibrer les tâches et produire un résultat satisfaisant par rapport à mes attentes, malgré les inévitables bugs rencontrés.

Second Sprint

Réajustement du sprint planning

Refaire la mécanique du jeu, gestion des données

Je n'ai pas eu à réaliser une base de questions car j'ai modifié mon système de validation des paires.

Horodatage Sprint 2

Date Heures passées Indications
Jeudi 21 novembre 1h Reprise du code du sprint 1 pour le rendre plus propre et adopter de meilleures pratiques (travailler avec des éléments etc.)
Vendredi 22 novembre 1h Effet de retournement des cartes
Samedi 23 novembre 1h Mécanique du jeu au plus simple
1h30 Ajouts de fonctionalités pour améliorer la mécanique (pas évident)
30min Gestion de la fin de partie
Dimanche 24 novembre 1h Ajouts des autres choix de difficulté et style des boutons
30min Recherches et tests pour créer des inputs
Mercredi 27 novembre 3h30 Mise en place du niveau initiate (pas évident)
Lundi 02 décembre 30min Dernières modifications, optimisation

Retournement des cartes

Pour avoir un effet joli et un ressenti de jeu sympathique, je tenais à retourner les cartes d'une manière fluide comme dans si on le faisait en vrai. Pour cela j'ai utilisé les animations CSS. Je me suis aidée de quelques tutos sur internet car j'avais du mal à comprendre le principe au début :

J'ai repris quelques unes de ces méthodes en les personnalisant à mon site et en essayant de garder les éléments les plus simples.

Malheureusement je n'ai pas réussi à comprendre comment fonctionnait le retournement de cartes dans l'autre sens (quand deux cartes ne matchent pas). C'est donc une fonctionnalité que j'ai laissé finalement de côté (sinon, j'allais y passer des heures...).

Mécanique du jeu

Pour réaliser la mécanique du jeu, il fallait surtout que je porte mon attenion sur :

Pour réaliser la mécanique, je me suis aussi inspirée de quelques tutos, par exemple :

Cela m'a donné les guidelines pour réaliser le jeu et j'ai ensuite essayé au maximum de refaire tout moi-même. C'est pour cela que ça a pris un peu de temps malgré les similitudes.

J'ai aussi ajouté à la fin de la partie une petite animation pour nous féliciter et nous proposer de rejouer.

image de victoire

Implémentation du niveau initié

Mon idée était de réaliser un autre mode de difficulté dans lequel le joueur devrait répondre à une question dès qu'il retourne une paire pour pouvoir la valider. Finalement, à la place des questions, j'ai voulu faire deviner au joueur la génération du pokémon de la paire retournée. Si le joueur devine bien, il valide la paire, sinon la paire est retournée et le joueur doit retenter la paire (s'il se souvient où elle était...).

Pour implémenter ce système, j'ai rencontré deux grandes difficultés :

Pour le deuxième point j'avais de vagues souvenirs de l'utilisation des fonctions asynchrones et des systèmes de promesses que j'ai du creuser un bon moment avant de pouvoir l'utiliser ici. Ces vidéos m'ont aidée :

Je n'ai vraiment pas tout regardé en entier, je recherchais surtout des explications du concept et des exemples de codes (en complétant avec d'autres sites et documentations sur javascript jusqu'à trouver ce qu'il me fallait).

niveau initiate

Conclusion Sprint 2

Durant ce sprint, j'avais réduit la quantité de travail en décidant de faire un site uniquement statique et me débarrassant de l'élaboration de questions de validation. C'était une bonne décision ! Au terme de ce deuxième sprint, je dispose d'un jeu fonctionnel, sans bugs.

En revanche, je me suis rendue compte à la toute fin d'un petit soucis : le site n'était pas du tout responsive... et ne s'affichait pas bien sur les autres ordinateurs. J'ai corrigé ce défaut dans la partie bonus, car c'était essentiel d'avoir ce point là de réglé.

Je suis également consciente que mon code est probablement loin d'être optimal, et j'ai trouvé ça difficile de savoir se positionner vis-à-vis des pratiques à adopter ou non dans le code en travaillant en autonomie, sans expérience, et avec "peu" de temps.

Sinon, les plus grosses difficultées que j'ai rencontrées étaient situées au niveau de l'empêchement du click, l'affichage de l'input box, le style des boutons, les animations des cartes, et l'attente de la réponse de l'utilisateur. J'ai mis beaucoup de temps à trouver des solutions utiles à mes problèmes sur internet malgré la quantité d'infos.

Enfin, il me reste donc quelques fonctionnalités que j'ai laissées de côté pour pouvoir finir à temps : le responsive, le chronomètre, et le niveau expert. C'est une petite déception mais je suis quand même contente de tout ce que j'ai réussi à produire.

BONUS : améliorations

En bonus, c'est-à-dire au delà des 20h du projet, j'ai passé quelques heures en plus pour améliorer le code et surtout pour implémenter le responsive et le niveau expert que je n'avais pas eu le temps de faire. Pourtant, ce n'était pas si compliqué une fois le niveau initié de fait.

Le principe de ce mode est de valider la paire en devinant le numéro du pokédex du pokemon retourné. Le public est sans doute plus restreint, sans pour autant être inexistant...

Ensuite, quelques modifications, les règles du jeu ainsi que le header.

Début de la partie Version initié Version expert Jeu gagné !
initialisation niveau initiate niveau expert final

C'est seulement à cette étape que j'ai compris qu'il fallait que fasse la partie responsive du site, mais désormais ça marche bien !

Il manque donc juste le chronomètre désormais... Mais mon site me plaît bien comme ça.

Sources