# Създаване на игра с използване на събития
Чудили ли сте се някога как уебсайтовете разбират, когато кликнете върху бутон или въведете текст в текстово поле? Това е магията на програмирането, базирано на събития! Какъв по-добър начин да научите това основно умение от това да създадете нещо полезно - игра за скорост на писане, която реагира на всяко натискане на клавиш.
Ще видите от първа ръка как уеб браузърите "говорят" с вашия 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"` |
| Бутон за старт | Започва играта | `