# Mängu loomine sündmuste abil
Kas oled kunagi mõelnud, kuidas veebisaidid teavad, millal sa klõpsad nuppu või tippid tekstikasti? See on sündmustepõhise programmeerimise võlu! Mis oleks parem viis selle olulise oskuse õppimiseks, kui ehitada midagi kasulikku – tippimiskiiruse mäng, mis reageerib iga su tehtud klahvivajutuse peale.
Sa näed ise, kuidas veebibrauserid "räägivad" su JavaScript koodiga. Iga kord, kui sa klõpsad, tipsid või lohistad hiirt, saadab brauser sinu koodile väikeseid sõnumeid (me nimetame neid sündmusteks), ja sina otsustad, kuidas reageerida!
Siin lõpus oled ehitanud pärismaailma tippimismängu, mis jälgib su kiirust ja täpsust. Veelgi olulisem on see, et sa saad aru põhimõistetest, mis juhivad iga interaktiivset veebisaiti, mida sa oled kasutanud. Hakkame pihta!
## Enne loengut test
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Sündmustepõhine programmeerimine
Mõtle oma lemmikrakendusele või veebisaidile – mis teeb selle elavaks ja reageerivaks? Kõik saab alguse sellest, kuidas see reageerib su tegevustele! Iga koputus, klõps, libistus või klahvivajutus tekitab seda, mida me nimetame "sündmuseks", ja just siin toimub veebiarenduse tõeline võlu.
See teeb veebiprogrammeerimise väga huvitavaks: me ei tea kunagi, millal keegi selle nupu klõpsab või tekstikasti hakkab tippima. Nad võivad klõpsata kohe, oodata viis minutit või võib-olla ei klõpsa üldse! See ettearvamatus nõuab, et me mõtleksime teisiti koodi kirjutamisele.
Selle asemel, et kirjutada kood, mis jookseb ülevalt alla nagu retsept, kirjutame koodi, mis ootab kannatlikult, kuni midagi juhtub. See on nagu 1800. aastate telegraafitöötajad, kes istusid oma masinate kõrval valmis, et kohe reageerida, kui sõnum traat läbi tuli.
Mis on siis täpsemalt "sündmus"? Lihtsalt öeldes: see on midagi, mis juhtub! Kui sa klõpsad nuppu – see on sündmus. Kui sa tippid tähe – see on sündmus. Kui sa liigutad hiirt – see on teine sündmus.
Sündmustepõhine programmeerimine laseb meil seadistada koodi kuulama ja reageerima. Loome spetsiaalsed funktsioonid, mida nimetatakse **sündmusekõrvutajateks (event listeners)**, mis ootavad kannatlikult konkreetsete sündmuste juhtumist ja reageerivad kohe, kui see juhtub.
Mõtle sündmusekõrvutaja peale nagu uksekella oma koodi jaoks. Sa seadistad uksekella (`addEventListener()`), ütled, millist heli kuulata (näiteks 'click' või 'keypress'), ja määrad, mis peaks juhtuma, kui keegi selle helistab (sinu kohandatud funktsioon).
**Nii toimivad sündmusekõrvutajad:**
- **Kuulavad** konkreetseid kasutaja tegevusi nagu klõpsud, klahvivajutused või hiire liigutused
- **Käivitatakse** sinu kohandatud kood, kui määratud sündmus toimub
- **Reageerivad** kohe kasutaja interaktsioonidele, luues sujuva kogemuse
- **Haldavad** mitut sündmust sama elemendi peal erinevate kõrvutajate kaudu
> **MÄRKUS:** Tasub rõhutada, et sündmusekõrvutajaid on mitut moodi luua. Võid kasutada anonüümseid funktsioone või luua nimelisi. Sa võid kasutada erinevaid otseteid, nagu `click` omaduse seadistamine või `addEventListener()`. Meie ülesandes keskendume `addEventListener()` ja anonüümsete funktsioonide kasutamisele, kuna see on tõenäoliselt kõige tavalisem tehnika veebiarendajate seas. Samuti on see kõige paindlikum, sest `addEventListener()` töötab kõigi sündmustega ja sündmuse nimi saab olla parameetrina.
### Levinumad sündmused
Kuigi veebibrauserid pakuvad mitmekümneid erinevaid sündmusi, mida kuulata, toetuvad enamus interaktiivseid rakendusi vaid mõnele olulisemale sündmusele. Nende põhielementide mõistmine annab sulle vundamendi keerukamate kasutajaliideste loomiseks.
On olemas [kümneid sündmusi](https://developer.mozilla.org/docs/Web/Events), mida saad rakenduses kuulata. Peaaegu iga kasutaja tegevus lehel tekitab sündmuse, mis annab sulle palju võimu tagada soovitud kasutajakogemus. Õnneks vajad sa tavaliselt vaid väikest valikut sündmusi. Siin on mõned levinumad (sealhulgas kaks, mida kasutame oma mängu loomisel):
| Sündmus | Kirjeldus | Levinumad kasutusjuhtumid |
|---------|-----------|----------------------------|
| `click` | Kasutaja klõpsas millegi peal | Nupud, lingid, interaktiivsed elemendid |
| `contextmenu` | Kasutaja klõpsas parema hiirenupuga | Kohandatud paremklõpsumenüüd |
| `select` | Kasutaja märgistas teksti | Tekstiredigeerimine, kopeerimine |
| `input` | Kasutaja sisestas teksti | Vormide valideerimine, reaalajas otsing |
**Nende sündmustüüpide mõistmine:**
- **Käivitub**, kui kasutajad suhtlevad konkreetsete elementidega sinu lehel
- **Pakkuvad** detailset infot kasutaja tegevuse kohta sündmuse objektide kaudu
- **Võimaldavad** sul luua vastutulelikke ja interaktiivseid veebiäppe
- **Töötavad** järjekindlalt erinevates brauserites ja seadmetes
## Mängu loomine
Nüüd, kui sa tead, kuidas sündmused töötavad, paneme selle teadmise praktikasse, luues midagi kasulikku. Loome tippimiskiiruse mängu, mis demonstreerib sündmuste käsitlemist ja aitab sul arendada olulist arendaja oskust.
Me hakkame looma mängu, et uurida, kuidas JavaScriptis sündmused töötavad. Meie mäng testib mängija tippimisoskust, mis on üks alahinnatud oskusi, mida iga arendaja peaks valdama. Huvitav fakt: klaviatuuripaigutus QWERTY, mida me tänapäeval kasutame, töötati tegelikult välja 1870. aastatel kirjutusmasinate jaoks – ja head tippimisoskused on programmeerijatele tänaseni väga väärtuslikud! Mängu üldine voog näeb välja järgmine:
```mermaid
flowchart TD
A[Mängija klikib Alusta] --> B[Juhuslik tsitaat kuvatakse]
B --> C[Mängija sisestab tekstikasti]
C --> D[Sõna lõpuni?]
D -->|Jah| E[Esile tõsta järgmine sõna]
D -->|Ei| F[Kuni nüüd korrektne?]
F -->|Jah| G[Hoia normaalset stiili]
F -->|Ei| H[Näita veast stiili]
E --> I[Tsitaat lõpetatud?]
I -->|Ei| C
I -->|Jah| J[Kuva edusõnum ajaga]
G --> C
H --> C
```
**Mäng töötab nii:**
- **Algab**, kui mängija klõpsab start nupul ja kuvab juhusliku tsitaadi
- **Jälgib** mängija tippimise edenemist sõna haaval reaalajas
- **Tõstab esile** praeguse sõna, et juhatada mängija tähelepanu
- **Anname** kohese visuaalse tagasiside tippimisvigade kohta
- **Arvutab** ja kuvab koguaega, kui tsitaat on lõpetatud
Teeme ära ja õpime sündmuste kohta!
### Failide struktuur
Enne kui hakkame koodi kirjutama, tehkem endale selgeks failistruktuur! Alates algusest korras olev failistruktuur säästab hiljem peavalu ja teeb su projekti professionaalsemaks. 😊
Hoidke asjad lihtsana kolme failiga: `index.html` meie lehe struktuuri jaoks, `script.js` kogu mängu loogika jaoks ja `style.css`, et kõik ilus välja näeks. See on klassikaline trioon, mis paneb suurema osa veebist tööle!
**Loo uus kaust oma töö jaoks, avades konsooli või terminali ning käivitades järgmise käsu:**
```bash
# Linux või macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Need käsud teevad järgmist:**
- **Loovad** uue kausta nimega `typing-game` sinu projekti failide jaoks
- **Liiguvad** automaatselt äsja loodud kausta
- **Seadistavad** puhta tööruumi sinu mänguarenduseks
**Ava Visual Studio Code:**
```bash
code .
```
**See käsk:**
- **Avab** Visual Studio Code'i praeguses kaustas
- **Laeb** sinu projekti kausta redaktoris
- **Pakkuvab** juurdepääsu kõikidele vajalikele arendusvahenditele
**Lisa Visual Studio Codes kausta kolm faili järgmiste nimedega:**
- `index.html` – sisaldab mängu struktuuri ja sisu
- `script.js` – haldab kogu mängu loogikat ja sündmusekõrvutajaid
- `style.css` – määratleb visuaalse välimuse ja stiilid
## Kasutajaliidese loomine
Korteri ehitamiseks leiame nüüd ruumi, kus kogu meie mängutegelane toimub! Mõtle sellele kui kosmoselaeva juhtpaneeli kujundamine – me peame tagama, et kõik, mida mängijad vajavad, on täpselt seal, kus nad seda ootavad.
Vaatame, mida meie mäng tegelikult vajab. Kui sa mängiksid tippimismängu, mida sa tahaksid ekraanil näha? Siin on, mida me vajame:
| Kasutajaliidese element | Eesmärk | HTML element |
|-------------------------|---------|--------------|
| Tsitaadi kuvamine | Kuvab teksti, mida tippida | `
` koos `id="quote"` |
| Sõnumiala | Kuvab staatuse ja edusõnumeid | `
` koos `id="message"` |
| Tekstisisestus | Koht, kuhu mängijad tsitaati tipivad | `` koos `id="typed-value"` |
| Start-nupp | Algatab mängu | `