# Creare un gioco usando gli eventi
Ti sei mai chiesto come fanno i siti web a sapere quando clicchi un pulsante o digiti in una casella di testo? È la magia della programmazione basata sugli eventi! Quale modo migliore per imparare questa abilità essenziale se non costruendo qualcosa di utile: un gioco di velocità di digitazione che reagisce a ogni tasto che premi.
Vedrai direttamente come i browser web "comunicano" con il tuo codice JavaScript. Ogni volta che clicchi, digiti o muovi il mouse, il browser invia piccoli messaggi (li chiamiamo eventi) al tuo codice, e tu decidi come rispondere!
Alla fine di questa lezione, avrai creato un vero gioco di digitazione che traccia la tua velocità e precisione. Ancora più importante, comprenderai i concetti fondamentali che alimentano ogni sito web interattivo che hai mai usato. Iniziamo!
## Quiz pre-lezione
[Quiz pre-lezione](https://ff-quizzes.netlify.app/web/quiz/21)
## Programmazione basata sugli eventi
Pensa alla tua app o sito web preferito: cosa lo rende vivo e reattivo? Tutto dipende da come reagisce a ciò che fai! Ogni tocco, clic, scorrimento o pressione di tasto crea quello che chiamiamo un "evento", ed è lì che avviene la vera magia dello sviluppo web.
Ecco cosa rende interessante la programmazione per il web: non sappiamo mai quando qualcuno cliccherà quel pulsante o inizierà a digitare in una casella di testo. Potrebbero cliccare immediatamente, aspettare cinque minuti o magari non cliccare mai! Questa imprevedibilità ci obbliga a pensare in modo diverso su come scriviamo il nostro codice.
Invece di scrivere codice che si esegue dall'alto verso il basso come una ricetta, scriviamo codice che aspetta pazientemente che accada qualcosa. È simile a come gli operatori del telegrafo nel 1800 aspettavano accanto alle loro macchine, pronti a rispondere nel momento in cui arrivava un messaggio.
Quindi, cos'è esattamente un "evento"? In parole semplici, è qualcosa che accade! Quando clicchi un pulsante - quello è un evento. Quando digiti una lettera - quello è un evento. Quando muovi il mouse - quello è un altro evento.
La programmazione basata sugli eventi ci permette di configurare il nostro codice per ascoltare e rispondere. Creiamo funzioni speciali chiamate **event listeners** che aspettano pazientemente che accada qualcosa di specifico, per poi entrare in azione quando succede.
Pensa agli event listeners come a un campanello per il tuo codice. Configuri il campanello (`addEventListener()`), gli dici quale suono ascoltare (come un 'click' o 'keypress') e poi specifichi cosa dovrebbe accadere quando qualcuno lo suona (la tua funzione personalizzata).
**Ecco come funzionano gli event listeners:**
- **Ascoltano** azioni specifiche dell'utente come clic, pressioni di tasti o movimenti del mouse
- **Eseguono** il tuo codice personalizzato quando si verifica l'evento specificato
- **Rispondono** immediatamente alle interazioni dell'utente, creando un'esperienza fluida
- **Gestiscono** più eventi sullo stesso elemento usando listener diversi
> **NOTE:** Vale la pena sottolineare che ci sono molti modi per creare event listeners. Puoi usare funzioni anonime o crearne di nominate. Puoi usare vari scorciatoie, come impostare la proprietà `click` o utilizzare `addEventListener()`. Nel nostro esercizio ci concentreremo su `addEventListener()` e funzioni anonime, poiché è probabilmente la tecnica più comune utilizzata dagli sviluppatori web. È anche la più flessibile, dato che `addEventListener()` funziona per tutti gli eventi e il nome dell'evento può essere fornito come parametro.
### Eventi comuni
Mentre i browser web offrono decine di eventi diversi che puoi ascoltare, la maggior parte delle applicazioni interattive si basa solo su una manciata di eventi essenziali. Comprendere questi eventi fondamentali ti darà le basi per costruire interazioni utente sofisticate.
Ci sono [dozzine di eventi](https://developer.mozilla.org/docs/Web/Events) disponibili da ascoltare quando si crea un'applicazione. Fondamentalmente, qualsiasi cosa faccia un utente su una pagina genera un evento, il che ti dà un grande potere per garantire che ottengano l'esperienza che desideri. Fortunatamente, normalmente avrai bisogno solo di una piccola manciata di eventi. Ecco alcuni comuni (inclusi i due che useremo per creare il nostro gioco):
| Evento | Descrizione | Casi d'uso comuni |
|--------|-------------|-------------------|
| `click` | L'utente ha cliccato su qualcosa | Pulsanti, link, elementi interattivi |
| `contextmenu` | L'utente ha cliccato con il tasto destro del mouse | Menu contestuali personalizzati |
| `select` | L'utente ha evidenziato del testo | Modifica del testo, operazioni di copia |
| `input` | L'utente ha inserito del testo | Validazione dei moduli, ricerca in tempo reale |
**Comprendere questi tipi di eventi:**
- **Si attivano** quando gli utenti interagiscono con elementi specifici sulla tua pagina
- **Forniscono** informazioni dettagliate sull'azione dell'utente tramite oggetti evento
- **Permettono** di creare applicazioni web reattive e interattive
- **Funzionano** in modo coerente su diversi browser e dispositivi
## Creare il gioco
Ora che hai capito come funzionano gli eventi, mettiamo in pratica questa conoscenza costruendo qualcosa di utile. Creeremo un gioco di velocità di digitazione che dimostra la gestione degli eventi mentre ti aiuta a sviluppare un'importante abilità da sviluppatore.
Creeremo un gioco per esplorare come funzionano gli eventi in JavaScript. Il nostro gioco testerà l'abilità di digitazione di un giocatore, che è una delle abilità più sottovalutate che tutti gli sviluppatori dovrebbero avere. Curiosità: la tastiera QWERTY che usiamo oggi è stata progettata negli anni '70 dell'Ottocento per le macchine da scrivere - e buone abilità di digitazione sono ancora preziose per i programmatori oggi! Il flusso generale del gioco sarà simile a questo:
```mermaid
flowchart TD
A[Player clicks Start] --> B[Random quote displays]
B --> C[Player types in textbox]
C --> D{Word complete?}
D -->|Yes| E[Highlight next word]
D -->|No| F{Correct so far?}
F -->|Yes| G[Keep normal styling]
F -->|No| H[Show error styling]
E --> I{Quote complete?}
I -->|No| C
I -->|Yes| J[Show success message with time]
G --> C
H --> C
```
**Ecco come funzionerà il nostro gioco:**
- **Inizia** quando il giocatore clicca sul pulsante di avvio e visualizza una citazione casuale
- **Traccia** i progressi di digitazione del giocatore parola per parola in tempo reale
- **Evidenzia** la parola corrente per guidare l'attenzione del giocatore
- **Fornisce** un feedback visivo immediato per gli errori di digitazione
- **Calcola** e visualizza il tempo totale quando la citazione è completata
Costruiamo il nostro gioco e impariamo sugli eventi!
### Struttura dei file
Prima di iniziare a scrivere codice, organizziamoci! Avere una struttura di file pulita fin dall'inizio ti risparmierà mal di testa in seguito e renderà il tuo progetto più professionale. 😊
Terremo le cose semplici con solo tre file: `index.html` per la struttura della pagina, `script.js` per tutta la logica del gioco e `style.css` per rendere tutto bello. Questo è il trio classico che alimenta la maggior parte del web!
**Crea una nuova cartella per il tuo lavoro aprendo una console o una finestra del terminale ed eseguendo il seguente comando:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Ecco cosa fanno questi comandi:**
- **Crea** una nuova directory chiamata `typing-game` per i file del tuo progetto
- **Naviga** automaticamente nella directory appena creata
- **Configura** uno spazio di lavoro pulito per lo sviluppo del tuo gioco
**Apri Visual Studio Code:**
```bash
code .
```
**Questo comando:**
- **Avvia** Visual Studio Code nella directory corrente
- **Apre** la cartella del tuo progetto nell'editor
- **Fornisce** accesso a tutti gli strumenti di sviluppo di cui hai bisogno
**Aggiungi tre file alla cartella in Visual Studio Code con i seguenti nomi:**
- `index.html` - Contiene la struttura e il contenuto del tuo gioco
- `script.js` - Gestisce tutta la logica del gioco e gli event listeners
- `style.css` - Definisce l'aspetto visivo e lo stile
## Creare l'interfaccia utente
Ora costruiamo il palco dove avverrà tutta l'azione del nostro gioco! Pensa a questo come progettare il pannello di controllo di un'astronave: dobbiamo assicurarci che tutto ciò di cui i giocatori hanno bisogno sia esattamente dove si aspettano che sia.
Cerchiamo di capire cosa serve effettivamente al nostro gioco. Se stessi giocando a un gioco di digitazione, cosa vorresti vedere sullo schermo? Ecco cosa ci servirà:
| Elemento UI | Scopo | Elemento HTML |
|-------------|-------|---------------|
| Visualizzazione della citazione | Mostra il testo da digitare | `
` con `id="quote"` |
| Area messaggi | Mostra messaggi di stato e successo | `
` con `id="message"` |
| Input di testo | Dove i giocatori digitano la citazione | `` con `id="typed-value"` |
| Pulsante di avvio | Avvia il gioco | `