# Pelin luominen tapahtumien avulla
Oletko koskaan miettinyt, miten verkkosivustot tietävät, kun klikkaat painiketta tai kirjoitat tekstikenttään? Se on tapahtumapohjaisen ohjelmoinnin taikaa! Mikä olisikaan parempi tapa oppia tämä olennainen taito kuin rakentaa jotain hyödyllistä – kirjoitusnopeuspeli, joka reagoi jokaiseen näppäimen painallukseen.
Tulet näkemään omin silmin, miten verkkoselaimet "keskustelevat" JavaScript-koodisi kanssa. Joka kerta kun klikkaat, kirjoitat tai liikutat hiirtä, selain lähettää pieniä viestejä (kutsumme niitä tapahtumiksi) koodillesi, ja sinä päätät, miten niihin reagoidaan!
Kun olemme valmiita, olet rakentanut oikean kirjoituspelin, joka seuraa nopeuttasi ja tarkkuuttasi. Vielä tärkeämpää on, että ymmärrät peruskonseptit, jotka ovat jokaisen interaktiivisen verkkosivuston taustalla. Aloitetaan!
## Ennen luentoa - kysely
[Ennen luentoa - kysely](https://ff-quizzes.netlify.app/web/quiz/21)
## Tapahtumapohjainen ohjelmointi
Ajattele suosikkisovellustasi tai -verkkosivustoasi – mikä tekee siitä elävän ja reagoivan? Kaikki liittyy siihen, miten se reagoi toimintaasi! Jokainen napautus, klikkaus, pyyhkäisy tai näppäimen painallus luo sen, mitä kutsumme "tapahtumaksi", ja juuri siinä web-kehityksen todellinen taika tapahtuu.
Tässä on se, mikä tekee web-ohjelmoinnista niin mielenkiintoista: emme koskaan tiedä, milloin joku klikkaa painiketta tai alkaa kirjoittaa tekstikenttään. He voivat klikata heti, odottaa viisi minuuttia tai eivät ehkä klikkaa ollenkaan! Tämä arvaamattomuus tarkoittaa, että meidän on ajateltava eri tavalla, kun kirjoitamme koodia.
Sen sijaan, että kirjoittaisimme koodia, joka suoritetaan ylhäältä alas kuin resepti, kirjoitamme koodia, joka odottaa kärsivällisesti, että jotain tapahtuu. Se on vähän kuin 1800-luvun lennätinoperaattorit, jotka istuivat koneidensa ääressä valmiina reagoimaan heti, kun viesti saapui langan kautta.
Mikä tarkalleen ottaen on "tapahtuma"? Yksinkertaisesti sanottuna se on jotain, joka tapahtuu! Kun klikkaat painiketta – se on tapahtuma. Kun kirjoitat kirjaimen – se on tapahtuma. Kun liikutat hiirtä – se on toinen tapahtuma.
Tapahtumapohjainen ohjelmointi antaa meille mahdollisuuden asettaa koodimme kuuntelemaan ja reagoimaan. Luomme erityisiä funktioita, joita kutsutaan **tapahtumakuuntelijoiksi**, jotka odottavat kärsivällisesti tiettyjen asioiden tapahtumista ja aktivoituvat, kun ne tapahtuvat.
Ajattele tapahtumakuuntelijoita kuin koodisi ovikelloa. Asetat ovikellon (`addEventListener()`), kerrot sille, mitä ääntä kuunnella (kuten 'click' tai 'keypress'), ja määrität, mitä tapahtuu, kun joku soittaa sitä (oma funktiosi).
**Näin tapahtumakuuntelijat toimivat:**
- **Kuuntelevat** tiettyjä käyttäjän toimintoja, kuten klikkauksia, näppäinpainalluksia tai hiiren liikkeitä
- **Suorittavat** mukautettua koodiasi, kun määritetty tapahtuma tapahtuu
- **Reagoivat** välittömästi käyttäjän vuorovaikutuksiin, luoden saumattoman kokemuksen
- **Käsittelevät** useita tapahtumia samalla elementillä eri kuuntelijoiden avulla
> **NOTE:** On syytä korostaa, että tapahtumakuuntelijoita voi luoda monella eri tavalla. Voit käyttää anonyymejä funktioita tai luoda nimettyjä. Voit käyttää erilaisia pikakuvakkeita, kuten asettamalla `click`-ominaisuuden tai käyttämällä `addEventListener()`. Harjoituksessamme keskitymme `addEventListener()`-menetelmään ja anonyymeihin funktioihin, koska se on todennäköisesti yleisin tekniikka, jota web-kehittäjät käyttävät. Se on myös joustavin, sillä `addEventListener()` toimii kaikille tapahtumille, ja tapahtuman nimi voidaan antaa parametrina.
### Yleiset tapahtumat
Vaikka verkkoselaimet tarjoavat kymmeniä erilaisia tapahtumia, joita voit kuunnella, useimmat interaktiiviset sovellukset luottavat vain muutamaan keskeiseen tapahtumaan. Näiden ydintapahtumien ymmärtäminen antaa sinulle perustan rakentaa monimutkaisia käyttäjävuorovaikutuksia.
[Dozens of events](https://developer.mozilla.org/docs/Web/Events) ovat käytettävissäsi, kun luot sovellusta. Käytännössä kaikki, mitä käyttäjä tekee sivulla, luo tapahtuman, mikä antaa sinulle paljon valtaa varmistaa, että he saavat haluamansa kokemuksen. Onneksi tarvitset yleensä vain pienen joukon tapahtumia. Tässä muutama yleinen (mukaan lukien kaksi, joita käytämme pelimme luomisessa):
| Tapahtuma | Kuvaus | Yleiset käyttötapaukset |
|-----------|---------|-------------------------|
| `click` | Käyttäjä klikkasi jotain | Painikkeet, linkit, interaktiiviset elementit |
| `contextmenu` | Käyttäjä klikkasi hiiren oikeaa painiketta | Mukautetut oikean klikkauksen valikot |
| `select` | Käyttäjä korosti tekstiä | Tekstin muokkaus, kopiointitoiminnot |
| `input` | Käyttäjä syötti tekstiä | Lomakkeiden validointi, reaaliaikainen haku |
**Näiden tapahtumatyyppien ymmärtäminen:**
- **Aktivoituu**, kun käyttäjät vuorovaikuttavat tiettyjen elementtien kanssa sivullasi
- **Tarjoaa** yksityiskohtaista tietoa käyttäjän toiminnasta tapahtumaobjektien kautta
- **Mahdollistaa** responsiivisten, interaktiivisten verkkosovellusten luomisen
- **Toimii** johdonmukaisesti eri selaimissa ja laitteissa
## Pelin luominen
Nyt kun ymmärrät, miten tapahtumat toimivat, laitetaan tieto käytäntöön rakentamalla jotain hyödyllistä. Luomme kirjoitusnopeuspelin, joka havainnollistaa tapahtumien käsittelyä samalla kun kehität tärkeää ohjelmoijan taitoa.
Luomme pelin tutkiaksemme, miten tapahtumat toimivat JavaScriptissä. Pelimme testaa pelaajan kirjoitustaitoa, joka on yksi aliarvostetuimmista taidoista, joita kaikilla kehittäjillä pitäisi olla. Hauska fakta: QWERTY-näppäimistöasettelu, jota käytämme tänään, suunniteltiin 1870-luvulla kirjoituskoneille – ja hyvät kirjoitustaidot ovat edelleen yhtä arvokkaita ohjelmoijille tänään! Pelin yleinen kulku näyttää tältä:
```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
```
**Näin pelimme toimii:**
- **Alkaa**, kun pelaaja klikkaa aloituspainiketta ja satunnainen lainaus näytetään
- **Seuraa** pelaajan kirjoitusprosessia sana sanalta reaaliajassa
- **Korostaa** nykyisen sanan ohjatakseen pelaajan keskittymistä
- **Tarjoaa** välitöntä visuaalista palautetta kirjoitusvirheistä
- **Laskee** ja näyttää kokonaisajan, kun lainaus on valmis
Rakennetaan peli ja opitaan tapahtumista!
### Tiedostorakenne
Ennen kuin aloitamme koodaamisen, järjestäydymme! Selkeä tiedostorakenne alusta alkaen säästää myöhemmin päänvaivaa ja tekee projektistasi ammattimaisemman. 😊
Pidämme asiat yksinkertaisina vain kolmella tiedostolla: `index.html` sivun rakenteelle, `script.js` kaikelle pelilogiikalle ja `style.css`, jotta kaikki näyttäisi hyvältä. Tämä on klassinen kolmikko, joka pyörittää suurinta osaa verkosta!
**Luo uusi kansio työllesi avaamalla konsoli tai terminaali ja suorittamalla seuraava komento:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Näin nämä komennot toimivat:**
- **Luo** uuden hakemiston nimeltä `typing-game` projektitiedostoillesi
- **Siirtyy** automaattisesti juuri luotuun hakemistoon
- **Asettaa** puhtaan työtilan pelin kehittämistä varten
**Avaa Visual Studio Code:**
```bash
code .
```
**Tämä komento:**
- **Käynnistää** Visual Studio Coden nykyisessä hakemistossa
- **Avaa** projektikansiosi editorissa
- **Tarjoaa** pääsyn kaikkiin tarvittaviin kehitystyökaluihin
**Lisää kolme tiedostoa kansioon Visual Studio Codessa seuraavilla nimillä:**
- `index.html` - Sisältää pelin rakenteen ja sisällön
- `script.js` - Käsittelee kaiken pelilogiikan ja tapahtumakuuntelijat
- `style.css` - Määrittää visuaalisen ulkoasun ja tyylin
## Käyttöliittymän luominen
Nyt rakennetaan näyttämö, jossa kaikki pelin toiminta tapahtuu! Ajattele tätä kuin avaruusaluksen ohjauspaneelin suunnittelua – meidän täytyy varmistaa, että kaikki, mitä pelaajat tarvitsevat, on juuri siellä, missä he odottavat sen olevan.
Mietitään, mitä pelimme oikeastaan tarvitsee. Jos pelaisit kirjoituspeliä, mitä haluaisit nähdä näytöllä? Tässä on, mitä tarvitsemme:
| Käyttöliittymän elementti | Tarkoitus | HTML-elementti |
|---------------------------|-----------|----------------|
| Lainauksen näyttö | Näyttää kirjoitettavan tekstin | `
` ja `id="quote"` |
| Viestialue | Näyttää tilan ja onnistumisen viestit | `
` ja `id="message"` |
| Tekstikenttä | Paikka, jossa pelaajat kirjoittavat lainauksen | `` ja `id="typed-value"` |
| Aloituspainike | Aloittaa pelin | `