# Vytvoření hry pomocí událostí
Přemýšleli jste někdy, jak webové stránky poznají, že klikáte na tlačítko nebo píšete do textového pole? To je kouzlo programování řízeného událostmi! A co je lepší způsob, jak se naučit tuto základní dovednost, než vytvořit něco užitečného – hru na rychlost psaní, která reaguje na každý váš stisk klávesy.
Na vlastní oči uvidíte, jak webové prohlížeče „komunikují“ s vaším JavaScriptovým kódem. Pokaždé, když kliknete, píšete nebo pohybujete myší, prohlížeč posílá malé zprávy (říkáme jim události) vašemu kódu, a vy rozhodujete, jak na ně reagovat!
Až skončíme, budete mít vytvořenou skutečnou hru na psaní, která sleduje vaši rychlost a přesnost. Co je však důležitější, pochopíte základní koncepty, které pohánějí každou interaktivní webovou stránku, kterou jste kdy použili. Pojďme na to!
## Kvíz před lekcí
[Kvíz před lekcí](https://ff-quizzes.netlify.app/web/quiz/21)
## Programování řízené událostmi
Přemýšlejte o své oblíbené aplikaci nebo webové stránce – co ji dělá živou a pohotovou? Je to všechno o tom, jak reaguje na to, co děláte! Každé klepnutí, kliknutí, přejetí nebo stisk klávesy vytváří to, čemu říkáme „událost“, a právě tam se odehrává skutečná magie webového vývoje.
Tady je to, co dělá programování pro web tak zajímavým: nikdy nevíme, kdy někdo klikne na to tlačítko nebo začne psát do textového pole. Může kliknout okamžitě, počkat pět minut, nebo možná nikdy neklikne! Tato nepředvídatelnost znamená, že musíme přemýšlet jinak o tom, jak píšeme náš kód.
Místo psaní kódu, který běží odshora dolů jako recept, píšeme kód, který trpělivě čeká, až se něco stane. Je to podobné jako telegrafní operátoři v 19. století, kteří seděli u svých strojů, připraveni reagovat, jakmile přijde zpráva po drátě.
Takže co přesně je „událost“? Jednoduše řečeno, je to něco, co se stane! Když kliknete na tlačítko – to je událost. Když napíšete písmeno – to je událost. Když pohnete myší – to je další událost.
Programování řízené událostmi nám umožňuje nastavit náš kód tak, aby naslouchal a reagoval. Vytváříme speciální funkce nazývané **posluchače událostí**, které trpělivě čekají na konkrétní věci, které se stanou, a pak se aktivují, když k tomu dojde.
Představte si posluchače událostí jako zvonek u dveří pro váš kód. Nastavíte zvonek (`addEventListener()`), řeknete mu, na jaký zvuk má čekat (například 'click' nebo 'keypress'), a pak určíte, co by se mělo stát, když někdo zazvoní (vaše vlastní funkce).
**Jak fungují posluchače událostí:**
- **Naslouchají** konkrétním akcím uživatele, jako jsou kliknutí, stisky kláves nebo pohyby myší
- **Provádějí** váš vlastní kód, když nastane specifikovaná událost
- **Reagují** okamžitě na interakce uživatele, čímž vytvářejí plynulý zážitek
- **Zpracovávají** více událostí na stejném prvku pomocí různých posluchačů
> **NOTE:** Stojí za zmínku, že existuje mnoho způsobů, jak vytvořit posluchače událostí. Můžete použít anonymní funkce nebo vytvořit pojmenované. Můžete použít různé zkratky, jako nastavení vlastnosti `click`, nebo použít `addEventListener()`. V našem cvičení se zaměříme na `addEventListener()` a anonymní funkce, protože je to pravděpodobně nejběžnější technika, kterou weboví vývojáři používají. Je také nejflexibilnější, protože `addEventListener()` funguje pro všechny události a název události může být poskytnut jako parametr.
### Běžné události
Zatímco webové prohlížeče nabízejí desítky různých událostí, které můžete poslouchat, většina interaktivních aplikací se spoléhá jen na několik základních událostí. Porozumění těmto klíčovým událostem vám poskytne základ pro vytváření sofistikovaných uživatelských interakcí.
Existuje [desítky událostí](https://developer.mozilla.org/docs/Web/Events), které můžete poslouchat při vytváření aplikace. Prakticky vše, co uživatel na stránce udělá, vyvolá událost, což vám dává velkou moc zajistit, že dostane požadovaný zážitek. Naštěstí obvykle budete potřebovat jen malou hrstku událostí. Tady je několik běžných (včetně dvou, které použijeme při vytváření naší hry):
| Událost | Popis | Běžné použití |
|---------|-------|---------------|
| `click` | Uživatel na něco kliknul | Tlačítka, odkazy, interaktivní prvky |
| `contextmenu` | Uživatel kliknul pravým tlačítkem myši | Vlastní nabídky po kliknutí pravým tlačítkem |
| `select` | Uživatel označil nějaký text | Úprava textu, operace kopírování |
| `input` | Uživatel zadal nějaký text | Validace formulářů, vyhledávání v reálném čase |
**Porozumění těmto typům událostí:**
- **Spouští** se, když uživatelé interagují s konkrétními prvky na vaší stránce
- **Poskytují** podrobné informace o akci uživatele prostřednictvím objektů událostí
- **Umožňují** vám vytvářet pohotové, interaktivní webové aplikace
- **Fungují** konzistentně napříč různými prohlížeči a zařízeními
## Vytvoření hry
Teď, když rozumíte tomu, jak události fungují, pojďme tyto znalosti využít v praxi a vytvořit něco užitečného. Vytvoříme hru na rychlost psaní, která demonstruje zpracování událostí a zároveň vám pomůže rozvíjet důležitou dovednost vývojáře.
Vytvoříme hru, abychom prozkoumali, jak události fungují v JavaScriptu. Naše hra otestuje schopnost hráče psát, což je jedna z nejvíce podceňovaných dovedností, kterou by měl mít každý vývojář. Zajímavost: rozložení klávesnice QWERTY, které dnes používáme, bylo ve skutečnosti navrženo v 70. letech 19. století pro psací stroje – a dobré dovednosti v psaní jsou stále stejně cenné pro programátory i dnes! Obecný průběh hry bude vypadat takto:
```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
```
**Jak bude naše hra fungovat:**
- **Začne**, když hráč klikne na tlačítko start a zobrazí náhodný citát
- **Sleduje** pokrok hráče při psaní slovo po slovu v reálném čase
- **Zvýrazní** aktuální slovo, aby vedlo pozornost hráče
- **Poskytne** okamžitou vizuální zpětnou vazbu při chybách v psaní
- **Vypočítá** a zobrazí celkový čas po dokončení citátu
Pojďme vytvořit naši hru a naučit se o událostech!
### Struktura souborů
Než začneme kódovat, pojďme se zorganizovat! Mít čistou strukturu souborů od začátku vám ušetří pozdější problémy a učiní váš projekt profesionálnějším. 😊
Budeme to držet jednoduché s pouhými třemi soubory: `index.html` pro strukturu naší stránky, `script.js` pro veškerou logiku hry a `style.css`, aby vše vypadalo skvěle. To je klasická trojice, která pohání většinu webu!
**Vytvořte novou složku pro svou práci otevřením konzole nebo terminálového okna a zadáním následujícího příkazu:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Co tyto příkazy dělají:**
- **Vytvoří** nový adresář nazvaný `typing-game` pro vaše projektové soubory
- **Přejde** automaticky do nově vytvořeného adresáře
- **Nastaví** čisté pracovní prostředí pro vývoj vaší hry
**Otevřete Visual Studio Code:**
```bash
code .
```
**Tento příkaz:**
- **Spustí** Visual Studio Code v aktuálním adresáři
- **Otevře** vaši projektovou složku v editoru
- **Poskytne** přístup ke všem nástrojům pro vývoj, které budete potřebovat
**Přidejte do složky ve Visual Studio Code tři soubory s následujícími názvy:**
- `index.html` – Obsahuje strukturu a obsah vaší hry
- `script.js` – Zpracovává veškerou logiku hry a posluchače událostí
- `style.css` – Definuje vizuální vzhled a stylizaci
## Vytvoření uživatelského rozhraní
Teď vytvoříme scénu, kde se bude odehrávat veškerá akce naší hry! Představte si to jako navrhování ovládacího panelu pro vesmírnou loď – musíme zajistit, aby vše, co naši hráči potřebují, bylo přesně tam, kde to očekávají.
Pojďme zjistit, co naše hra skutečně potřebuje. Kdybyste hráli hru na psaní, co byste chtěli vidět na obrazovce? Tady je to, co budeme potřebovat:
| Prvek UI | Účel | HTML prvek |
|----------|------|-----------|
| Zobrazení citátu | Zobrazuje text k napsání | `
` s `id="quote"` |
| Oblast zpráv | Zobrazuje stavové a úspěšné zprávy | `
` s `id="message"` |
| Textové pole | Místo, kde hráči píší citát | `` s `id="typed-value"` |
| Tlačítko Start | Spustí hru | `