# Crearea unui joc folosind evenimente
Te-ai întrebat vreodată cum știu site-urile web când dai clic pe un buton sau tastezi într-o casetă de text? Aceasta este magia programării bazate pe evenimente! Ce mod mai bun de a învăța această abilitate esențială decât să construiești ceva util - un joc de viteză la tastare care reacționează la fiecare apăsare de tastă pe care o faci.
Vei vedea direct cum browserele web „vorbesc” cu codul tău JavaScript. De fiecare dată când dai clic, tastezi sau miști mouse-ul, browserul trimite mici mesaje (le numim evenimente) către codul tău, iar tu decizi cum să răspunzi!
Până la finalul acestui tutorial, vei fi construit un joc real de tastare care îți urmărește viteza și acuratețea. Mai important, vei înțelege conceptele fundamentale care stau la baza fiecărui site web interactiv pe care l-ai folosit vreodată. Să începem!
## Chestionar înainte de lecție
[Chestionar înainte de lecție](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ă pară viu și receptiv? Totul se rezumă la modul în care reacționează la ceea ce faci! Fiecare atingere, clic, glisare sau apăsare de tastă creează ceea ce numim un „eveniment”, și aici începe adevărata magie a dezvoltării web.
Iată ce face programarea pentru web atât de interesantă: nu știm niciodată când cineva va da clic pe acel buton sau va începe să tasteze într-o casetă de text. Poate că va da clic imediat, va aștepta cinci minute sau poate nu va da clic deloc! Această imprevizibilitate înseamnă că trebuie să gândim diferit despre cum scriem codul nostru.
În loc să scriem cod care rulează de sus în jos ca o rețetă, scriem cod care așteaptă răbdător 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 ajungea prin fir.
Deci, ce este exact un „eveniment”? Simplu spus, este ceva ce se întâmplă! Când dai clic pe un buton - acesta este un eveniment. Când tastezi o literă - acesta este un eveniment. Când miști mouse-ul - acesta este un alt eveniment.
Programarea bazată pe evenimente ne permite să configurăm codul nostru pentru a asculta și a răspunde. Creăm funcții speciale numite **ascultători de evenimente** care așteaptă răbdător lucruri specifice să se întâmple, apoi acționează imediat când acestea se întâmplă.
Gândește-te la ascultătorii de evenimente ca la un sonerie pentru codul tău. Configurezi soneria (`addEventListener()`), îi spui ce sunet să asculte (cum ar fi un 'clic' sau 'keypress') și apoi specifici ce ar trebui să se întâmple când cineva sună (funcția ta personalizată).
**Cum funcționează ascultătorii de evenimente:**
- **Ascultă** acțiuni specifice ale utilizatorului, cum ar fi clicuri, apăsări de taste sau mișcări ale mouse-ului
- **Execută** codul tău personalizat atunci când are loc evenimentul specificat
- **Răspunde** imediat la interacțiunile utilizatorului, creând o experiență fluidă
- **Gestionează** mai multe evenimente pe același element folosind ascultători diferiți
> **NOTE:** Merită menționat că există numeroase moduri de a crea ascultători de evenimente. Poți folosi funcții anonime sau poți crea funcții denumite. 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țiile anonime, deoarece este probabil cea mai comună tehnică folosită de dezvoltatorii web. Este, de asemenea, 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 utilizatorii.
Există [zeci de evenimente](https://developer.mozilla.org/docs/Web/Events) disponibile pentru a le asculta atunci când creezi o aplicație. Practic, orice face un utilizator pe o pagină generează un eveniment, ceea ce îți oferă multă putere pentru a te asigura că obține experiența dorită. Din fericire, de obicei vei avea nevoie doar de câteva evenimente. Iată câteva dintre cele mai comune (inclusiv cele două pe care le vom folosi pentru a crea jocul nostru):
| Eveniment | Descriere | Utilizări comune |
|-----------|-----------|------------------|
| `click` | Utilizatorul a dat clic pe ceva | Butoane, linkuri, elemente interactive |
| `contextmenu` | Utilizatorul a dat clic dreapta pe mouse | Meniuri personalizate la clic dreapta |
| `select` | Utilizatorul a selectat 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ă** atunci când utilizatorii interacționează cu elemente specifice de pe pagina ta
- **Furnizează** informații detaliate despre acțiunea utilizatorului prin obiecte de eveniment
- **Permite** crearea de aplicații web responsive și interactive
- **Funcționează** în mod constant pe diferite browsere și dispozitive
## Crearea jocului
Acum că înțelegi cum funcționează evenimentele, să punem în practică aceste cunoștințe construind ceva util. Vom crea un joc de viteză la tastare care demonstrează gestionarea evenimentelor și te ajută să dezvolți o abilitate importantă pentru dezvoltatori.
Vom crea un joc pentru a explora cum funcționează evenimentele în JavaScript. Jocul nostru va testa abilitatea de tastare a unui jucător, care este una dintre cele mai subestimate abilități pe care toți dezvoltatorii ar trebui să le aibă. Știați că layout-ul tastaturii QWERTY pe care îl folosim astăzi a fost de fapt conceput în anii 1870 pentru mașinile de scris - iar abilitățile bune de tastare sunt la fel de valoroase pentru programatori și astăzi! Fluxul general al jocului va arăta astfel:
```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
```
**Cum va funcționa jocul nostru:**
- **Începe** 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 greșelile de tastare
- **Calculează** și afișează timpul total când citatul este completat
Să construim jocul nostru și să învățăm despre evenimente!
### Structura fișierelor
Înainte să începem să scriem cod, să ne organizăm! Să avem o structură de fișiere curată de la început ne va scuti de dureri de cap mai târziu și va face proiectul nostru mai profesional. 😊
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. Aceasta este triada clasică care stă la baza majorității web-ului!
**Creează un folder nou pentru proiectul tău deschizând o consolă sau fereastră terminal și executând următoarea comandă:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Ce fac aceste comenzi:**
- **Creează** un nou director numit `typing-game` pentru fișierele proiectului tău
- **Navighează** automat în directorul nou creat
- **Configurează** un spațiu de lucru curat pentru dezvoltarea jocului tău
**Deschide Visual Studio Code:**
```bash
code .
```
**Această comandă:**
- **Lansează** Visual Studio Code în directorul curent
- **Deschide** folderul proiectului în editor
- **Oferă** acces la toate instrumentele de dezvoltare de care ai nevoie
**Adaugă trei fișiere în folderul din 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 va avea loc toată acțiunea jocului nostru! Gândește-te la asta ca la proiectarea panoului de control al unei nave spațiale - trebuie să ne asigurăm că tot ce au nevoie jucătorii este exact acolo unde se așteaptă să fie.
Să ne dăm seama de ce are nevoie 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"` |
| Zonă de mesaje | Afișează mesaje de stare și succes | `
` cu `id="message"` |
| Casetă de text | Unde jucătorii tastează citatul | `` cu `id="typed-value"` |
| Buton de start | Pornește jocul | `