# Skapa ett spel med 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! Vad är ett bättre sätt att lära sig denna viktiga färdighet än genom att bygga något användbart – ett skrivhastighetsspel som reagerar på varje tangenttryckning du gör.
Du kommer att se på nära håll hur webbläsare "pratar" med din JavaScript-kod. Varje gång du klickar, skriver eller flyttar musen, skickar webbläsaren små meddelanden (vi kallar dem händelser) till din kod, och du bestämmer hur du vill svara!
När vi är klara här har du byggt ett riktigt skrivspel som mäter din hastighet och noggrannhet. Viktigast av allt är att 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!
## Förföreläsningsquiz
[Förföreläsningsquiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Händelsestyrd programmering
Tänk på din favoritapp eller webbplats – vad gör att den känns levande och responsiv? Det handlar om hur den reagerar på det du gör! Varje tryckning, klick, svep eller tangenttryckning skapar det vi kallar en "händelse", och det är där den verkliga magin i webbutveckling händer.
Det som gör programmering för webben så intressant är att vi aldrig vet när någon kommer att klicka på den knappen eller börja skriva i en textruta. De kan klicka direkt, vänta fem minuter eller kanske aldrig klicka alls! Denna oförutsägbarhet betyder att vi behöver tänka annorlunda när vi skriver vår kod.
Istället för att skriva kod som körs från toppen till botten som ett recept, skriver vi kod som tålmodigt väntar på att något ska hända. Det liknar hur telegrafoperatörer på 1800-talet satt vid sina maskiner och var redo att svara i samma stund ett meddelande kom genom kabeln.
Så vad är exakt en "händelse"? Enkelt uttryckt är det 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 på musen – det är en annan händelse.
Händelsestyrd programmering låter oss ställa in vår kod för att lyssna och svara. Vi skapar specialfunktioner som kallas **event listeners** (händelselyssnare) som tålmodigt väntar på specifika saker att hända och sedan sätter igång när det sker.
Tänk på event listeners 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 'click' eller 'keypress') och specificerar sedan vad som ska hända när någon ringer på (din egna funktion).
**Så här fungerar händelselyssnare:**
- **Lyssnar** på specifika användaråtgärder som klick, tangenttryckningar eller musrörelser
- **Utför** din anpassade kod när den angivna händelsen inträffar
- **Svarar** omedelbart på användarinteraktioner och skapar en sömlös upplevelse
- **Hanterar** flera händelser på samma element med olika lyssnare
> **NOTE:** Det är värt att betona 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 sätta `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 webbutvecklare använder. Det är också mest flexibelt, eftersom `addEventListener()` fungerar för alla händelser och händelsens namn kan ges som en parameter.
### Vanliga händelser
Medan webbläsare erbjuder dussintals olika händelser att lyssna efter, 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 avancerade användarinteraktioner.
Det finns [dussintals händelser](https://developer.mozilla.org/docs/Web/Events) tillgängliga att lyssna på när du skapar en applikation. I princip väcker allt en användare gör på en sida en händelse, vilket ger dig mycket makt att säkerställa att de får den upplevelse du önskar. Lyckligtvis behöver du normalt bara en liten handfull 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:**
- **Utlöses** när användare interagerar med specifika element på din sida
- **Ger** detaljerad information om användarens handling via 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 visar upp händelsehantering samtidigt som det hjälper dig att utveckla en viktig utvecklarfärdighet.
Vi ska skapa ett spel för att utforska hur händelser fungerar i JavaScript. Vårt spel kommer att testa spelarens skrivkunskaper, vilket är en av de mest underskattade färdigheterna som alla utvecklare bör ha. Rolig fakta: det QWERTY-tangentbord 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! Spelets allmänna flöde kommer att se ut så här:
```mermaid
flowchart TD
A[Spelare klickar på Start] --> B[Slumpmässigt citat visas]
B --> C[Spelare skriver i textrutan]
C --> D{Ord klart?}
D -->|Ja| E[Markera nästa ord]
D -->|Nej| F{Korrekt hittills?}
F -->|Ja| G[Behåll normal stil]
F -->|Nej| H[Visa felstil]
E --> I{Citat klart?}
I -->|Nej| C
I -->|Ja| J[Visa framgångsmeddelande med tid]
G --> C
H --> C
```
**Så här fungerar vårt spel:**
- **Startar** när spelaren klickar på startknappen och visar ett slumpmässigt citat
- **Spårar** spelarens skrivprogression ord för ord i realtid
- **Markera** det aktuella ordet för att styra spelarens fokus
- **Ger** omedelbar visuell feedback vid skrivfel
- **Beräknar** och visar den totala tiden när citatet är slutfört
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 håller det enkelt med bara tre filer: `index.html` för vår sidstruktur, `script.js` för all vår spelloigik och `style.css` för att få allt att se bra ut. Det är den klassiska trion som driver majoriteten av webben!
**Skapa en ny mapp för ditt arbete genom att öppna en konsol eller terminal och skriva följande kommando:**
```bash
# Linux eller macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Det här gör dessa kommandon:**
- **Skapar** en ny katalog som heter `typing-game` för dina projektfiler
- **Byter** automatiskt till den nyskapade katalogen
- **Sätter upp** 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 spelloigik och händelselyssnare
- `style.css` - Definierar det visuella utseendet och stilen
## Skapa användargränssnittet
Nu bygger vi scenen där all spelaktivitet kommer att ske! Tänk på detta som att designa kontrollpanelen för ett rymdskepp – vi måste se till att allt spelarna behöver finns precis där de förväntar sig.
Låt oss ta reda på 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 kommer att behöva:
| 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 | `