# Erstellung eines Spiels mit Events
Haben Sie sich schon einmal gefragt, wie Websites wissen, wann Sie einen Button anklicken oder in ein Textfeld tippen? Das ist die Magie der ereignisgesteuerten Programmierung! Was gibt es Besseres, um diese wichtige Fähigkeit zu erlernen, als etwas Nützliches zu bauen – ein Tippgeschwindigkeitsspiel, das auf jeden Tastendruck reagiert, den Sie machen.
Sie werden aus erster Hand sehen, wie Webbrowser mit Ihrem JavaScript-Code „kommunizieren“. Jedes Mal, wenn Sie klicken, tippen oder Ihre Maus bewegen, sendet der Browser kleine Nachrichten (wir nennen sie Events) an Ihren Code, und Sie entscheiden, wie darauf reagiert wird!
Wenn wir fertig sind, haben Sie ein echtes Tippspiel gebaut, das Ihre Geschwindigkeit und Genauigkeit verfolgt. Noch wichtiger ist, dass Sie die grundlegenden Konzepte verstehen, die jede interaktive Website antreiben, die Sie je genutzt haben. Los geht's!
## Quiz vor der Vorlesung
[Quiz vor der Vorlesung](https://ff-quizzes.netlify.app/web/quiz/21)
## Ereignisgesteuerte Programmierung
Denken Sie an Ihre Lieblings-App oder -Website – was lässt sie lebendig und reaktionsfähig erscheinen? Es geht darum, wie sie auf Ihre Aktionen reagiert! Jeder Tipp, Klick, Wisch oder Tastendruck erzeugt ein sogenanntes „Event“, und hier geschieht die wahre Magie der Webentwicklung.
Das macht Programmierung fürs Web so spannend: Wir wissen nie, wann jemand auf den Button klickt oder anfängt, in ein Textfeld zu tippen. Sie könnten sofort klicken, fünf Minuten warten oder vielleicht überhaupt nie klicken! Diese Unvorhersehbarkeit bedeutet, dass wir anders über die Programmierung nachdenken müssen.
Statt Code zu schreiben, der von oben nach unten wie ein Rezept durchläuft, schreiben wir Code, der geduldig wartet, bis etwas passiert. Das ist ähnlich wie bei Telegraphenbetreibern im 19. Jahrhundert, die neben ihren Maschinen saßen und im Moment einer Nachricht durch den Draht reagierten.
Was genau ist ein „Event“? Kurz gesagt, es ist etwas, das passiert! Wenn Sie einen Button klicken – das ist ein Event. Wenn Sie einen Buchstaben tippen – das ist ein Event. Wenn Sie Ihre Maus bewegen – das ist ein weiteres Event.
Ereignisgesteuerte Programmierung ermöglicht es uns, unseren Code so einzurichten, dass er zuhört und reagiert. Wir erstellen spezielle Funktionen, sogenannte **Event Listener**, die geduldig auf bestimmte Ereignisse warten und dann sofort aktiv werden.
Stellen Sie sich Event Listener vor wie eine Klingel für Ihren Code. Sie richten die Klingel ein (`addEventListener()`), sagen ihr, auf welchen Ton sie hören soll (z. B. 'click' oder 'keypress'), und bestimmen dann, was passieren soll, wenn diese klingelt (Ihre eigene Funktion).
**So funktionieren Event Listener:**
- **Hören** auf bestimmte Benutzeraktionen wie Klicks, Tastendrücke oder Mausbewegungen
- **Führen** Ihren individuellen Code aus, wenn das angegebene Event eintritt
- **Reagieren** sofort auf Benutzereingaben und sorgen so für ein nahtloses Erlebnis
- **Verarbeiten** mehrere Events am selben Element mit verschiedenen Listenern
> **HINWEIS:** Es gibt viele Möglichkeiten, Event Listener zu erstellen. Sie können anonyme Funktionen verwenden oder benannte Funktionen erstellen. Sie können verschiedene Kürzel verwenden, wie das Setzen der `click`-Eigenschaft oder die Nutzung von `addEventListener()`. In unserem Beispiel konzentrieren wir uns auf `addEventListener()` und anonyme Funktionen, da dies wahrscheinlich die gängigste Technik unter Webentwicklern ist. Außerdem ist sie sehr flexibel, weil `addEventListener()` für alle Events funktioniert und der Eventname als Parameter angegeben wird.
### Gängige Events
Obwohl Webbrowser dutzende verschiedene Events bieten, auf die man hören kann, verlassen sich die meisten interaktiven Anwendungen nur auf eine kleine Anzahl essentieller Events. Wenn Sie diese Kern-Events verstehen, haben Sie die Grundlage, um komplexe Nutzerinteraktionen zu bauen.
Es gibt [Dutzende von Events](https://developer.mozilla.org/docs/Web/Events), auf die Sie beim Erstellen einer Anwendung hören können. Grundsätzlich erzeugt jede Benutzeraktion auf einer Seite ein Event, was Ihnen viel Macht gibt, um das Nutzererlebnis zu gestalten. Glücklicherweise benötigen die meisten Anwendungen nur eine kleine Auswahl an Events. Hier sind einige gebräuchliche (einschließlich der zwei, die wir für unser Spiel verwenden):
| Event | Beschreibung | Häufige Anwendungsfälle |
|-------|--------------|-------------------------|
| `click` | Der Benutzer hat irgendwo geklickt | Buttons, Links, interaktive Elemente |
| `contextmenu` | Der Benutzer hat die rechte Maustaste gedrückt | Benutzerdefinierte Kontextmenüs |
| `select` | Der Benutzer hat Text markiert | Textbearbeitung, Kopiervorgänge |
| `input` | Der Benutzer hat Text eingegeben | Formularvalidierung, Echtzeit-Suche |
**Wichtiges zu diesen Event-Typen:**
- **Werden ausgelöst**, wenn Benutzer mit bestimmten Elementen auf Ihrer Seite interagieren
- **Liefern** detaillierte Informationen über die Aktion des Benutzers über Event-Objekte
- **Ermöglichen**, reaktive und interaktive Webanwendungen zu erstellen
- **Funktionieren** einheitlich in verschiedenen Browsern und auf unterschiedlichen Geräten
## Erstellung des Spiels
Jetzt, wo Sie verstehen, wie Events funktionieren, setzen wir dieses Wissen in die Praxis um, indem wir etwas Nützliches bauen. Wir erstellen ein Tippgeschwindigkeitsspiel, das Event-Handling demonstriert und Ihnen hilft, eine wichtige Entwickler-Fähigkeit zu entwickeln.
Wir bauen ein Spiel, um zu erforschen, wie Events in JavaScript funktionieren. Unser Spiel testet die Tippfähigkeit eines Spielers – eine der am meisten unterschätzten Fertigkeiten, die jeder Entwickler haben sollte. Fun Fact: Das QWERTY-Tastaturlayout, das wir heute verwenden, wurde tatsächlich in den 1870ern für Schreibmaschinen entworfen – und gute Tippfähigkeiten sind für Programmierer heute genauso wertvoll! Der allgemeine Ablauf des Spiels sieht folgendermaßen aus:
```mermaid
flowchart TD
A[Spieler klickt auf Start] --> B[Zufälliges Zitat wird angezeigt]
B --> C[Spieler tippt im Textfeld]
C --> D{Wort komplett?}
D -->|Ja| E[Nächstes Wort hervorheben]
D -->|Nein| F{Bis jetzt korrekt?}
F -->|Ja| G[Normale Formatierung beibehalten]
F -->|Nein| H[Fehlerformatierung anzeigen]
E --> I{Zitat komplett?}
I -->|Nein| C
I -->|Ja| J[Erfolgsmeldung mit Zeit anzeigen]
G --> C
H --> C
```
**So funktioniert unser Spiel:**
- **Startet**, wenn der Spieler den Startknopf klickt, und zeigt ein zufälliges Zitat an
- **Verfolgt** den Tippfortschritt des Spielers Wort für Wort in Echtzeit
- **Hebt hervor**, welches Wort gerade zu tippen ist, um den Fokus des Spielers zu lenken
- **Gibt** sofort visuelles Feedback bei Tippfehlern
- **Berechnet** und zeigt die Gesamtzeit an, wenn das Zitat vollständig getippt wurde
Lassen Sie uns unser Spiel bauen und mehr über Events lernen!
### Dateistruktur
Bevor wir mit dem Programmieren beginnen, bringen wir Ordnung ins Projekt! Eine saubere Dateistruktur von Anfang an erspart später Kopfzerbrechen und macht Ihr Projekt professioneller. 😊
Wir halten es einfach mit nur drei Dateien: `index.html` für unsere Seitenstruktur, `script.js` für die gesamte Spiellogik und `style.css`, damit alles gut aussieht. Das ist das klassische Trio, das die meisten Webseiten antreibt!
**Erstellen Sie einen neuen Ordner für Ihre Arbeit, indem Sie eine Konsole oder ein Terminal öffnen und folgenden Befehl ausführen:**
```bash
# Linux oder macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Diese Befehle bewirken:**
- **Erstellen** ein neues Verzeichnis namens `typing-game` für Ihre Projektdateien
- **Wechseln** automatisch in das neu erstellte Verzeichnis
- **Richten ein** sauberes Arbeitsumfeld für die Spieleentwicklung ein
**Öffnen Sie Visual Studio Code:**
```bash
code .
```
**Dieser Befehl:**
- **Startet** Visual Studio Code im aktuellen Verzeichnis
- **Öffnet** Ihren Projektordner im Editor
- **Bietet** Zugriff auf alle Entwicklungswerkzeuge, die Sie benötigen
**Fügen Sie im Order mit Visual Studio Code drei Dateien mit den folgenden Namen hinzu:**
- `index.html` – Enthält die Struktur und den Inhalt Ihres Spiels
- `script.js` – Verarbeitet die gesamte Spiellogik und die Event Listener
- `style.css` – Legt das visuelle Erscheinungsbild und das Styling fest
## Erstellen der Benutzeroberfläche
Jetzt bauen wir die Bühne, auf der das gesamte Spielgeschehen stattfinden wird! Denken Sie daran wie an das Design eines Kontrollpults für ein Raumschiff – wir müssen sicherstellen, dass alles, was unsere Spieler brauchen, genau da ist, wo sie es erwarten.
Lassen Sie uns überlegen, was unser Spiel wirklich benötigt. Wenn Sie ein Tippspiel spielen, was möchten Sie auf dem Bildschirm sehen? Hier ist, was wir brauchen:
| UI-Element | Zweck | HTML-Element |
|------------|-------|--------------|
| Anzeige des Zitats | Zeigt den zu tippenden Text | `
` mit `id="quote"` |
| Nachrichtenbereich | Zeigt Status- und Erfolgsmeldungen | `
` mit `id="message"` |
| Texteingabe | Wo die Spieler das Zitat tippen | `` mit `id="typed-value"` |
| Startknopf | Startet das Spiel | `