# Crear un juego usando eventos
¿Alguna vez te has preguntado cómo saben los sitios web cuándo haces clic en un botón o escribes en un cuadro de texto? ¡Esa es la magia de la programación orientada a eventos! ¿Qué mejor manera de aprender esta habilidad esencial que construyendo algo útil: un juego de velocidad de escritura que reacciona a cada pulsación de tecla que haces?
Vas a ver de primera mano cómo los navegadores web "hablan" con tu código JavaScript. Cada vez que haces clic, escribes o mueves el ratón, el navegador envía pequeños mensajes (los llamamos eventos) a tu código, ¡y tú decides cómo responder!
Cuando terminemos aquí, habrás construido un juego real de mecanografía que rastrea tu velocidad y precisión. Más importante aún, comprenderás los conceptos fundamentales que impulsan todos los sitios web interactivos que alguna vez has usado. ¡Vamos a sumergirnos!
## Cuestionario previo a la clase
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Programación orientada a eventos
Piensa en tu aplicación o sitio web favorito: ¿qué hace que se sienta vivo y receptivo? ¡Todo se trata de cómo reacciona a lo que haces! Cada toque, clic, deslizamiento o pulsación de tecla crea lo que llamamos un "evento", y ahí es donde sucede la verdadera magia del desarrollo web.
Esto es lo que hace que programar para la web sea tan interesante: nunca sabemos cuándo alguien hará clic en ese botón o empezará a escribir en un cuadro de texto. ¡Puede que hagan clic de inmediato, esperen cinco minutos o tal vez nunca hagan clic! Esta imprevisibilidad significa que necesitamos pensar de forma diferente sobre cómo escribir nuestro código.
En lugar de escribir código que se ejecute de arriba a abajo como una receta, escribimos código que se sienta pacientemente esperando a que algo suceda. Es similar a cómo los operadores de telégrafo en el siglo XIX se sentaban junto a sus máquinas, listos para responder en el momento en que llegara un mensaje por cable.
Entonces, ¿qué es exactamente un "evento"? Simplemente, ¡es algo que sucede! Cuando haces clic en un botón, ese es un evento. Cuando escribes una letra, ese es un evento. Cuando mueves el ratón, ese es otro evento.
La programación orientada a eventos nos permite configurar nuestro código para escuchar y responder. Creamos funciones especiales llamadas **escuchas de eventos (event listeners)** que esperan pacientemente a que sucedan cosas específicas, y luego saltan a la acción cuando ocurren.
Piensa en los escuchas de eventos como tener un timbre para tu código. Configuras el timbre (`addEventListener()`), le dices a qué sonido debe escuchar (como un 'click' o 'keypress'), y luego especificas qué debe suceder cuando alguien lo toca (tu función personalizada).
**Así es como funcionan los escuchas de eventos:**
- **Escuchan** acciones específicas del usuario como clics, pulsaciones de tecla o movimientos del ratón
- **Ejecutan** tu código personalizado cuando ocurre el evento especificado
- **Responden** inmediatamente a las interacciones del usuario, creando una experiencia fluida
- **Manejan** múltiples eventos en el mismo elemento usando diferentes escuchas
> **NOTA:** Vale la pena destacar que existen muchas maneras de crear escuchas de eventos. Puedes usar funciones anónimas o crear funciones con nombre. Puedes usar varios accesos directos, como establecer la propiedad `click`, o usar `addEventListener()`. En nuestro ejercicio nos vamos a enfocar en `addEventListener()` y funciones anónimas, ya que probablemente es la técnica más común que usan los desarrolladores web. También es la más flexible, pues `addEventListener()` funciona para todos los eventos, y el nombre del evento puede proporcionarse como un parámetro.
### Eventos comunes
Aunque los navegadores web ofrecen docenas de eventos diferentes para escuchar, la mayoría de las aplicaciones interactivas dependen sólo de un puñado de eventos esenciales. Comprender estos eventos básicos te dará la base para construir interacciones sofisticadas de usuario.
Hay [docenas de eventos](https://developer.mozilla.org/docs/Web/Events) disponibles para que escuches cuando creas una aplicación. Básicamente, cualquier cosa que un usuario haga en una página genera un evento, lo que te da mucho poder para asegurar que tengan la experiencia que deseas. Afortunadamente, normalmente sólo necesitarás un pequeño grupo de eventos. Aquí algunos comunes (incluyendo los dos que usaremos para crear nuestro juego):
| Evento | Descripción | Casos de uso comunes |
|--------|-------------|--------------------|
| `click` | El usuario hizo clic en algo | Botones, enlaces, elementos interactivos |
| `contextmenu` | El usuario hizo clic con el botón derecho del ratón | Menús contextuales personalizados |
| `select` | El usuario destacó algo de texto | Edición de texto, operaciones de copiar |
| `input` | El usuario ingresó texto | Validación de formularios, búsqueda en tiempo real |
**Entendiendo estos tipos de eventos:**
- **Se activan** cuando los usuarios interactúan con elementos específicos en la página
- **Proporcionan** información detallada sobre la acción del usuario a través de objetos de evento
- **Te permiten** crear aplicaciones web interactivas y receptivas
- **Funcionan** consistentemente en diferentes navegadores y dispositivos
## Creando el juego
Ahora que entiendes cómo funcionan los eventos, pongamos ese conocimiento en práctica creando algo útil. Vamos a crear un juego de velocidad de escritura que demuestre el manejo de eventos mientras te ayuda a desarrollar una habilidad importante para los desarrolladores.
Vamos a crear un juego para explorar cómo funcionan los eventos en JavaScript. Nuestro juego probará la habilidad de escritura del jugador, que es una de las habilidades más subestimadas que todo desarrollador debería tener. Dato curioso: el diseño del teclado QWERTY que usamos hoy en día fue diseñado en la década de 1870 para máquinas de escribir, y ¡las buenas habilidades de escritura siguen siendo igual de valiosas para los programadores hoy! El flujo general del juego será así:
```mermaid
flowchart TD
A[El jugador hace clic en Iniciar] --> B[Cita aleatoria se muestra]
B --> C[El jugador escribe en el cuadro de texto]
C --> D{¿Palabra completa?}
D -->|Sí| E[Resaltar la siguiente palabra]
D -->|No| F{¿Correcto hasta ahora?}
F -->|Sí| G[Mantener el estilo normal]
F -->|No| H[Mostrar estilo de error]
E --> I{¿Cita completa?}
I -->|No| C
I -->|Sí| J[Mostrar mensaje de éxito con tiempo]
G --> C
H --> C
```
**Así funcionará nuestro juego:**
- **Comienza** cuando el jugador hace clic en el botón de inicio y muestra una cita aleatoria
- **Rastrea** el progreso de escritura del jugador palabra por palabra en tiempo real
- **Resalta** la palabra actual para guiar la concentración del jugador
- **Proporciona** retroalimentación visual inmediata para errores de mecanografía
- **Calcula** y muestra el tiempo total cuando se completa la cita
¡Construyamos nuestro juego y aprendamos sobre eventos!
### Estructura de archivos
Antes de empezar a programar, ¡pongámonos organizados! Tener una estructura de archivos limpia desde el principio te ahorrará dolores de cabeza más adelante y hará que tu proyecto luzca más profesional. 😊
Vamos a mantenerlo simple con sólo tres archivos: `index.html` para la estructura de la página, `script.js` para toda la lógica del juego, y `style.css` para hacer que todo luzca genial. ¡Este es el trío clásico que impulsa la mayoría de la web!
**Crea una carpeta nueva para tu trabajo abriendo una consola o terminal y ejecutando el siguiente comando:**
```bash
# Linux o macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Esto es lo que hacen estos comandos:**
- **Crea** un nuevo directorio llamado `typing-game` para los archivos de tu proyecto
- **Navega** automáticamente al directorio recién creado
- **Configura** un espacio de trabajo limpio para el desarrollo de tu juego
**Abre Visual Studio Code:**
```bash
code .
```
**Este comando:**
- **Inicia** Visual Studio Code en el directorio actual
- **Abre** la carpeta del proyecto en el editor
- **Proporciona** acceso a todas las herramientas de desarrollo que necesitarás
**Agrega tres archivos a la carpeta en Visual Studio Code con los siguientes nombres:**
- `index.html` - Contiene la estructura y contenido del juego
- `script.js` - Maneja toda la lógica del juego y los escuchas de eventos
- `style.css` - Define la apariencia visual y el estilo
## Crear la interfaz de usuario
Ahora construyamos el escenario donde sucederá toda la acción de nuestro juego. Piensa en esto como diseñar el panel de control de una nave espacial: tenemos que asegurarnos que todo lo que nuestros jugadores necesiten esté justo donde esperan.
Vamos a definir qué necesita nuestro juego. Si estuvieras jugando un juego de mecanografía, ¿qué te gustaría ver en la pantalla? Esto es lo que necesitaremos:
| Elemento UI | Propósito | Elemento HTML |
|-------------|-----------|--------------|
| Visualizador de la cita | Muestra el texto a escribir | `
` con `id="quote"` |
| Área de mensajes | Muestra estados y mensajes de éxito | `
` con `id="message"` |
| Entrada de texto | Donde los jugadores escriben la cita | `` con `id="typed-value"` |
| Botón de inicio | Comienza el juego | `