# Oprettelse af et spil ved hjælp af events
Har du nogensinde spekuleret på, hvordan hjemmesider ved, når du klikker på en knap eller skriver i en tekstboks? Det er magien ved begivenhedsdrevet programmering! Hvad er en bedre måde at lære denne essentielle færdighed på end ved at bygge noget nyttigt - et skrivehastighedsspil, der reagerer på hver eneste tasteanslag, du laver.
Du vil selv opleve, hvordan webbrowsere "taler" med din JavaScript-kode. Hver gang du klikker, skriver eller bevæger din mus, sender browseren små beskeder (vi kalder dem events) til din kode, og du bestemmer, hvordan du vil svare!
Når vi er færdige her, har du bygget et rigtigt skrivespil, der følger din hastighed og nøjagtighed. Endnu vigtigere, du vil forstå de grundlæggende koncepter, der driver hver interaktiv hjemmeside, du nogensinde har brugt. Lad os dykke ned i det!
## Forud-forelæsning Quiz
[Forud-forelæsning quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Begivenhedsdrevet programmering
Tænk på din yndlingsapp eller hjemmeside - hvad får den til at føles levende og lydhør? Det handler alt sammen om, hvordan den reagerer på det, du gør! Hvert tryk, klik, swipe eller tasteanslag skaber det, vi kalder en "begivenhed", og det er her den ægte magi i webudvikling sker.
Her er det, der gør programmering til web så interessant: vi ved aldrig, hvornår nogen vil klikke på den knap eller begynde at skrive i en tekstboks. De kan klikke med det samme, vente fem minutter eller måske aldrig klikke! Denne uforudsigelighed betyder, at vi skal tænke anderledes om, hvordan vi skriver vores kode.
I stedet for at skrive kode, der kører fra top til bund som en opskrift, skriver vi kode, der tålmodigt venter på, at noget skal ske. Det minder om, hvordan telegrafoperatører i 1800-tallet sad ved deres maskiner og var klar til at svare det øjeblik, en besked kom gennem ledningen.
Så hvad er egentlig en "begivenhed"? Kort sagt, det er noget, der sker! Når du klikker på en knap - det er en begivenhed. Når du skriver et bogstav - det er en begivenhed. Når du bevæger din mus - det er en anden begivenhed.
Begivenhedsdrevet programmering lader os sætte vores kode op til at lytte og reagere. Vi opretter specielle funktioner kaldet **event listeners**, som tålmodigt venter på at bestemte ting sker, og så springer i aktion, når de gør.
Tænk på event listeners som at have en dørklokke for din kode. Du sætter dørklokken op (`addEventListener()`), fortæller den, hvilken lyd den skal lytte efter (som et 'click' eller 'keypress'), og så specificerer du, hvad der skal ske, når nogen ringer på (din brugerdefinerede funktion).
**Sådan fungerer event listeners:**
- **Lytter** efter specifikke brugerhandlinger som klik, tasteanslag eller musebevægelser
- **Udfører** din brugerdefinerede kode, når den angivne begivenhed opstår
- **Reagerer** øjeblikkeligt på brugerinteraktioner og skaber en sømløs oplevelse
- **Håndterer** flere begivenheder på det samme element ved hjælp af forskellige lyttere
> **NOTE:** Det er værd at fremhæve, at der findes mange måder at oprette event listeners på. Du kan bruge anonyme funktioner eller oprette navngivne. Du kan bruge forskellige genveje, som at sætte `click`-egenskaben, eller bruge `addEventListener()`. I vores øvelse vil vi fokusere på `addEventListener()` og anonyme funktioner, da det sandsynligvis er den mest almindelige teknik, webudviklere bruger. Det er også den mest fleksible, da `addEventListener()` virker for alle begivenheder, og eventnavnet kan gives som en parameter.
### Almindelige begivenheder
Mens webbrowsere tilbyder dusinvis af forskellige begivenheder, du kan lytte efter, bygger de fleste interaktive applikationer kun på en håndfuld essentielle begivenheder. At forstå disse kernebegivenheder vil give dig fundamentet til at skabe sofistikerede brugerinteraktioner.
Der findes [dusiner af begivenheder](https://developer.mozilla.org/docs/Web/Events), du kan lytte efter, når du skaber en applikation. Grundlæggende rejser alle handlinger en bruger foretager på en side en begivenhed, hvilket giver dig stor magt til at sikre, at de får den oplevelse, du ønsker. Heldigvis behøver du normalt kun en lille håndfuld begivenheder. Her er nogle almindelige (inklusive de to, vi vil bruge til at skabe vores spil):
| Begivenhed | Beskrivelse | Almindelige brugssituationer |
|------------|-------------|------------------------------|
| `click` | Brugeren klikkede på noget | Knapper, links, interaktive elementer |
| `contextmenu` | Brugeren klikkede med højre museknap | Tilpassede højrekliksmenuer |
| `select` | Brugeren markerede noget tekst | Tekstredigering, kopiering |
| `input` | Brugeren indtastede noget tekst | Formularvalidering, søgning i realtid |
**At forstå disse event-typer:**
- **Udløses** når brugere interagerer med specifikke elementer på din side
- **Giver** detaljeret information om brugerens handling via event-objekter
- **Gør det muligt** at skabe responsive, interaktive webapplikationer
- **Fungerer** konsekvent på tværs af forskellige browsere og enheder
## Oprettelse af spillet
Nu hvor du forstår, hvordan events fungerer, lad os sætte den viden i praksis ved at bygge noget nyttigt. Vi vil skabe et skrivehastighedsspil, der demonstrerer eventhåndtering samtidig med, at du udvikler en vigtig udviklerfærdighed.
Vi laver et spil for at udforske, hvordan events fungerer i JavaScript. Vores spil vil teste en spillers skrivefærdighed, hvilket er en af de mest undervurderede færdigheder, alle udviklere burde have. Sjov fakta: QWERTY-tastaturlayoutet, vi bruger i dag, blev faktisk designet i 1870'erne til skrivemaskiner - og gode skrivefærdigheder er stadig lige så værdifulde for programmører i dag! Det generelle forløb i spillet vil se således ud:
```mermaid
flowchart TD
A[Spiller klikker Start] --> B[Tilfældigt citat vises]
B --> C[Spiller skriver i tekstfelt]
C --> D{Ord fuldført?}
D -->|Ja| E[Fremhæv næste ord]
D -->|Nej| F{Korrekt indtil nu?}
F -->|Ja| G[Behold normal styling]
F -->|Nej| H[Vis fejlstyling]
E --> I{Citat fuldført?}
I -->|Nej| C
I -->|Ja| J[Vis succesbesked med tid]
G --> C
H --> C
```
**Sådan vil vores spil virke:**
- **Starter** når spilleren klikker på startknappen og viser et tilfældigt citat
- **Sporer** spillerens skrivefremskridt ord for ord i realtid
- **Fremhæver** det aktuelle ord for at guide spillerens fokus
- **Giver** øjeblikkelig visuel feedback ved skrivefejl
- **Beregner** og viser den samlede tid, når citatet er færdigskrevet
Lad os bygge vores spil, og lære om events!
### Filstruktur
Før vi begynder at kode, lad os få styr på tingene! At have en ren filstruktur fra starten vil spare dig for hovedpine senere og gøre dit projekt mere professionelt. 😊
Vi holder det simpelt med kun tre filer: `index.html` til vores sidestruktur, `script.js` til al vores spislogik og `style.css` for at få det til at se godt ud. Det er det klassiske triptæm, der driver det meste af internettet!
**Opret en ny mappe til dit arbejde ved at åbne en konsol eller terminal og indsende følgende kommando:**
```bash
# Linux eller macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Her er, hvad disse kommandoer gør:**
- **Opretter** en ny mappe kaldet `typing-game` til dine projektfiler
- **Navigerer** automatisk ind i den nyoprettede mappe
- **Opsætter** et rent arbejdsområde til din spiludvikling
**Åbn Visual Studio Code:**
```bash
code .
```
**Denne kommando:**
- **Starter** Visual Studio Code i den aktuelle mappe
- **Åbner** din projektmappe i editoren
- **Giver** adgang til alle udviklingsværktøjer, du får brug for
**Tilføj tre filer til mappen i Visual Studio Code med følgende navne:**
- `index.html` - Indeholder strukturen og indholdet af dit spil
- `script.js` - Håndterer al spislogikken og event listeners
- `style.css` - Definerer det visuelle udseende og styling
## Opret brugergrænsefladen
Lad os nu bygge scenen, hvor al vores spilhandling vil foregå! Tænk på det som at designe kontrolpanelet til et rumskib - vi skal sikre, at alt det, vores spillere har brug for, er lige, hvor de forventer det.
Lad os finde ud af, hvad vores spil egentlig har brug for. Hvis du spillede et skrive-spil, hvad ville du så gerne se på skærmen? Her er, hvad vi får brug for:
| UI-element | Formål | HTML-element |
|------------|---------|--------------|
| Citatvisning | Viser teksten, der skal tastes | `
` med `id="quote"` |
| Beskedområde | Viser status- og succesbeskeder | `
` med `id="message"` |
| Tekstinput | Hvor spillerne skriver citatet | `` med `id="typed-value"` |
| Startknap | Starter spillet | `