Un juego de memoria interactivo desarrollado con React y TypeScript que utiliza personajes de la serie Rick and Morty. Los jugadores deben encontrar parejas de cartas mientras compiten por el menor número de turnos.
El proyecto está estructurado siguiendo el patrón Atomic Design lo que proporciona una organización escalable y mantenible:
src/
├── components/
│ ├── atoms/ # Componentes básicos reutilizables
│ ├── molecules/ # Combinaciones de átomos
│ └── organisms/ # Componentes complejos de negocio
│
├── hooks/ # Custom hooks para lógica de negocio
├── services/ # Capa de servicios para APIs
├── adapters/ # Adaptadores para APIs externas
├── contexts/ # Contextos de React para estado global
├── types/ # Definiciones de TypeScript
└── utils/ # Utilidades y helpers
- Separación de Responsabilidades: Cada capa tiene una responsabilidad específica
- Composición sobre Herencia: Uso extensivo de composition patterns
- Type Safety: TypeScript estricto en toda la aplicación
- Performance First: Optimizaciones de rendering y caching
- Accesibilidad: Componentes accesibles con ARIA labels y navegación por teclado
React Query (@tanstack/react-query) fue elegido por las siguientes razones:
- Gestión de Estado del Servidor: Maneja automáticamente el estado de las peticiones HTTP (loading, error, success)
- Caching Inteligente: Cache automático con invalidación y revalidación
- Optimistic Updates: Actualizaciones optimistas para mejor UX
- Background Refetching: Refresco automático de datos en background
- Error Handling: Manejo robusto de errores con retry automático
// Configuración optimizada en App.tsx
const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: 3, // 3 reintentos automáticos
staleTime: 5 * 60 * 1000, // 5 minutos de datos frescos
gcTime: 10 * 60 * 1000, // 10 minutos en cache
refetchOnWindowFocus: false, // No refetch al cambiar focus
},
},
});El hook useMemoryGame encapsula toda la lógica compleja del juego:
- Separación de Responsabilidades: Separa lógica de UI de lógica de negocio
- Reutilización: Puede ser usado en diferentes componentes
- Testing: Fácil de testear de forma aislada
- Estado Complejo: Maneja múltiples estados interdependientes
// Características principales del hook:
- Estado del juego (cartas, movimientos, tiempo)
- Lógica de emparejamiento de cartas
- Temporizadores y delays
- Sistema de puntuación
- Gestión de estados de loading- Button: Botón reutilizable con variantes y estados
- Input: Campo de entrada con validación
- CharacterCard: Carta de personaje con animaciones 3D
- LoginForm: Formulario de autenticación completo
- MemoryGame: Componente principal del juego
TypeScript proporciona:
- Type Safety: Prevención de errores en tiempo de compilación
- IntelliSense: Autocompletado mejorado
- Refactoring Seguro: Cambios seguros en toda la aplicación
- Documentación Viva: Los tipos sirven como documentación
La aplicación implementa un sistema de autenticación mock con persistencia:
- Context API:
AuthContextmaneja el estado global de autenticación - localStorage: Persiste token y datos de usuario
- Validación: Validación de tokens y estructura de datos
- Recuperación Automática: Restaura sesión al recargar la página
// Flujo de autenticación:
1. Usuario ingresa credenciales
2. authenticateUser() simula llamada a API
3. Datos se guardan en localStorage
4. Context actualiza estado global
5. Al recargar, se recupera automáticamente la sesión- Validación de Tokens: Verificación de formato y estructura
- Sanitización: Limpieza de datos de entrada
- Error Handling: Manejo seguro de datos corruptos
- Logout Seguro: Limpieza completa de datos de sesión
- Node.js 18+
- pnpm (recomendado) o npm/yarn
# 1. Clonar el repositorio
git clone <repository-url>
cd RickAndMortyGame
# 2. Instalar dependencias
pnpm install
# 3. Ejecutar en modo desarrollo
pnpm dev
# 4. Abrir navegador en http://localhost:5173pnpm dev # Servidor de desarrollo
pnpm build # Build para producción
pnpm preview # Preview del build
pnpm lint # Linting con ESLintEl sistema de autenticación es mock, acepta cualquier credencial con:
- Usuario: mínimo 3 caracteres
- Contraseña: mínimo 4 caracteres
Ejemplos válidos:
- Usuario:
rick, Contraseña:1234 - Usuario:
morty, Contraseña:portal
- Autenticación: Sistema de login con tokens
- Barajado Inicial: Cartas mezcladas al iniciar
- Revelación Inicial: 3 segundos de visualización
- Comparación de Cartas: Lógica de emparejamiento
- Feedback Visual: Animaciones para aciertos/errores
- Contador de Turnos: Tracking de movimientos
- Pantalla de Victoria: Mensaje con estadísticas
- Controles de Juego: Repetir e Inicio
- Animaciones 3D: Efecto flip en cartas con CSS transforms
- Sistema de Estados: Loading, error y success states
- Responsive Design: Adaptable a móvil y desktop
- Accesibilidad: ARIA labels y navegación por teclado
- Optimización: Lazy loading de imágenes
- Error Boundaries: Manejo robusto de errores
- Performance: Memoización y optimizaciones de React
-
Niveles de Dificultad
interface GameLevel { name: string; cardCount: number; timeLimit?: number; revealTime: number; }
-
Sistema de Puntuación
- Puntos basados en tiempo y movimientos
- Multiplicadores por streaks
- Bonificaciones por tiempo
-
Power-ups
- Revelar carta temporalmente
- Eliminar cartas incorrectas
- Tiempo extra
-
Testing
// Implementar testing completo - Unit tests con Vitest - Integration tests con Testing Library - E2E tests con Playwright
-
Performance
- Service Worker para cache
- Virtual scrolling para listas grandes
- Preloading de imágenes
-
Accesibilidad
- Screen reader support mejorado
- Navegación completa por teclado
- Temas de alto contraste
-
Internacionalización
- Múltiples idiomas
- Formatos de fecha/hora locales
- RTL support
-
Temas Personalizables
- Múltiples paletas de colores
- Modo oscuro/claro
- Temas basados en episodios
-
Animaciones Avanzadas
- Transiciones más fluidas
- Efectos de partículas
- Feedback háptico (móvil)
-
Personalización
- Avatares de usuario
- Selección de personajes favoritos
- Configuración de sonidos
| Tecnología | Versión | Propósito |
|---|---|---|
| React | 19.1.0 | Framework UI |
| TypeScript | 5.8.3 | Type Safety |
| React Query | 5.84.1 | Estado del Servidor |
| Tailwind CSS | 4.1.11 | Estilos |
| Vite | 7.0.4 | Build Tool |
| React Router | 7.7.1 | Routing |
Este proyecto demuestra un enfoque profesional al desarrollo de aplicaciones React, incorporando:
- Arquitectura Escalable: Atomic Design + Clean Architecture
- Type Safety: TypeScript en toda la aplicación
- Performance: Optimizaciones y caching inteligente
- UX Excellence: Animaciones fluidas y feedback inmediato
- Código Mantenible: Separación clara de responsabilidades
El resultado es una aplicación robusta, performante y escalable que cumple todos los requisitos técnicos mientras proporciona una experiencia de usuario excepcional.
Desarrollado con 💚 por JP usando React, TypeScript y la API de Rick and Morty
