# Создание игры с использованием событий
Задумывались ли вы когда-нибудь, как веб-сайты узнают, что вы нажали кнопку или ввели текст в текстовое поле? Это магия событийного программирования! Что может быть лучше для изучения этого важного навыка, чем создание чего-то полезного — игры на скорость набора текста, которая реагирует на каждое ваше нажатие клавиши.
Вы увидите, как веб-браузеры "общаются" с вашим кодом на 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"` |
| Кнопка "Старт" | Начинает игру | `