# Crearea unui joc folosind evenimente
Te-ai întrebat vreodată cum știu site-urile când apeși un buton sau tastezi într-o casetă de text? Asta este magia programării bazate pe evenimente! Ce metodă mai bună de a învăța această abilitate esențială decât construind ceva util - un joc de viteză la tastare care reacționează la fiecare apăsare de tastă pe care o faci.
Vei vedea cu ochii tăi cum browserele web „vorbesc” cu codul tău JavaScript. De fiecare dată când apeși, tastezi sau muți mouse-ul, browserul trimite mesaje mici (le numim evenimente) către codul tău, iar tu decizi cum să răspunzi!
Până la finalul acestui material, vei fi construit un joc real de tastare care urmărește viteza și acuratețea. Mai important, vei înțelege conceptele fundamentale care stau la baza fiecărui site interactiv pe care l-ai folosit vreodată. Hai să începem!
## Chestionar pre-lecture
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Programarea bazată pe evenimente
Gândește-te la aplicația sau site-ul tău preferat - ce îl face să se simtă viu și receptiv? Totul ține de modul în care reacționează la ceea ce faci! Fiecare apăsare, clic, glisare sau apăsare de tastă creează ceea ce numim un „eveniment”, și aici se întâmplă adevărata magie a dezvoltării web.
Iată ce face programarea pentru web atât de interesantă: niciodată nu știm când cineva va face clic pe un buton sau va începe să tasteze într-o casetă de text. Poate face clic imediat, poate aștepta cinci minute sau poate niciodată să nu facă clic! Această imprevizibilitate înseamnă că trebuie să ne gândim diferit la modul în care scriem codul.
În loc să scriem cod care rulează de sus în jos ca o rețetă, scriem cod care așteaptă cu răbdare să se întâmple ceva. Este similar cu modul în care operatorii de telegraf din anii 1800 stăteau lângă mașinile lor, gata să răspundă în momentul în care un mesaj trecea prin fir.
Deci, ce este exact un „eveniment”? Simplu spus, este ceva care se întâmplă! Când apeși un buton - asta este un eveniment. Când tastezi o literă - asta este un eveniment. Când muți mouse-ul - asta este un alt eveniment.
Programarea bazată pe evenimente ne permite să configurăm codul pentru a asculta și răspunde. Creăm funcții speciale numite **ascultători de evenimente** care așteaptă cu răbdare ca lucruri specifice să se întâmple, apoi sar în acțiune când se întâmplă.
Gândește-te la ascultătorii de evenimente ca la un sonerie pentru codul tău. Îl configurezi pe sonerie (`addEventListener()`), îi spui la ce sunet să asculte (cum ar fi un 'click' sau 'keypress'), apoi specifici ce ar trebui să se întâmple când cineva o sună (funcția ta personalizată).
**Iată cum funcționează ascultătorii de evenimente:**
- **Ascultă** acțiuni specifice ale utilizatorului precum clicuri, apăsări de tastă sau mișcări ale mouse-ului
- **Execută** codul tău personalizat când apare evenimentul specificat
- **Răspunde** imediat la interacțiunile utilizatorului, creând o experiență fluentă
- **Gestionează** multiple evenimente pe același element folosind ascultători diferiți
> **NOTE:** Merită subliniat că există numeroase moduri de a crea ascultători de evenimente. Poți folosi funcții anonime sau poți crea unele cu nume. Poți folosi diverse scurtături, cum ar fi setarea proprietății `click`, sau utilizarea `addEventListener()`. În exercițiul nostru ne vom concentra pe `addEventListener()` și funcții anonime, deoarece probabil este cea mai comună tehnică folosită de dezvoltatorii web. Este și cea mai flexibilă, deoarece `addEventListener()` funcționează pentru toate evenimentele, iar numele evenimentului poate fi furnizat ca parametru.
### Evenimente comune
Deși browserele web oferă zeci de evenimente diferite pe care le poți asculta, majoritatea aplicațiilor interactive se bazează doar pe câteva evenimente esențiale. Înțelegerea acestor evenimente de bază îți va oferi fundația pentru a construi interacțiuni sofisticate cu utilizatorul.
Există [zeci de evenimente](https://developer.mozilla.org/docs/Web/Events) disponibile pentru a fi ascultate când creezi o aplicație. Practic, orice face un utilizator pe o pagină declanșează un eveniment, ceea ce îți oferă multă putere pentru a te asigura că obțin experiența dorită. Din fericire, de obicei vei avea nevoie doar de un număr mic de evenimente. Iată câteva comune (inclusiv cele două pe care le vom folosi la crearea jocului nostru):
| Eveniment | Descriere | Cazuri comune de utilizare |
|-----------|-----------|----------------------------|
| `click` | Utilizatorul a apăsat pe ceva | Butoane, linkuri, elemente interactive |
| `contextmenu` | Utilizatorul a apăsat butonul drept al mouse-ului | Meniuri de clic dreapta personalizate |
| `select` | Utilizatorul a evidențiat text | Editare text, operațiuni de copiere |
| `input` | Utilizatorul a introdus text | Validarea formularelor, căutare în timp real |
**Înțelegerea acestor tipuri de evenimente:**
- **Se declanșează** când utilizatorii interacționează cu elemente specifice din pagina ta
- **Oferă** informații detaliate despre acțiunea utilizatorului prin obiectele eveniment
- **Îți permit să creezi** aplicații web interactive și receptive
- **Funcționează** consecvent pe diferite browsere și dispozitive
## Crearea jocului
Acum că înțelegi cum funcționează evenimentele, hai să punem acea cunoștință în practică construind ceva util. Vom crea un joc de viteză la tastare care demonstrează gestionarea evenimentelor, ajutându-te să dezvolți o abilitate importantă de dezvoltator.
Vom crea un joc pentru a explora cum funcționează evenimentele în JavaScript. Jocul nostru va testa abilitățile de tastare ale unui jucător, una dintre cele mai subestimate abilități pe care toți dezvoltatorii ar trebui să le aibă. Un fapt amuzant: aspectul tastaturii QWERTY pe care îl folosim azi a fost conceput de fapt în anii 1870 pentru mașinile de scris - și abilitățile bune de tastare sunt încă la fel de valoroase pentru programatori astăzi! Fluxul general al jocului va arăta astfel:
```mermaid
flowchart TD
A[Jucătorul face clic pe Start] --> B[Apare un citat aleatoriu]
B --> C[Jucătorul scrie în câmpul de text]
C --> D{Cuvântul este complet?}
D -->|Da| E[Subliniază următorul cuvânt]
D -->|Nu| F{Corect până acum?}
F -->|Da| G[Păstrează stilul normal]
F -->|Nu| H[Afișează stilul de eroare]
E --> I{Citatul este complet?}
I -->|Nu| C
I -->|Da| J[Afișează mesaj de succes cu timpul]
G --> C
H --> C
```
**Iată cum va funcționa jocul nostru:**
- **Pornește** când jucătorul apasă butonul de start și afișează un citat aleatoriu
- **Urmărește** progresul tastării jucătorului cuvânt cu cuvânt în timp real
- **Evidențiază** cuvântul curent pentru a ghida atenția jucătorului
- **Oferă** feedback vizual imediat pentru erorile de tastare
- **Calculează** și afișează timpul total când citatul este completat
Hai să construim jocul nostru și să învățăm despre evenimente!
### Structura fișierelor
Înainte să începem să scriem cod, haide să ne organizăm! Un structura curată a fișierelor încă de la început îți va economisi dureri de cap mai târziu și va face proiectul tău mai profesionist. 😊
Vom păstra lucrurile simple cu doar trei fișiere: `index.html` pentru structura paginii, `script.js` pentru toată logica jocului, și `style.css` pentru a face totul să arate grozav. Acesta este trio-ul clasic ce alimentează majoritatea webului!
**Creează un dosar nou pentru proiectul tău deschizând o consolă sau terminal și executând următoarea comandă:**
```bash
# Linux sau macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Iată ce fac aceste comenzi:**
- **Creează** un director nou numit `typing-game` pentru fișierele proiectului tău
- **Navighează** automat în directorul nou creat
- **Configurază** un spațiu de lucru curat pentru dezvoltarea jocului tău
**Deschide Visual Studio Code:**
```bash
code .
```
**Această comandă:**
- **Pornește** Visual Studio Code în directorul curent
- **Deschide** folderul proiectului tău în editor
- **Oferă** acces la toate uneltele de dezvoltare de care ai nevoie
**Adaugă trei fișiere în dosar în Visual Studio Code cu următoarele nume:**
- `index.html` - Conține structura și conținutul jocului tău
- `script.js` - Gestionează toată logica jocului și ascultătorii de evenimente
- `style.css` - Definește aspectul vizual și stilizarea
## Crearea interfeței utilizatorului
Acum să construim scena unde se va desfășura toată acțiunea jocului! Gândește-te la asta ca la proiectarea panoului de control pentru o navă spațială - trebuie să ne asigurăm că tot ce au nevoie jucătorii noștri este exact acolo unde se așteaptă.
Hai să vedem de ce are nevoie efectiv jocul nostru. Dacă ai juca un joc de tastare, ce ai vrea să vezi pe ecran? Iată ce vom avea nevoie:
| Element UI | Scop | Element HTML |
|------------|------|--------------|
| Afișaj Citat | Afișează textul de tastat | `
` cu `id="quote"` |
| Zona de Mesaje | Afișează mesaje de stare și succes | `
` cu `id="message"` |
| Câmp Text | Unde jucătorii tastează citatul | `` cu `id="typed-value"` |
| Buton Start | Pornește jocul | `