🎮 Descripción del Proyecto#
XO - Destino Final es un juego interactivo de tres en raya (Tic-Tac-Toe) con una temática gótica y oscura. Desarrollado completamente con JavaScript vanilla, HTML5 y CSS3, demuestra competencias avanzadas en manipulación del DOM, lógica de juego, algoritmos de detección de victorias y manejo de eventos del navegador.
🎯 Objetivos del Proyecto#
- Implementar lógica de juego compleja con JavaScript puro
- Crear una interfaz de usuario intuitiva y atractiva
- Demostrar comprensión de algoritmos y estructuras de datos
- Practicar programación orientada a eventos
🛠️ Tecnologías y Conceptos#
Core Technologies#
- JavaScript ES6+: Arrow functions, destructuring, template literals
- HTML5: Estructura semántica
- CSS3: Animaciones y transiciones fluidas
- LocalStorage: Persistencia de puntuaciones
Conceptos Implementados#
// Algoritmo Minimax para IA (próxima versión)
const minimax = (board, depth, isMaximizing) => {
const result = checkWinner();
if (result !== null) {
return scores[result];
}
// Lógica recursiva del algoritmo
}
✨ Características del Juego#
🎲 Mecánicas de Juego#
- Modo 2 Jugadores: Partidas locales entre dos personas
- Detección Automática de Ganador: Algoritmo eficiente de verificación
- Sistema de Turnos: Indicador visual del jugador actual
- Reinicio Rápido: Nueva partida con un click
🎨 Interfaz de Usuario#
/* Animaciones suaves para mejor UX */
.cell {
transition: all 0.3s ease;
transform-style: preserve-3d;
}
.cell:hover {
transform: scale(1.05);
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}
.winning-cell {
animation: pulse 0.5s infinite;
background: linear-gradient(45deg, #4CAF50, #8BC34A);
}
🧠 Lógica del Juego#
Estructura de Datos#
// Representación del tablero
const gameBoard = [
['', '', ''],
['', '', ''],
['', '', '']
];
// Combinaciones ganadoras
const winPatterns = [
// Horizontales
[[0,0], [0,1], [0,2]],
[[1,0], [1,1], [1,2]],
[[2,0], [2,1], [2,2]],
// Verticales
[[0,0], [1,0], [2,0]],
[[0,1], [1,1], [2,1]],
[[0,2], [1,2], [2,2]],
// Diagonales
[[0,0], [1,1], [2,2]],
[[0,2], [1,1], [2,0]]
];
Algoritmo de Verificación#
function checkWinner() {
for (let pattern of winPatterns) {
const [a, b, c] = pattern;
if (gameBoard[a[0]][a[1]] &&
gameBoard[a[0]][a[1]] === gameBoard[b[0]][b[1]] &&
gameBoard[a[0]][a[1]] === gameBoard[c[0]][c[1]]) {
return gameBoard[a[0]][a[1]];
}
}
return null;
}
📊 Estadísticas y Puntuación#
Sistema de Puntos#
- Victoria: +10 puntos
- Empate: +5 puntos para ambos
- Racha de Victorias: Multiplicador de puntos
- Tabla de Líderes: Top 10 mejores puntuaciones
🎮 Modos de Juego Planeados#
Versión Actual (v1.0)#
- ✅ Modo 2 jugadores local
- ✅ Detección de ganador
- ✅ Interfaz responsiva
- ✅ Animaciones suaves
Próximas Versiones#
- Modo vs IA: Tres niveles de dificultad
- Modo Online: Multijugador en tiempo real
- Torneo: Sistema de brackets
- Personalización: Temas y avatares
🚀 Optimizaciones Implementadas#
Performance#
- Event delegation para manejo eficiente de clicks
- RequestAnimationFrame para animaciones fluidas
- Lazy loading de recursos
- Minimización de reflows y repaints
Accesibilidad#
- Navegación por teclado
- Anuncios de pantalla para lectores
- Contraste adecuado de colores
- Indicadores visuales claros
📱 Diseño Responsivo#
/* Mobile-first approach */
.game-board {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
max-width: 400px;
margin: 0 auto;
}
@media (max-width: 480px) {
.game-board {
max-width: 90vw;
}
}
🏆 Logros Técnicos#
- Código Limpio: Funciones puras y modularización
- Sin Dependencias: JavaScript vanilla 100%
- Cross-browser: Compatible con todos los navegadores modernos
- PWA Ready: Puede instalarse como aplicación
📈 Métricas del Proyecto#
- Líneas de Código: ~500
- Tamaño Final: < 50KB
- Tiempo de Carga: < 1s
- Lighthouse Score: 100/100
🎓 Aprendizajes Clave#
- Algoritmos: Implementación de lógica de juego eficiente
- Event Handling: Gestión avanzada de eventos del DOM
- State Management: Control del estado sin frameworks
- Clean Code: Código legible y mantenible
🔗 Enlaces del Proyecto#
📊 Repositorio de GitHub#
Este proyecto demuestra mi capacidad para crear aplicaciones interactivas completas con JavaScript puro, enfocándome en la experiencia del usuario y las mejores prácticas de desarrollo.