# Créer un jeu en utilisant des événements
Vous êtes-vous déjà demandé comment les sites web savent quand vous cliquez sur un bouton ou tapez dans une zone de texte ? C’est la magie de la programmation événementielle ! Quoi de mieux pour apprendre cette compétence essentielle qu’en créant quelque chose d’utile — un jeu de vitesse de frappe qui réagit à chaque touche que vous pressez.
Vous allez voir de première main comment les navigateurs web « parlent » à votre code JavaScript. Chaque fois que vous cliquez, tapez ou déplacez votre souris, le navigateur envoie de petits messages (nous appelons ça des événements) à votre code, et c’est vous qui décidez comment répondre !
Quand nous aurons fini, vous aurez créé un vrai jeu de frappe qui suit votre vitesse et votre précision. Plus important encore, vous comprendrez les concepts fondamentaux qui animent chaque site interactif que vous avez utilisé. Plongeons-nous dedans !
## Quiz pré-conférence
[Quiz pré-conférence](https://ff-quizzes.netlify.app/web/quiz/21)
## Programmation événementielle
Pensez à votre application ou site web préféré : qu’est-ce qui le rend vivant et réactif ? Tout est dans sa façon de réagir à ce que vous faites ! Chaque tap, clic, glissement ou pression de touche crée ce que nous appelons un « événement », et c’est là que la vraie magie du développement web se produit.
Voici ce qui rend la programmation web si intéressante : on ne sait jamais quand quelqu’un va cliquer sur ce bouton ou commencer à taper dans une zone de texte. Il peut cliquer immédiatement, attendre cinq minutes, ou peut-être ne jamais cliquer du tout ! Cette imprévisibilité signifie que nous devons penser différemment la façon dont nous écrivons notre code.
Au lieu d’écrire un code qui s’exécute de haut en bas comme une recette, nous écrivons un code qui attend patiemment que quelque chose se produise. C’est similaire à la façon dont les opérateurs télégraphiques au 19ème siècle restaient à côté de leurs machines, prêts à répondre au moment où un message arrivait sur le fil.
Alors, qu’est-ce qu’un « événement » exactement ? Simplement, c’est quelque chose qui arrive ! Quand vous cliquez sur un bouton — c’est un événement. Quand vous tapez une lettre — c’est un événement. Quand vous déplacez votre souris — c’est un autre événement.
La programmation événementielle nous permet de configurer notre code pour écouter et répondre. Nous créons des fonctions spéciales appelées **écouteurs d’événements** qui attendent patiemment que des choses spécifiques se produisent, puis se déclenchent quand c’est le cas.
Pensez aux écouteurs d’événements comme une sonnette pour votre code. Vous installez la sonnette (`addEventListener()`), vous dites quel son elle doit écouter (comme un « clic » ou une « pression de touche »), puis vous spécifiez ce qui doit arriver quand quelqu’un sonne (votre fonction personnalisée).
**Voici comment fonctionnent les écouteurs d’événements :**
- **Écoute** des actions spécifiques de l’utilisateur comme des clics, des frappes de touches ou des mouvements de souris
- **Exécute** votre code personnalisé quand l'événement spécifié se produit
- **Réagit** immédiatement aux interactions utilisateur, créant une expérience fluide
- **Gère** plusieurs événements sur le même élément grâce à différents écouteurs
> **NOTE :** Il est utile de souligner qu’il existe de nombreuses façons de créer des écouteurs d’événements. Vous pouvez utiliser des fonctions anonymes, ou créer des fonctions nommées. Vous pouvez utiliser différentes méthodes rapides, comme définir la propriété `click`, ou utiliser `addEventListener()`. Dans notre exercice, nous allons nous concentrer sur `addEventListener()` et les fonctions anonymes, car c’est probablement la technique la plus courante utilisée par les développeurs web. C’est aussi la plus flexible, car `addEventListener()` fonctionne pour tous les événements, et le nom de l’événement peut être fourni en paramètre.
### Événements courants
Alors que les navigateurs web offrent des dizaines d’événements différents que vous pouvez écouter, la plupart des applications interactives s’appuient sur une poignée d’événements essentiels. Comprendre ces événements fondamentaux vous donnera les bases pour créer des interactions utilisateur sophistiquées.
Il existe [des dizaines d’événements](https://developer.mozilla.org/docs/Web/Events) disponibles auxquels vous pouvez vous abonner lors de la création d’une application. En gros, tout ce qu’un utilisateur fait sur une page déclenche un événement, ce qui vous donne beaucoup de pouvoir pour garantir qu’il obtienne l’expérience désirée. Heureusement, vous aurez normalement besoin d’un petit nombre d’événements. En voici quelques-uns courants (y compris les deux que nous utiliserons pour créer notre jeu) :
| Événement | Description | Cas d’utilisation courants |
|-----------|-------------|----------------------------|
| `click` | L’utilisateur a cliqué sur quelque chose | Boutons, liens, éléments interactifs |
| `contextmenu` | L’utilisateur a cliqué avec le bouton droit de la souris | Menus contextuels personnalisés |
| `select` | L’utilisateur a sélectionné du texte | Édition de texte, opérations de copie |
| `input` | L’utilisateur a saisi du texte | Validation de formulaire, recherche en temps réel |
**Comprendre ces types d’événements :**
- **Se déclenche** lorsque les utilisateurs interagissent avec des éléments spécifiques sur votre page
- **Fournit** des détails sur l’action de l’utilisateur via des objets événementiels
- **Vous permet** de créer des applications web réactives et interactives
- **Fonctionne** de manière cohérente sur différents navigateurs et appareils
## Créer le jeu
Maintenant que vous comprenez comment fonctionnent les événements, mettons ces connaissances en pratique en créant quelque chose d’utile. Nous allons créer un jeu de vitesse de frappe qui démontre la gestion des événements tout en vous aidant à développer une compétence importante de développeur.
Nous allons créer un jeu pour explorer comment les événements fonctionnent en JavaScript. Notre jeu testera la capacité de frappe d’un joueur, une des compétences les plus sous-estimées que tout développeur devrait avoir. Petite anecdote : la disposition de clavier QWERTY que nous utilisons aujourd’hui a été conçue dans les années 1870 pour les machines à écrire — et les bonnes compétences de frappe sont toujours aussi précieuses pour les programmeurs aujourd’hui ! Le déroulement général du jeu sera le suivant :
```mermaid
flowchart TD
A[Joueur clique sur Démarrer] --> B[Citation aléatoire affichée]
B --> C[Joueur tape dans la zone de texte]
C --> D{Mot complet ?}
D -->|Oui| E[Surligner le mot suivant]
D -->|Non| F{Correct jusqu'à présent ?}
F -->|Oui| G[Garder le style normal]
F -->|Non| H[Afficher le style d'erreur]
E --> I{Citation terminée ?}
I -->|Non| C
I -->|Oui| J[Afficher message de succès avec temps]
G --> C
H --> C
```
**Voici comment notre jeu fonctionnera :**
- **Commence** lorsque le joueur clique sur le bouton de démarrage et affiche une citation aléatoire
- **Suit** la progression de frappe du joueur mot par mot en temps réel
- **Met en surbrillance** le mot actuel pour guider la concentration du joueur
- **Fournit** un retour visuel immédiat en cas d’erreurs de frappe
- **Calcule** et affiche le temps total à la fin de la citation
Construisons notre jeu, et apprenons les événements !
### Structure des fichiers
Avant de commencer à coder, organisons-nous ! Avoir une structure de fichiers propre dès le départ vous évitera des maux de tête plus tard et rendra votre projet plus professionnel. 😊
Nous allons rester simples avec seulement trois fichiers : `index.html` pour la structure de la page, `script.js` pour toute notre logique de jeu, et `style.css` pour tout rendre joli. C’est le trio classique qui alimente la majorité du web !
**Créez un nouveau dossier pour votre travail en ouvrant une console ou un terminal et en exécutant la commande suivante :**
```bash
# Linux ou macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Voici ce que font ces commandes :**
- **Crée** un nouveau répertoire appelé `typing-game` pour vos fichiers de projet
- **Se place** automatiquement dans ce répertoire nouvellement créé
- **Met en place** un espace de travail propre pour votre développement de jeu
**Ouvrez Visual Studio Code :**
```bash
code .
```
**Cette commande :**
- **Lance** Visual Studio Code dans le répertoire courant
- **Ouvre** votre dossier de projet dans l’éditeur
- **Vous donne** accès à tous les outils de développement dont vous aurez besoin
**Ajoutez trois fichiers au dossier dans Visual Studio Code avec les noms suivants :**
- `index.html` - Contient la structure et le contenu de votre jeu
- `script.js` - Gère toute la logique du jeu et les écouteurs d’événements
- `style.css` - Définit l’apparence visuelle et le style
## Créer l’interface utilisateur
Construisons maintenant la scène où toute l’action de notre jeu aura lieu ! Pensez à cela comme au panneau de contrôle d’un vaisseau spatial — nous devons nous assurer que tout ce dont nos joueurs ont besoin est là où ils s’attendent à le trouver.
Voyons ce dont notre jeu a réellement besoin. Si vous jouiez à un jeu de frappe, qu’est-ce que vous aimeriez voir à l’écran ? Voici ce dont nous aurons besoin :
| Élément UI | But | Élément HTML |
|------------|-----|--------------|
| Affichage de la citation | Affiche le texte à taper | `
` avec `id="quote"` |
| Zone de message | Affiche les messages de statut et de réussite | `
` avec `id="message"` |
| Zone de saisie | Où les joueurs tapent la citation | `` avec `id="typed-value"` |
| Bouton de démarrage | Lance le jeu | `