# Criando um jogo usando eventos
Já se perguntou como os sites sabem quando você clica em um botão ou digita em uma caixa de texto? Isso é a mágica da programação orientada a eventos! E que melhor maneira de aprender essa habilidade essencial do que construindo algo útil - um jogo de velocidade de digitação que reage a cada tecla que você pressiona.
Você verá de perto como os navegadores "conversam" com seu código JavaScript. Cada vez que você clica, digita ou move o mouse, o navegador envia pequenas mensagens (chamadas de eventos) para o seu código, e você decide como responder!
Quando terminarmos aqui, você terá construído um jogo de digitação real que rastreia sua velocidade e precisão. Mais importante, você entenderá os conceitos fundamentais que impulsionam todos os sites interativos que você já usou. Vamos começar!
## Quiz Pré-Aula
[Quiz pré-aula](https://ff-quizzes.netlify.app/web/quiz/21)
## Programação orientada a eventos
Pense no seu aplicativo ou site favorito - o que o torna vivo e responsivo? É tudo sobre como ele reage ao que você faz! Cada toque, clique, deslizar ou pressionar de tecla cria o que chamamos de "evento", e é aí que a verdadeira mágica do desenvolvimento web acontece.
Aqui está o que torna a programação para a web tão interessante: nunca sabemos quando alguém vai clicar naquele botão ou começar a digitar em uma caixa de texto. Eles podem clicar imediatamente, esperar cinco minutos ou talvez nunca clicar! Essa imprevisibilidade significa que precisamos pensar de forma diferente sobre como escrevemos nosso código.
Em vez de escrever um código que é executado de cima para baixo como uma receita, escrevemos um código que fica pacientemente esperando algo acontecer. É semelhante a como os operadores de telégrafo no século XIX ficavam ao lado de suas máquinas, prontos para responder no momento em que uma mensagem chegava pelo fio.
Então, o que exatamente é um "evento"? Simplificando, é algo que acontece! Quando você clica em um botão - isso é um evento. Quando você digita uma letra - isso é um evento. Quando você move o mouse - isso é outro evento.
A programação orientada a eventos nos permite configurar nosso código para ouvir e responder. Criamos funções especiais chamadas **event listeners** que esperam pacientemente por coisas específicas acontecerem e entram em ação quando isso ocorre.
Pense nos event listeners como se fossem uma campainha para o seu código. Você configura a campainha (`addEventListener()`), diz a ela qual som ouvir (como um 'click' ou 'keypress') e, em seguida, especifica o que deve acontecer quando alguém tocar a campainha (sua função personalizada).
**Como os event listeners funcionam:**
- **Escutam** ações específicas do usuário, como cliques, pressionamentos de tecla ou movimentos do mouse
- **Executam** seu código personalizado quando o evento especificado ocorre
- **Respondem** imediatamente às interações do usuário, criando uma experiência contínua
- **Gerenciam** múltiplos eventos no mesmo elemento usando diferentes listeners
> **NOTE:** Vale destacar que existem várias maneiras de criar event listeners. Você pode usar funções anônimas ou criar funções nomeadas. Pode usar atalhos, como definir a propriedade `click`, ou usar `addEventListener()`. No nosso exercício, vamos focar em `addEventListener()` e funções anônimas, pois é provavelmente a técnica mais comum usada por desenvolvedores web. Também é a mais flexível, já que `addEventListener()` funciona para todos os eventos, e o nome do evento pode ser fornecido como um parâmetro.
### Eventos comuns
Embora os navegadores da web ofereçam dezenas de eventos diferentes para você ouvir, a maioria das aplicações interativas depende de apenas um punhado de eventos essenciais. Compreender esses eventos principais lhe dará a base para construir interações sofisticadas com o usuário.
Existem [dezenas de eventos](https://developer.mozilla.org/docs/Web/Events) disponíveis para você ouvir ao criar uma aplicação. Basicamente, qualquer coisa que um usuário faz em uma página gera um evento, o que lhe dá muito poder para garantir que eles tenham a experiência desejada. Felizmente, você normalmente precisará de apenas alguns eventos. Aqui estão alguns comuns (incluindo os dois que usaremos ao criar nosso jogo):
| Evento | Descrição | Casos de Uso Comuns |
|--------|-----------|---------------------|
| `click` | O usuário clicou em algo | Botões, links, elementos interativos |
| `contextmenu` | O usuário clicou com o botão direito do mouse | Menus de clique direito personalizados |
| `select` | O usuário destacou algum texto | Edição de texto, operações de cópia |
| `input` | O usuário inseriu algum texto | Validação de formulários, busca em tempo real |
**Compreendendo esses tipos de eventos:**
- **Disparam** quando os usuários interagem com elementos específicos na sua página
- **Fornecem** informações detalhadas sobre a ação do usuário por meio de objetos de evento
- **Permitem** criar aplicações web responsivas e interativas
- **Funcionam** de forma consistente em diferentes navegadores e dispositivos
## Criando o jogo
Agora que você entende como os eventos funcionam, vamos colocar esse conhecimento em prática criando algo útil. Vamos criar um jogo de velocidade de digitação que demonstra o manuseio de eventos enquanto ajuda você a desenvolver uma habilidade importante como desenvolvedor.
Vamos criar um jogo para explorar como os eventos funcionam no JavaScript. Nosso jogo testará a habilidade de digitação de um jogador, que é uma das habilidades mais subestimadas que todos os desenvolvedores deveriam ter. Curiosidade: o layout do teclado QWERTY que usamos hoje foi projetado na década de 1870 para máquinas de escrever - e boas habilidades de digitação ainda são tão valiosas para programadores hoje! O fluxo geral do jogo será assim:
```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
```
**Como nosso jogo funcionará:**
- **Começa** quando o jogador clica no botão de início e exibe uma frase aleatória
- **Acompanha** o progresso de digitação do jogador palavra por palavra em tempo real
- **Destaca** a palavra atual para guiar o foco do jogador
- **Fornece** feedback visual imediato para erros de digitação
- **Calcula** e exibe o tempo total quando a frase é concluída
Vamos construir nosso jogo e aprender sobre eventos!
### Estrutura de arquivos
Antes de começarmos a codificar, vamos nos organizar! Ter uma estrutura de arquivos limpa desde o início economizará dores de cabeça mais tarde e tornará seu projeto mais profissional. 😊
Vamos manter as coisas simples com apenas três arquivos: `index.html` para a estrutura da página, `script.js` para toda a lógica do jogo e `style.css` para deixar tudo bonito. Este é o trio clássico que impulsiona a maior parte da web!
**Crie uma nova pasta para seu trabalho abrindo um console ou terminal e emitindo o seguinte comando:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**O que esses comandos fazem:**
- **Cria** um novo diretório chamado `typing-game` para os arquivos do seu projeto
- **Navega** automaticamente para o diretório recém-criado
- **Configura** um espaço de trabalho limpo para o desenvolvimento do seu jogo
**Abra o Visual Studio Code:**
```bash
code .
```
**Este comando:**
- **Inicia** o Visual Studio Code no diretório atual
- **Abre** sua pasta de projeto no editor
- **Fornece** acesso a todas as ferramentas de desenvolvimento necessárias
**Adicione três arquivos à pasta no Visual Studio Code com os seguintes nomes:**
- `index.html` - Contém a estrutura e o conteúdo do seu jogo
- `script.js` - Lida com toda a lógica do jogo e os event listeners
- `style.css` - Define a aparência visual e o estilo
## Criar a interface do usuário
Agora vamos construir o palco onde toda a ação do nosso jogo acontecerá! Pense nisso como projetar o painel de controle de uma nave espacial - precisamos garantir que tudo o que nossos jogadores precisam esteja exatamente onde eles esperam.
Vamos descobrir o que nosso jogo realmente precisa. Se você estivesse jogando um jogo de digitação, o que gostaria de ver na tela? Aqui está o que precisaremos:
| Elemento da UI | Propósito | Elemento HTML |
|----------------|-----------|---------------|
| Exibição de Frase | Mostra o texto para digitar | `
` com `id="quote"` |
| Área de Mensagem | Exibe mensagens de status e sucesso | `
` com `id="message"` |
| Entrada de Texto | Onde os jogadores digitam a frase | `` com `id="typed-value"` |
| Botão de Início | Inicia o jogo | `