# Criar um jogo usando eventos
Alguma vez se perguntou como é que os websites sabem quando clica num botão ou escreve numa caixa de texto? Essa é a magia da programação orientada a eventos! Que melhor forma de aprender esta habilidade essencial do que construindo algo útil - um jogo de velocidade de digitação que reage a cada tecla que pressiona.
Vai ver em primeira mão como os navegadores "falam" com o seu código JavaScript. Sempre que clica, escreve ou move o rato, o navegador envia pequenas mensagens (chamamos-lhes eventos) para o seu código, e você decide como responder!
Quando terminarmos esta secção, terá criado um verdadeiro jogo de digitação que acompanha a sua velocidade e precisão. Mais importante, compreenderá os conceitos fundamentais que impulsionam todos os websites interativos que alguma vez usou. Vamos começar!
## Questionário pré-aula
[Questionário pré-aula](https://ff-quizzes.netlify.app/web/quiz/21)
## Programação orientada a eventos
Pense na sua aplicação ou website favorito - o que o torna vivo e responsivo? Tudo depende de como reage ao que faz! Cada toque, clique, deslize ou pressionar de tecla cria aquilo a que chamamos um "evento", e é aí que a verdadeira magia do desenvolvimento web acontece.
Isto é 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 escrever numa caixa de texto. Podem clicar de imediato, esperar cinco minutos, ou até nunca clicar! Esta imprevisibilidade obriga-nos a pensar diferentemente sobre como escrevemos o nosso código.
Em vez de escrever código que corre do topo até ao fundo, como numa receita, escrevemos código que espera pacientemente que algo aconteça. É semelhante a como os operadores de telégrafo nos anos 1800 sentavam-se perto das suas máquinas, prontos para responder no momento em que uma mensagem passasse pelo fio.
Então, o que é exatamente um "evento"? Simplificando, é algo que acontece! Quando clica num botão - isso é um evento. Quando escreve uma letra - isso é um evento. Quando move o rato - é outro evento.
A programação orientada a eventos permite-nos preparar o nosso código para ouvir e responder. Criamos funções especiais chamadas **event listeners** que esperam pacientemente por coisas específicas acontecerem, para depois entrarem em ação.
Pense nos event listeners como se fossem uma campainha para o seu código. Configura a campainha (`addEventListener()`), diz-lhe que som deve ouvir (como um 'click' ou 'keypress'), e especifica o que deve acontecer quando alguém toca (a sua função personalizada).
**Eis como funcionam os event listeners:**
- **Ouvir** ações específicas do utilizador, como cliques, pressionar de teclas ou movimentos do rato
- **Executar** o seu código personalizado quando o evento especificado ocorrer
- **Responder** imediatamente a interações do utilizador, criando uma experiência fluida
- **Gerir** múltiplos eventos no mesmo elemento usando diferentes listeners
> **NOTA:** Vale a pena destacar que existem inúmeras formas de criar event listeners. Pode usar funções anónimas, ou criar funções nomeadas. Pode usar vários atalhos, como definir a propriedade `click`, ou usar `addEventListener()`. No nosso exercício vamos focar-nos em `addEventListener()` e funções anónimas, pois é provavelmente a técnica mais comum entre programadores web. Também é a mais flexível, uma vez que `addEventListener()` funciona para todos os eventos, e o nome do evento pode ser passado como parâmetro.
### Eventos comuns
Embora os navegadores ofereçam dezenas de eventos diferentes que pode ouvir, a maioria das aplicações interativas depende apenas de um pequeno conjunto essencial de eventos. Compreender estes eventos fundamentais dará a base para construir interações sofisticadas com o utilizador.
Existem [dezenas de eventos](https://developer.mozilla.org/docs/Web/Events) disponíveis para ouvir quando cria uma aplicação. Basicamente, tudo o que um utilizador faz numa página gera um evento, o que lhe dá muito poder para garantir que recebem a experiência que deseja. Felizmente, normalmente só precisa de um pequeno conjunto de eventos. Eis alguns comuns (incluindo os dois que usaremos ao criar o nosso jogo):
| Evento | Descrição | Casos de Uso Comuns |
|--------|------------|---------------------|
| `click` | O utilizador clicou em algo | Botões, links, elementos interativos |
| `contextmenu` | O utilizador clicou com o botão direito do rato | Menus de contexto personalizados |
| `select` | O utilizador selecionou texto | Edição de texto, operações de copiar |
| `input` | O utilizador introduziu texto | Validação de formulários, pesquisa em tempo real |
**Compreender estes tipos de eventos:**
- **Disparam** quando os utilizadores interagem com elementos específicos na sua página
- **Fornecem** informação detalhada sobre a ação do utilizador através de objetos evento
- **Permitem** criar aplicações web responsivas e interativas
- **Funcionam** de forma consistente em diferentes navegadores e dispositivos
## Criar o jogo
Agora que entende como os eventos funcionam, vamos colocar esse conhecimento em prática construindo algo útil. Vamos criar um jogo de velocidade de digitação que demonstra o tratamento de eventos enquanto ajuda a desenvolver uma habilidade importante como programador.
Vamos criar um jogo para explorar como os eventos funcionam em JavaScript. O nosso jogo vai testar a habilidade de digitação do jogador, que é uma das competências mais subestimadas e que todos os programadores deveriam ter. Curiosidade: o layout do teclado QWERTY que usamos hoje foi realmente desenhado na década de 1870 para máquinas de escrever - e boas habilidades de digitação continuam a ser tão valiosas para programadores hoje em dia! O fluxo geral do jogo será assim:
```mermaid
flowchart TD
A[Jogador clica Iniciar] --> B[Citação aleatória exibida]
B --> C[Jogador escreve na caixa de texto]
C --> D{Palavra completa?}
D -->|Sim| E[Destaque a próxima palavra]
D -->|Não| F{Correto até agora?}
F -->|Sim| G[Mantenha o estilo normal]
F -->|Não| H[Mostrar estilo de erro]
E --> I{Citação completa?}
I -->|Não| C
I -->|Sim| J[Mostrar mensagem de sucesso com tempo]
G --> C
H --> C
```
**Assim funciona o nosso jogo:**
- **Começa** quando o jogador clica no botão de início e apresenta uma citação aleatória
- **Acompanha** o progresso do jogador palavra a palavra em tempo real
- **Realça** a palavra atual para guiar o foco do jogador
- **Fornece** feedback visual imediato para erros de digitação
- **Calcula** e mostra o tempo total quando a citação está completa
Vamos construir o nosso jogo e aprender sobre eventos!
### Estrutura de ficheiros
Antes de começar a programar, vamos organizar-nos! Ter uma estrutura de ficheiros limpa desde o início vai poupar-lhe dores de cabeça mais tarde e tornar o seu projeto mais profissional. 😊
Vamos simplificar e usar apenas três ficheiros: `index.html` para a estrutura da página, `script.js` para toda a lógica do jogo, e `style.css` para deixar tudo com um aspeto ótimo. Este é o trio clássico que alimenta a maior parte da web!
**Crie uma nova pasta para o seu trabalho abrindo uma consola ou terminal e execute o seguinte comando:**
```bash
# Linux ou macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Isto é o que estes comandos fazem:**
- **Cria** um novo diretório chamado `typing-game` para os ficheiros do projeto
- **Navega** automaticamente para dentro do diretório criado
- **Configura** um espaço de trabalho limpo para o seu desenvolvimento de jogo
**Abra o Visual Studio Code:**
```bash
code .
```
**Este comando:**
- **Lança** o Visual Studio Code no diretório atual
- **Abre** a sua pasta de projeto no editor
- **Fornece** acesso a todas as ferramentas de desenvolvimento necessárias
**Adicione três ficheiros à pasta no Visual Studio Code com os seguintes nomes:**
- `index.html` - Contém a estrutura e conteúdo do seu jogo
- `script.js` - Gerir toda a lógica do jogo e os event listeners
- `style.css` - Define o aspeto visual e o estilo
## Criar a interface do utilizador
Agora vamos construir o palco onde toda a ação do nosso jogo vai acontecer! Pense nisto como desenhar o painel de controlo de uma nave espacial - precisamos garantir que tudo o que os jogadores precisam está exatamente onde esperam.
Vamos perceber o que o nosso jogo realmente necessita. Se estivesse a jogar um jogo de digitação, o que gostaria de ver no ecrã? Eis o que vamos precisar:
| Elemento UI | Propósito | Elemento HTML |
|-------------|-----------|--------------|
| Exibição da citação | Mostra o texto a digitar | `
` com `id="quote"` |
| Área de mensagem | Exibe mensagens de estado e sucesso | `
` com `id="message"` |
| Caixa de texto | Onde os jogadores escrevem a citação | `` com `id="typed-value"` |
| Botão de início | Começa o jogo | `