# Създаване на игра с използване на събития
Замисляли ли сте се някога как сайтовете разбират кога кликнете върху бутон или напишете нещо в текстово поле? Това е магията на събитийно ориентираното програмиране! Какъв по-добър начин да научите този важен умение, от това да създадете нещо полезно - игра за бързина на писане, която реагира на всеки натиснат клавиш.
Ще видите на живо как уеб браузърите "комуникират" с вашия JavaScript код. Всеки път, когато кликнете, напишете или преместите мишката, браузърът изпраща малки съобщения (наричаме ги събития) към вашия код и вие решавате как да отговорите!
Когато приключим тук, ще сте създали истинска игра за писане, която проследява скоростта и точността ви. Още по-важното е, че ще разберете фундаменталните концепции, които задвижват всеки интерактивен уеб сайт, който някога сте ползвали. Хайде да започваме!
## Предварителен тест пред лекцията
[Предварителен тест пред лекцията](https://ff-quizzes.netlify.app/web/quiz/21)
## Програмиране, ориентирано към събития
Помислете за любимото си приложение или сайт - какво го кара да се чувства жив и отзивчив? Всичко е в това как реагира на вашите действия! Всеки клик, докосване, плъзгане или натискане на клавиш създава нещо, което наричаме "събитие", и тук се случва истинската магия на уеб разработката.
Ето какво прави програмирането за уеб толкова интересно: никога не знаем кога някой ще кликне бутона или ще започне да пише в текстовото поле. Може да кликне веднага, да изчака пет минути или може никога да не кликне! Тази непредсказуемост ни кара да мислим по различен начин как да пишем кода си.
Вместо да пишем код, който се изпълнява отгоре надолу като рецепта, ние пишем код, който търпеливо чака нещо да се случи. Това е подобно на начина, по който телеграфните оператори през 1800-те сядат до машините си, готови да реагират веднага щом през жицата премине съобщение.
Какво всъщност е "събитие"? Просто казано, това е нещо, което се случва! Когато кликнете върху бутон - това е събитие. Когато натиснете клавиш - това е събитие. Когато преместите мишката - това е друго събитие.
Програмирането, ориентирано към събития, ни позволява да настроим кода си да слуша и реагира. Създаваме специални функции, наречени **слушатели на събития** (event listeners), които търпеливо чакат специфични неща да се случат и веднага се задействат, когато това стане.
Мислете за слушателите на събития като звънец за вашия код. Вие настройвате звънеца (`addEventListener()`), казвате му за какъв звук да слуша (например 'click' или 'keypress'), и след това посочвате какво да се случи, когато някой звънне (вашата персонализирана функция).
**Ето как работят слушателите на събития:**
- **Слушат** за специфични действия на потребителя като кликове, натискане на клавиши или движение на мишката
- **Изпълняват** вашия код веднага, когато настъпи посоченото събитие
- **Реагират** мигновено на действията на потребителя, създавайки плавно преживяване
- **Обработват** множество събития на един и същ елемент чрез различни слушатели
> **ЗАБЕЛЕЖКА:** Струва си да се отбележи, че има много начини за създаване на слушатели на събития. Можете да използвате анонимни функции или да създадете именувани. Можете да използвате разнообразни кратки начини като настройване на свойството `click` или чрез `addEventListener()`. В нашето упражнение ще се фокусираме върху `addEventListener()` и анонимни функции, тъй като това е вероятно най-често използваната техника от уеб разработчиците. Освен това е най-гъвкавата, защото `addEventListener()` работи с всички събития и името на събитието може да се подаде като параметър.
### Често използвани събития
Въпреки че уеб браузърите предлагат десетки различни събития, на които можете да слушате, повечето интерактивни приложения разчитат само на няколко основни. Разбирането на тези основни събития ще ви даде основата за изграждане на по-сложни взаимодействия с потребителите.
Има [десетки събития](https://developer.mozilla.org/docs/Web/Events), към които можете да се прикачите при създаването на приложение. Почти всичко, което потребителят прави на страница, повдига събитие, което ви дава голяма възможност да осигурите нужния опит. За щастие, обикновено ви трябват само няколко събития. Ето някои често използвани (включително тези, които ще ползваме в нашата игра):
| Събитие | Описание | Често използвани случаи |
|---------|----------|------------------------|
| `click` | Потребителят кликна върху нещо | Бутони, линкове, интерактивни елементи |
| `contextmenu` | Потребителят кликна с десен бутон на мишката | Персонализирани менюта с десен бутон |
| `select` | Потребителят избра текст | Редактиране на текст, копиране |
| `input` | Потребителят въведе текст | Валидация на форми, търсене в реално време |
**Разбиране на тези типове събития:**
- **Се задействат**, когато потребителите взаимодействат със специфични елементи на страницата
- **Осигуряват** подробна информация за действието на потребителя чрез обекти на събитието
- **Позволяват** създаването на отзивчиви и интерактивни уеб приложения
- **Работят** постоянно на различни браузъри и устройства
## Създаване на играта
Сега, когато разбирате как работят събитията, нека приложим това знание като създадем нещо полезно. Ще направим игра за скорост на писане, която демонстрира обработката на събития и помага да развиете важни умения за разработчици.
Ще създадем игра, за да изследваме как работят събитията в JavaScript. Наша игра ще тества умението за писане на играча – една от най-пренебрегваните способности, които всеки разработчик трябва да притежава. Забавен факт: клавиатурната подредба QWERTY, която използваме днес, всъщност е проектирана през 1870-те за пишещи машини – и добрите умения за писане са също толкова ценни и за програмистите днес! Общият ход на играта ще изглежда така:
```mermaid
flowchart TD
A[Играчът натиска Старт] --> B[Показва се случаен цитат]
B --> C[Играчът пише в текстовото поле]
C --> D{Дума завършена?}
D -->|Да| E[Издели следващата дума]
D -->|Не| F{Досега правилно?}
F -->|Да| G[Запази нормалния стил]
F -->|Не| H[Покажи стила за грешка]
E --> I{Цитатът завършен?}
I -->|Не| C
I -->|Да| J[Покажи съобщение за успех с време]
G --> C
H --> C
```
**Ето как ще работи нашата игра:**
- **Започва** когато играчът натисне бутона за старт и показва произволен цитат
- **Проследява** напредъка на писане на играча дума по дума в реално време
- **Подчертава** текущата дума, за да насочи фокуса на играча
- **Осигурява** незабавна визуална обратна връзка при грешки в писането
- **Изчислява** и показва общото време след завършване на цитата
Нека създадем играта си и научим повече за събитията!
### Структура на файловете
Преди да започнем да пишем код, нека се организираме! Имате ли чиста структура на файловете от самото начало, това ще ви спести главоболия по-късно и ще направи проекта ви по-професионален. 😊
Ще поддържаме нещата прости с три файла: `index.html` за структурата на страницата, `script.js` за логиката на играта и `style.css` за оформлението. Това е класическото трио, което движи почти целия уеб!
**Създайте нова папка за работата си, като отворите конзола или терминал и изпълните следната команда:**
```bash
# Linux или 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` - Определя визуалното оформление и стила
## Създаване на потребителския интерфейс
Сега нека построим сцената, на която ще се случва цялото действие в играта! Представете си го като проектиране на контролен панел за космически кораб – трябва да сме сигурни, че всичко, от което играчите се нуждаят, е точно там, където го очакват.
Да разберем от какво всъщност се нуждае нашата игра. Ако играехте игра за писане, какво бихте искали да виждате на екрана? Ето какво ще ни трябва:
| UI елемент | Цел | HTML елемент |
|------------|-----|--------------|
| Показване на цитат | Показва текста за писане | `
` с `id="quote"` |
| Област за съобщения | Показва статус и съобщения за успех | `
` с `id="message"` |
| Текстово поле | Където играчите пишат цитата | `` с `id="typed-value"` |
| Бутон старт | Започва играта | `