# Створення гри за допомогою подій
Чи замислювалися ви, як вебсайти знають, коли ви натискаєте кнопку або вводите текст у текстове поле? Це магія програмування, орієнтованого на події! Що може бути кращим способом освоїти цей важливий навик, ніж створити щось корисне — гру на швидкість набору тексту, яка реагує на кожне ваше натискання клавіші.
Ви побачите на власні очі, як веббраузери "спілкуються" з вашим кодом JavaScript. Кожного разу, коли ви натискаєте, вводите текст або рухаєте мишкою, браузер надсилає маленькі повідомлення (ми називаємо їх подіями) вашому коду, і ви вирішуєте, як на них реагувати!
До кінця цього уроку ви створите справжню гру на швидкість набору тексту, яка відстежує вашу швидкість і точність. Але найголовніше — ви зрозумієте основні концепції, які лежать в основі кожного інтерактивного вебсайту, яким ви коли-небудь користувалися. Почнемо!
## Тест перед лекцією
[Тест перед лекцією](https://ff-quizzes.netlify.app/web/quiz/21)
## Програмування, орієнтоване на події
Подумайте про ваш улюблений додаток або вебсайт — що робить його живим і чутливим? Все залежить від того, як він реагує на ваші дії! Кожен дотик, клік, свайп або натискання клавіші створює те, що ми називаємо "подією", і саме тут відбувається справжня магія веброзробки.
Ось що робить програмування для вебу таким цікавим: ми ніколи не знаємо, коли хтось натисне ту кнопку або почне вводити текст у текстове поле. Вони можуть натиснути негайно, зачекати п'ять хвилин або взагалі не натискати! Ця непередбачуваність змушує нас думати інакше про те, як ми пишемо код.
Замість того, щоб писати код, який виконується зверху вниз, як рецепт, ми пишемо код, який терпляче чекає, поки щось станеться. Це схоже на те, як телеграфні оператори в 1800-х роках сиділи біля своїх машин, готові відповісти в момент, коли через дріт прийде повідомлення.
Отже, що саме є "подією"? Просто кажучи, це щось, що відбувається! Коли ви натискаєте кнопку — це подія. Коли ви вводите літеру — це подія. Коли ви рухаєте мишкою — це ще одна подія.
Програмування, орієнтоване на події, дозволяє нам налаштувати наш код на прослуховування і реагування. Ми створюємо спеціальні функції, які називаються **слухачами подій**, які терпляче чекають на певні дії, а потім активуються, коли вони відбуваються.
Уявіть слухачів подій як дверний дзвінок для вашого коду. Ви налаштовуєте дверний дзвінок (`addEventListener()`), вказуєте, який звук слухати (наприклад, 'click' або 'keypress'), і потім визначаєте, що має статися, коли хтось дзвонить (ваша власна функція).
**Як працюють слухачі подій:**
- **Слухають** певні дії користувача, такі як кліки, натискання клавіш або рухи миші
- **Виконують** ваш власний код, коли відбувається зазначена подія
- **Реагують** миттєво на взаємодії користувача, створюючи безперервний досвід
- **Обробляють** кілька подій на одному елементі за допомогою різних слухачів
> **NOTE:** Варто зазначити, що існує багато способів створення слухачів подій. Ви можете використовувати анонімні функції або створювати іменовані. Ви можете використовувати різні скорочення, наприклад, встановлювати властивість `click` або використовувати `addEventListener()`. У нашій вправі ми зосередимося на `addEventListener()` і анонімних функціях, оскільки це, мабуть, найпоширеніша техніка, яку використовують веброзробники. Вона також є найгнучкішою, оскільки `addEventListener()` працює для всіх подій, а назва події може бути передана як параметр.
### Поширені події
Хоча веббраузери пропонують десятки різних подій, які ви можете слухати, більшість інтерактивних додатків покладаються лише на кілька основних подій. Розуміння цих основних подій дасть вам основу для створення складних взаємодій з користувачем.
Існує [десятки подій](https://developer.mozilla.org/docs/Web/Events), які ви можете слухати при створенні додатка. Практично будь-яка дія користувача на сторінці викликає подію, що дає вам багато можливостей забезпечити бажаний досвід. На щастя, вам зазвичай потрібна лише невелика кількість подій. Ось кілька поширених (включаючи дві, які ми будемо використовувати при створенні нашої гри):
| Подія | Опис | Типові випадки використання |
|-------|------|-----------------------------|
| `click` | Користувач натиснув на щось | Кнопки, посилання, інтерактивні елементи |
| `contextmenu` | Користувач натиснув праву кнопку миші | Кастомні контекстні меню |
| `select` | Користувач виділив текст | Редагування тексту, операції копіювання |
| `input` | Користувач ввів текст | Валідація форм, пошук у реальному часі |
**Розуміння цих типів подій:**
- **Активуються** при взаємодії користувача з певними елементами на вашій сторінці
- **Надають** детальну інформацію про дію користувача через об'єкти подій
- **Дозволяють** створювати чутливі, інтерактивні вебдодатки
- **Працюють** стабільно на різних браузерах і пристроях
## Створення гри
Тепер, коли ви розумієте, як працюють події, давайте застосуємо ці знання на практиці, створивши щось корисне. Ми створимо гру на швидкість набору тексту, яка демонструє обробку подій і допомагає вам розвинути важливий навик розробника.
Ми створимо гру, щоб дослідити, як працюють події в JavaScript. Наша гра перевірить навички набору тексту гравця, що є одним із найбільш недооцінених навиків, які повинні мати всі розробники. Цікаво: розкладка клавіатури QWERTY, яку ми використовуємо сьогодні, була фактично розроблена в 1870-х роках для друкарських машинок — і хороші навички набору тексту все ще так само цінні для програмістів сьогодні! Загальний хід гри виглядатиме так:
```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
```
**Ось як працюватиме наша гра:**
- **Починається**, коли гравець натискає кнопку старту і відображає випадкову цитату
- **Відстежує** прогрес набору тексту гравця слово за словом у реальному часі
- **Виділяє** поточне слово, щоб направити увагу гравця
- **Надає** миттєвий візуальний зворотний зв'язок для помилок набору тексту
- **Розраховує** і відображає загальний час після завершення цитати
Давайте створимо нашу гру і навчимося працювати з подіями!
### Структура файлів
Перш ніж почати писати код, давайте організуємося! Чиста структура файлів з самого початку заощадить вам багато часу і зробить ваш проект більш професійним. 😊
Ми будемо тримати все просто, використовуючи лише три файли: `index.html` для структури сторінки, `script.js` для всієї логіки гри і `style.css`, щоб зробити все красивим. Це класичне тріо, яке живить більшість вебу!
**Створіть нову папку для вашої роботи, відкривши консоль або термінал і виконавши наступну команду:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Ось що роблять ці команди:**
- **Створюють** новий каталог під назвою `typing-game` для файлів вашого проекту
- **Переходять** до щойно створеного каталогу автоматично
- **Налаштовують** чисте робоче середовище для розробки вашої гри
**Відкрийте Visual Studio Code:**
```bash
code .
```
**Ця команда:**
- **Запускає** Visual Studio Code у поточному каталозі
- **Відкриває** вашу папку проекту в редакторі
- **Надає** доступ до всіх інструментів розробки, які вам знадобляться
**Додайте три файли до папки у Visual Studio Code з наступними назвами:**
- `index.html` - Містить структуру і контент вашої гри
- `script.js` - Обробляє всю логіку гри і слухачі подій
- `style.css` - Визначає візуальний вигляд і стиль
## Створення інтерфейсу користувача
Тепер давайте створимо сцену, де відбуватиметься вся дія нашої гри! Уявіть це як проектування панелі управління для космічного корабля — ми повинні переконатися, що все, що потрібно нашим гравцям, знаходиться там, де вони очікують.
Давайте визначимо, що саме потрібно нашій грі. Якби ви грали в гру на швидкість набору тексту, що б ви хотіли бачити на екрані? Ось що нам потрібно:
| Елемент інтерфейсу | Призначення | HTML-елемент |
|--------------------|-------------|--------------|
| Відображення цитати | Показує текст для набору | `
` з `id="quote"` |
| Область повідомлень | Відображає статус і повідомлення про успіх | `
` з `id="message"` |
| Текстове поле | Місце, де гравці вводять цитату | `` з `id="typed-value"` |
| Кнопка старту | Починає гру | `