TP Memory (suite)
On continue le jeu de memory en ajoutant des fonctionnalités asynchrones.
Créer une fonction asynchrone
boucleJeu
. La fonction doit :- attendre que l’utilisateur clique sur une carte
- retourner la carte cliquée
- répéter ces étapes jusqu’à ce que toutes les cartes soient retournées.
On pourra utiliser la fonction suivante :
/** * Renvoie une `Promise` qui `resolve` quand une carte a été cliquée. Le contenu de la Promise est l'index de cette carte dans le tableau. */ type CardIndex = number; async function clickOnCard(): Promise<CardIndex> { return new Promise((resolve) => { const listener = (event: MouseEvent) => { console.log(event.target); if (!event.target.classList.contains('carte')) { return; } const index = Array.from(event.target.parentNode.children).indexOf( event.target as HTMLElement ); resolve(index); document.removeEventListener('click', listener); }; document.addEventListener('click', listener); }); }
Cette fonction retourne une promesse resolvant sur la l’index de la carte cliqué. On peut donc l’utiliser dans une fonction asynchrone pour attendre que l’utilisateur clique sur une carte.
async function boucleJeu() { // à compléter ... const index = await clickOnCard(); console.log(`Carte cliquée : ${index}`); // à compléter ... } boucleJeu();
CorrigéModifier la fonction ci-dessus pour ajouter le comportement suivant :
Si deux cartes sont retournées, les cacher après une seconde si elles ne sont pas identiques.
CorrigéCréer une fonction principale asynchrone
main
. Le jeu se termine si toutes les cartes sont retournées en moins de 30 secondes, ou si le joueur a gagné. Lorsque le jeu se termine :- retourner face visible toutes les cartes restantes
- afficher un message de félicitations si le joueur a gagné, ou un message d’encouragement sinon.
- afficher un bouton pour rejouer.
On pourra utiliser
Promise.race
.CorrigéFaire en sorte d’afficher le nombre de secondes restantes avant la fin du jeu.