# Создание игры с использованием событий
Задумывались ли вы, как сайты узнают, что вы нажали кнопку или ввели текст в поле? Это магия событийного программирования! Что может быть лучше для изучения этого важного навыка, чем создание чего-то полезного — игры на скорость набора текста, которая реагирует на каждое ваше нажатие клавиши.
Вы увидите своими глазами, как веб-браузеры "общаются" с вашим кодом на JavaScript. Каждый раз, когда вы кликаете, вводите текст или перемещаете мышь, браузер отправляет маленькие сообщения (мы называем их событиями) вашему коду, а вы решаете, как на них реагировать!
Когда мы закончим, у вас будет настоящая игра на скорость набора текста, которая отслеживает вашу скорость и точность. Но что еще важнее, вы поймете основные концепции, которые лежат в основе каждого интерактивного сайта, который вы когда-либо использовали. Давайте начнем!
## Тест перед лекцией
[Тест перед лекцией](https://ff-quizzes.netlify.app/web/quiz/21)
## Событийное программирование
Подумайте о своем любимом приложении или сайте — что делает его живым и отзывчивым? Все дело в том, как он реагирует на ваши действия! Каждый тап, клик, свайп или нажатие клавиши создают то, что мы называем "событием", и именно здесь начинается настоящая магия веб-разработки.
Вот что делает программирование для веба таким интересным: мы никогда не знаем, когда кто-то нажмет эту кнопку или начнет вводить текст в поле. Это может произойти сразу, через пять минут или вообще никогда! Такая непредсказуемость заставляет нас иначе подходить к написанию кода.
Вместо того чтобы писать код, который выполняется сверху вниз, как рецепт, мы пишем код, который терпеливо ждет, пока что-то произойдет. Это похоже на то, как телеграфисты в XIX веке сидели у своих аппаратов, готовые ответить в момент получения сообщения.
Так что же такое "событие"? Проще говоря, это то, что происходит! Когда вы нажимаете кнопку — это событие. Когда вы вводите букву — это событие. Когда вы перемещаете мышь — это еще одно событие.
Событийное программирование позволяет нам настроить код на прослушивание и реакцию. Мы создаем специальные функции, называемые **обработчиками событий**, которые терпеливо ждут определенных действий, а затем начинают действовать, когда они происходят.
Представьте обработчики событий как дверной звонок для вашего кода. Вы устанавливаете дверной звонок (`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"` |
| Кнопка "Старт" | Начинает игру | `