Juego de Carreras
Estructuras de Datos
Sistema completo en Java que integra estructuras de datos dinámicas para crear una experiencia de juego interactiva con soporte de chatbot incorporado.
Arquitectura del Sistema
El proyecto implementa una arquitectura en capas que separa claramente las responsabilidades del sistema. Esta organización permite mantener el código limpio, escalable y fácil de mantener.
Capa de Control
MainAvance y JuegoAvance coordinan todas las operaciones del sistema. Los controladores del Chatbot gestionan la navegación y el mantenimiento del árbol de preguntas.
Capa de Dominio
Clases como Jugador, PreguntaFAQ y RegistroPosicion representan las entidades del negocio. Cada una encapsula sus propios datos y comportamientos específicos.
Capa de Estructuras
Implementa árboles binarios, pilas, colas y listas con diferentes configuraciones. Todas heredan de las estructuras base vistas en clase.
Alcance
Funcionalidades Implementadas
Este avance integra completamente la lógica del juego con múltiples estructuras de datos. El sistema es totalmente funcional y permite gestionar partidas completas desde el inicio hasta que un jugador alcanza la meta.
  • Sistema completo de turnos con cola de jugadores
  • Gestión dinámica de premios y castigos mediante pilas
  • Tablero circular representado con lista enlazada
  • Bitácora de movimientos con navegación bidireccional
  • Chatbot de preguntas frecuentes basado en árbol binario
  • Mantenimiento administrativo completo del sistema
Flujo Principal del Programa
1
Menú Principal
MainAvance2 presenta las opciones disponibles al usuario mediante JOptionPane y captura su elección.
2
Delegación
JuegoAvance2 recibe la solicitud y determina qué estructura de datos debe intervenir según la operación.
3
Actualización
Las estructuras correspondientes se modifican: cola de jugadores, pilas de efectos, listas de posiciones o árbol del chatbot.
4
Respuesta
El sistema presenta el resultado al usuario y retorna al menú principal, manteniendo el estado actualizado.
Este flujo demuestra comprensión profunda del sistema completo, no solo de clases individuales. Cada componente cumple un rol específico y se comunica efectivamente con los demás.
Gestión de Jugadores y Turnos
Implementación con Cola FIFO
Los turnos se gestionan mediante una estructura de cola que garantiza justicia: el primer jugador en entrar es el primero en jugar. Después de completar su turno, el jugador se reencola automáticamente al final.
ColaJugadores extiende la Cola original del profesor, reutilizando completamente su lógica de nodos y enlaces. La clase Jugador hereda de Dato para cumplir con el requisito de reutilización de estructuras base.
Operaciones Principales
  • encolarJugador(): Añade un jugador al final de la cola
  • desencolarJugador(): Saca al siguiente jugador en turno
  • eliminarPorNombre(): Permite retiros durante el juego
  • listarJugadores(): Muestra el orden actual de turnos
La herencia se usa para cumplir con la reutilización exigida en el curso sin modificar las estructuras originales.
Pilas de Premios y Castigos
El sistema utiliza dos pilas independientes para gestionar efectos del juego. Cuando un jugador obtiene una suma par en los dados, extrae un premio. Con suma impar, obtiene un castigo. Esta mecánica implementa perfectamente el comportamiento LIFO: el último elemento apilado es el primero en aplicarse.
Respeto a la Estructura Base
PilaPremiosCastigos extiende Pila29S del profesor sin modificar su código original. Se mantienen intactos NodoPila29S y Dato29S, garantizando compatibilidad total.
Patrón Wrapper
DatoPremioCastigoWrapper encapsula objetos complejos (operación, número, descripción) dentro de Dato29S. Este diseño permite almacenar información rica manteniendo la estructura simple original.
Operaciones Soportadas
Cada premio o castigo contiene una operación: + para avanzar, - para retroceder, = para asignar posición exacta. El número indica la magnitud del efecto.

Se respeta completamente la estructura base y se extiende su funcionalidad mediante herencia y composición, demostrando aplicación correcta de principios de programación orientada a objetos.
Tablero: Estado Actual del Juego
Lista Circular Dinámica
El tablero se implementa mediante una ListaCircular que representa todas las posiciones del juego (1 hasta N). Esta estructura elimina valores null: el último nodo siempre apunta al primero, creando un ciclo continuo perfecto para juegos de mesa.
Características Técnicas
  • Inserción ordenada ascendente de posiciones
  • Navegación cíclica sin límites ni excepciones
  • Cada casilla puede contener cero o más jugadores
  • Búsqueda eficiente de ocupantes por posición
40%
Zona Verde
Primeras posiciones del tablero, representan el inicio seguro del juego
40%
Zona Amarilla
Sección intermedia donde aumenta la complejidad y competencia
20%
Zona Roja
Posiciones finales cercanas a la meta, máxima tensión
La visualización por colores permite identificar rápidamente en qué etapa del juego se encuentra cada jugador. Este criterio de diseño demuestra comprensión más allá de la implementación técnica.
Bitácora de Jugadores
La bitácora registra cada movimiento de cada jugador mediante una estructura de Lista Doble Circular. Esta implementación permite navegación bidireccional fluida: el usuario puede avanzar o retroceder entre jugadores sin perder la referencia ni alcanzar límites.
BitacoraJugadores
Lista doble circular que almacena los jugadores ordenados alfabéticamente. Cada nodo contiene un jugador completo con su historial de movimientos.
  • siguiente(): Navega al próximo jugador
  • anterior(): Regresa al jugador previo
  • insertar(): Añade en orden alfabético
  • Estructura circular: nunca hay null
ListaSimplePosiciones
Cada jugador mantiene su propio historial de posiciones visitadas, ordenado por posición ascendente y, en caso de empate, por timestamp.
  • RegistroPosicion con fecha/hora exacta
  • Descripción del premio o castigo aplicado
  • Orden garantizado para análisis temporal
  • Consulta rápida de trayectoria completa
La estructura permite navegación bidireccional sin perder referencia, facilitando la revisión completa del estado de todos los participantes sin salir del contexto.
Chatbot: Árbol de Preguntas Frecuentes
El chatbot implementa un árbol binario jerárquico que organiza preguntas por categorías. Los nodos internos representan categorías de navegación, mientras que solo los nodos hoja contienen listas de preguntas reales. Esta separación garantiza claridad estructural y facilita el mantenimiento.
01
ArbolBinarioBase
Clase abstracta que define la estructura básica del árbol. Implementa inserción mediante códigos jerárquicos (1, 11, 111) y búsqueda recursiva. El método fábrica crearNodo() permite que subclases determinen el tipo específico de nodo.
02
ArbolChatbot
Implementación concreta que extiende ArbolBinarioBase. Se encarga de precargar el árbol según el enunciado y garantiza que todos los nodos sean tipo NodoChatbot mediante el método fábrica.
03
NodoChatbot
Nodo especializado que hereda de NodoArbolBase. Solo los nodos hoja pueden crear ListaSimplePreguntas. La validación esHoja() previene inconsistencias estructurales.
04
ListaSimplePreguntas
Lista enlazada que almacena objetos PreguntaFAQ. Cada pregunta contiene código, texto de pregunta y respuesta. Soporta inserción, modificación y eliminación por índice.
Navegación del Chatbot
Estructura Jerárquica
El árbol organiza las preguntas en tres niveles claramente definidos:
  1. Raíz: "Preguntas Frecuentes (FAQ)"
  1. Segundo nivel: Categorías principales (Jugadores, Administradores)
  1. Tercer nivel: Subcategorías específicas
  1. Hojas: Nodos con preguntas concretas
Sistema de Códigos
Cada nodo tiene un código que indica su posición en el árbol. El último dígito determina si es hijo izquierdo (1) o derecho (2):
  • 1 = Raíz
  • 11 = Hijo izquierdo de la raíz
  • 111 = Hijo izquierdo de 11
  • 112 = Hijo derecho de 11
ChatbotControlador gestiona la navegación interactiva. El usuario selecciona opciones mediante JOptionPane y el controlador avanza, retrocede o muestra preguntas según el contexto.
Cuando se alcanza un nodo hoja, el sistema cambia automáticamente a modo de consulta de preguntas, mostrando la lista numerada y permitiendo ver respuestas individuales.

El árbol define la navegación; las listas almacenan el contenido. Esta separación de responsabilidades es clave para mantener el sistema organizado y extensible.
Mantenimiento del Chatbot
ChatbotMantenimientoControlador proporciona funciones administrativas completas para gestionar tanto la estructura del árbol como el contenido de las preguntas. Todas las operaciones incluyen validaciones para preservar la integridad del sistema.
Nodos Padre
Insertar: Crea categorías nuevas usando código jerárquico. El sistema valida que el padre exista.
Modificar: Cambia el nombre visible de una categoría sin afectar su código ni posición.
Eliminar: Remueve una categoría completa. No permite eliminar la raíz por seguridad.
Preguntas Hijas
Insertar: Añade pregunta con código, texto y respuesta. Solo funciona en nodos hoja.
Modificar: Actualiza texto de pregunta o respuesta manteniendo el código original.
Eliminar: Remueve pregunta por índice de la lista del nodo hoja seleccionado.
Concepto Clave: Código Padre
El código padre es el identificador jerárquico del nodo en el árbol (ejemplo: "111", "112"), no el código de una pregunta individual. Este código determina la posición estructural dentro del árbol binario y se usa para navegar la jerarquía de categorías.
Límites del Sistema
Se Puede Modificar
  • Texto completo de preguntas existentes
  • Respuestas de las preguntas del FAQ
  • Premios y castigos en las pilas
  • Nombres descriptivos de nodos del árbol
  • Descripción de efectos de premios/castigos
  • Cantidad de jugadores participantes
  • Posición máxima del laberinto
Todas estas modificaciones preservan la integridad estructural del sistema y se pueden realizar de forma segura durante la ejecución.
No Se Debe Modificar
  • Códigos jerárquicos del árbol binario
  • Estructuras base del profesor (Cola, Pila29S, Nodos)
  • Relaciones de herencia establecidas
  • Lógica FIFO de la cola de turnos
  • Comportamiento LIFO de las pilas
  • Estructura circular de las listas
  • Sistema de enlaces dobles de la bitácora
Modificar estos elementos rompería las garantías del enunciado y podría causar comportamientos inesperados o errores de integridad.
Integración de Estructuras
El proyecto demuestra cómo múltiples estructuras de datos trabajan conjuntamente para crear un sistema funcional completo. Cada estructura cumple un propósito específico y se comunica con las demás de forma coherente.
Durante un turno típico, JuegoAvance2 coordina todas las estructuras: extrae el jugador de la cola, consulta las pilas de efectos, actualiza el tablero circular, registra el movimiento en la bitácora y reencola al jugador. El chatbot opera independientemente para soporte al usuario.
Cumplimiento del Enunciado
Todas las estructuras requeridas implementadas
Cola, pilas, listas simples, listas circulares, listas dobles circulares y árbol binario están presentes y funcionalmente integradas en el sistema.
Estructuras base sin modificaciones
Cola, Pila29S, Nodo, NodoPila29S y Dato se reutilizan mediante herencia y composición. Cero líneas de código original fueron alteradas.
Sistema completamente integrado
No son ejercicios separados: todas las estructuras trabajan conjuntamente en un único programa funcional con interfaz de usuario consistente.
Documentación completa con Javadoc
Todas las clases, métodos y atributos incluyen comentarios Javadoc explicando propósito, parámetros, retornos y comportamiento esperado.
Desarrollo incremental documentado
El diagrama de clases refleja la evolución desde el Avance 1 hasta el Avance 2, mostrando claramente qué estructuras se agregaron en cada etapa.
Conclusiones
Logros del Proyecto
El Juego de Carreras cumple exhaustivamente con todos los requisitos del enunciado. Se han integrado correctamente seis estructuras de datos diferentes, cada una aplicada donde tiene sentido conceptual y técnico.
La reutilización de las estructuras del profesor mediante herencia demuestra comprensión profunda de programación orientada a objetos. El sistema mantiene separación clara entre estructura y contenido, permitiendo modificaciones seguras del comportamiento sin alterar las bases teóricas.
Valor Técnico
El proyecto trasciende la implementación básica de estructuras aisladas. Demuestra capacidad de:
  • Diseñar arquitectura de software por capas
  • Integrar estructuras heterogéneas coherentemente
  • Aplicar patrones de diseño (Factory, Wrapper)
  • Documentar código profesionalmente
  • Validar entradas y preservar integridad
El proyecto cumple con el enunciado, reutiliza correctamente las estructuras vistas en clase y demuestra una integración funcional y coherente del sistema.