# Skapa ett spel med hjälp av händelser
Har du någonsin undrat hur webbplatser vet när du klickar på en knapp eller skriver i en textruta? Det är magin med händelsestyrd programmering! Vilket bättre sätt att lära sig denna viktiga färdighet än att bygga något användbart - ett skrivhastighetsspel som reagerar på varje tangenttryckning du gör.
Du kommer att få se hur webbläsare "pratar" med din JavaScript-kod. Varje gång du klickar, skriver eller rör musen skickar webbläsaren små meddelanden (vi kallar dem händelser) till din kod, och du får bestämma hur du ska reagera!
När vi är klara här kommer du ha byggt ett riktigt skrivspel som mäter din hastighet och noggrannhet. Ännu viktigare, du kommer att förstå de grundläggande koncepten som driver varje interaktiv webbplats du någonsin har använt. Låt oss sätta igång!
## Quiz före föreläsningen
[Quiz före föreläsningen](https://ff-quizzes.netlify.app/web/quiz/21)
## Händelsestyrd programmering
Tänk på din favoritapp eller webbplats - vad får den att kännas levande och responsiv? Det handlar om hur den reagerar på vad du gör! Varje tryck, klick, svep eller tangenttryckning skapar det vi kallar en "händelse", och det är där den verkliga magin med webbutveckling händer.
Här är vad som gör programmering för webben så intressant: vi vet aldrig när någon kommer att klicka på den där knappen eller börja skriva i en textruta. De kanske klickar direkt, väntar fem minuter eller kanske aldrig klickar alls! Denna oförutsägbarhet innebär att vi måste tänka annorlunda kring hur vi skriver vår kod.
Istället för att skriva kod som körs från topp till botten som ett recept, skriver vi kod som sitter och väntar på att något ska hända. Det är likt hur telegrafoperatörer på 1800-talet satt vid sina maskiner, redo att svara så snart ett meddelande kom genom tråden.
Så vad exakt är en "händelse"? Enkelt uttryckt, det är något som händer! När du klickar på en knapp - det är en händelse. När du skriver en bokstav - det är en händelse. När du rör musen - det är en annan händelse.
Händelsestyrd programmering låter oss ställa in vår kod för att lyssna och reagera. Vi skapar speciella funktioner som kallas **händelselyssnare** som väntar tålmodigt på specifika saker att hända, och sedan agerar när de gör det.
Tänk på händelselyssnare som att ha en dörrklocka för din kod. Du ställer in dörrklockan (`addEventListener()`), berättar vilken ljudsignal den ska lyssna efter (som ett 'klick' eller 'tangenttryckning'), och sedan specificerar vad som ska hända när någon ringer på den (din anpassade funktion).
**Så här fungerar händelselyssnare:**
- **Lyssnar** efter specifika användaråtgärder som klick, tangenttryckningar eller musrörelser
- **Utför** din anpassade kod när den angivna händelsen inträffar
- **Reagerar** omedelbart på användarinteraktioner och skapar en smidig upplevelse
- **Hantera** flera händelser på samma element med olika lyssnare
> **NOTE:** Det är värt att påpeka att det finns många sätt att skapa händelselyssnare. Du kan använda anonyma funktioner eller skapa namngivna. Du kan använda olika genvägar, som att ställa in `click`-egenskapen eller använda `addEventListener()`. I vår övning kommer vi att fokusera på `addEventListener()` och anonyma funktioner, eftersom det förmodligen är den vanligaste tekniken som webbutvecklare använder. Det är också den mest flexibla, eftersom `addEventListener()` fungerar för alla händelser och händelsenamnet kan anges som en parameter.
### Vanliga händelser
Även om webbläsare erbjuder dussintals olika händelser att lyssna på, förlitar sig de flesta interaktiva applikationer på bara en handfull viktiga händelser. Att förstå dessa kärnhändelser ger dig grunden för att bygga sofistikerade användarinteraktioner.
Det finns [dussintals händelser](https://developer.mozilla.org/docs/Web/Events) som du kan lyssna på när du skapar en applikation. I princip allt en användare gör på en sida skapar en händelse, vilket ger dig mycket kraft att säkerställa att de får den upplevelse du önskar. Lyckligtvis behöver du normalt bara ett fåtal händelser. Här är några vanliga (inklusive de två vi kommer att använda när vi skapar vårt spel):
| Händelse | Beskrivning | Vanliga användningsområden |
|----------|-------------|----------------------------|
| `click` | Användaren klickade på något | Knappar, länkar, interaktiva element |
| `contextmenu` | Användaren klickade med höger musknapp | Anpassade högerklicksmenyer |
| `select` | Användaren markerade text | Textredigering, kopieringsoperationer |
| `input` | Användaren skrev in text | Formulärvalidering, realtidssökning |
**Att förstå dessa händelsetyper:**
- **Triggar** när användare interagerar med specifika element på din sida
- **Ger** detaljerad information om användarens handling genom händelseobjekt
- **Möjliggör** att du kan skapa responsiva, interaktiva webbapplikationer
- **Fungerar** konsekvent över olika webbläsare och enheter
## Skapa spelet
Nu när du förstår hur händelser fungerar, låt oss omsätta den kunskapen i praktiken genom att bygga något användbart. Vi ska skapa ett skrivhastighetsspel som demonstrerar händelsehantering samtidigt som det hjälper dig att utveckla en viktig färdighet som utvecklare.
Vi ska skapa ett spel för att utforska hur händelser fungerar i JavaScript. Vårt spel kommer att testa spelarens skrivförmåga, vilket är en av de mest underskattade färdigheterna som alla utvecklare borde ha. Rolig fakta: QWERTY-tangentbordslayouten vi använder idag designades faktiskt på 1870-talet för skrivmaskiner - och goda skrivfärdigheter är fortfarande lika värdefulla för programmerare idag! Den allmänna spelgången kommer att se ut så här:
```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
```
**Så här kommer vårt spel att fungera:**
- **Startar** när spelaren klickar på startknappen och visar ett slumpmässigt citat
- **Spårar** spelarens skrivframsteg ord för ord i realtid
- **Markerar** det aktuella ordet för att vägleda spelarens fokus
- **Ger** omedelbar visuell feedback för skrivfel
- **Beräknar** och visar den totala tiden när citatet är klart
Låt oss bygga vårt spel och lära oss om händelser!
### Filstruktur
Innan vi börjar koda, låt oss organisera oss! Att ha en ren filstruktur från början sparar dig huvudvärk senare och gör ditt projekt mer professionellt. 😊
Vi kommer att hålla det enkelt med bara tre filer: `index.html` för vår sidstruktur, `script.js` för all vår spellogik och `style.css` för att få allt att se bra ut. Detta är den klassiska trion som driver de flesta webbplatser!
**Skapa en ny mapp för ditt arbete genom att öppna en konsol eller terminalfönster och köra följande kommando:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Här är vad dessa kommandon gör:**
- **Skapar** en ny katalog som heter `typing-game` för dina projektfiler
- **Navigerar** automatiskt in i den nyss skapade katalogen
- **Ställer in** en ren arbetsyta för din spelutveckling
**Öppna Visual Studio Code:**
```bash
code .
```
**Detta kommando:**
- **Startar** Visual Studio Code i den aktuella katalogen
- **Öppnar** din projektmapp i editorn
- **Ger** tillgång till alla utvecklingsverktyg du behöver
**Lägg till tre filer i mappen i Visual Studio Code med följande namn:**
- `index.html` - Innehåller strukturen och innehållet för ditt spel
- `script.js` - Hanterar all spellogik och händelselyssnare
- `style.css` - Definierar det visuella utseendet och stilen
## Skapa användargränssnittet
Nu ska vi bygga scenen där all vår spelaction kommer att äga rum! Tänk på detta som att designa kontrollpanelen för ett rymdskepp - vi måste se till att allt våra spelare behöver finns precis där de förväntar sig det.
Låt oss lista ut vad vårt spel faktiskt behöver. Om du spelade ett skrivspel, vad skulle du vilja se på skärmen? Här är vad vi behöver:
| UI-element | Syfte | HTML-element |
|------------|-------|--------------|
| Citatvisning | Visar texten att skriva | `
` med `id="quote"` |
| Meddelandeområde | Visar status- och framgångsmeddelanden | `
` med `id="message"` |
| Textinmatning | Där spelare skriver citatet | `` med `id="typed-value"` |
| Startknapp | Startar spelet | `