01 / Juegos

## Dos clásicos, una sola aplicación

Cada minijuego implementa la misma interfaz abstracta de `Juego`, lo que permite añadir más sin tocar el resto.

### Pasapalabra

individual

Rosco de 27 letras del abecedario español con cuatro niveles de dificultad y temporizador a contrarreloj.

- 4 niveles: Infantil · Fácil · Medio · Avanzado
- Temporizador de 2 min 30 s por partida
- Pregunta aleatoria por letra de cada bloque de 10
- Panel custom con código de color por estado de letra

×
○
×
○
○
×

### Tres en Raya

2 jugadores

Tablero 3×3 para dos jugadores con detección automática de victoria y empate, pausable en cualquier momento.

- Tablero clicable con turnos alternos
- Detección de las 8 líneas ganadoras + empate
- Pausa y reanudación serializada en disco
- Marcador acumulado de la partida

02 / Implementación

## Arquitectura en cuatro capas

Cada paquete Java solo conoce a las capas inmediatamente inferiores. Permite cambiar la persistencia o la UI sin reescribir el modelo.

Ver Diagrama de Clases
01

### Vista

paquete Vista

Ventanas y paneles Swing. Recoge interacción y delega toda la lógica en los gestores.

`Aplicacion` `Tema` `VentanaLogin` `VentanaMenuPrincipal` `VentanaSeleccionJuego` `VentanaJuego` `VentanaJuegoPasapalabra` `VentanaJuegoTresEnRaya` `VentanaEstadisticas` `VentanaAdmin`
↓
02

### Controlador

paquete Controlador

Coordinan Vista con Modelo. Autenticación, ciclo de partidas, registro de estadísticas.

`GestorUsuarios` `GestorJuegos` `GestorPartidas` `GestorEstadisticas`
↓
03

### Modelo

paquete Modelo

Clases de dominio puras, sin dependencias de UI ni persistencia.

`Usuario` `Jugador` `Administrador` `Juego` `PasaPalabra` `TresEnRaya` `Partida` `Estadistica` `PuntuacionJugador` `EstadoPartida`
↓
04

### Persistencia

paquete Persistencia

Interfaz desacoplada de su implementación. Cambiar a base de datos solo requiere una nueva clase aquí.

`GestorPersistencia` `PersistenciaArchivos`
01

#### Herencia, no banderas

`Usuario` es abstracta con subclases `Jugador` y `Administrador`. Polimorfismo real con `instanceof` en lugar de un `boolean esAdmin` que mezcla responsabilidades.

02

#### Juego como clase abstracta

Comparte estado y comportamiento entre `PasaPalabra` y `TresEnRaya`, y obliga a las subclases a implementar su propia mecánica vía métodos abstractos. Añadir un tercer juego no toca el resto del sistema.

03

#### Persistencia tras interfaz

Los controladores hablan con `GestorPersistencia`, nunca con `PersistenciaArchivos`. Migrar a BBDD significa escribir una segunda implementación sin tocar Vista ni Controlador.

04

#### Serialización inline, no binaria

El estado de una partida pausada se guarda como texto: `juego|user1,user2|estado`. Sin `Serializable` de Java: formato legible, debuggeable y portable.

05

#### Contraseñas SHA-256

Nunca en texto plano. El hash se calcula con `java.security.MessageDigest` dentro de `Usuario`. Un constructor alternativo (`yaEsHash=true`) permite reconstruir desde disco sin re-hashear.

06

#### Tema centralizado

Una sola clase `Tema` contiene paleta y tipografía. Rediseñar la app entera es editar un único fichero.

UML · Diagrama de clases / 27 clases · 3 jerarquías abstractas · 1 interfaz · 1 enum
Descargar PDF
paquete Modelo · usuarios
Usuario abstract
−username : String
−password : String

+verificarPassword(p) : boolean
+hashear() : String
+toArchivo()* : String
Jugador
+toArchivo() : String
+toString() : String
Administrador
+toArchivo() : String
+toString() : String
paquete Modelo · juegos
Juego abstract
−nombreJuego : String
−juegoFinalizado : boolean

+inicializar()* : void
+serializarEstado()* : String
+deserializarEstado(e)*
+sumarPuntos(user, n)
PasaPalabra
−rosco : String[][]
−nivel : int
+procesarRespuesta()
+pasarPalabra()
TresEnRaya
−tablero : char[][]
−ganador : String
+jugarTurno()
+getGanador()
paquete Persistencia · contrato
GestorPersistencia interface
+guardarUsuarios()*
+cargarUsuarios()*
+guardarEstadisticas()*
+guardarPartida()*
+cargarRosco(nivel)*
PersistenciaArchivos
−RUTA_USUARIOS : String
−RUTA_PARTIDAS : String
+guardarUsuarios()
+cargarRosco(nivel)
Herencia (extends) Implementación (implements) Abstracta / interfaz Clase concreta
Stack & herramientas
Java SE 17+ Swing AWT SHA-256 Ficheros .txt / .dat 0 dependencias externas
03 / Equipo

## División del trabajo

Cuatro integrantes, una responsabilidad principal por persona. Los gestores compartidos se codesarrollaron por parejas.

J

### JP Aceves

Coordinación · Arquitectura · Persistencia

Diseño general del sistema, arquitectura en capas, modelo de partidas y persistencia. Codesarrollo de `PersistenciaArchivos` y `GestorPartidas` con Adrián.

`EstadoPartida` `PuntuacionJugador` `GestorPersistencia` `PersistenciaArchivos` `Juego` `Partida` `GestorPartidas` `VentanaJuego` `Aplicacion` `Tema` `VentanaSeleccionJuego`
A

### Adrián

Usuarios · Pasapalabra · Login

Modelo de usuarios completo, juego Pasapalabra (rosco con 4 niveles y temporizador) y vistas de login y menú principal.

`Usuario` `Jugador` `Administrador` `PasaPalabra` `GestorUsuarios` `VentanaLogin` `VentanaMenuPrincipal` `VentanaJuegoPasapalabra`
J

### Juan Carlos

Estadísticas · Administración

Sistema de estadísticas con ranking global y últimas partidas, tabla interactiva de consulta y panel de administración para usuarios admin.

`Estadistica` `GestorEstadisticas` `VentanaEstadisticas` `VentanaAdmin`
N

### Nacho

Tres en Raya · Fábrica de juegos

Juego Tres en Raya completo —tablero 3×3, detección de victoria y empate, serialización del estado— y fábrica de juegos disponibles.

`TresEnRaya` `GestorJuegos` `VentanaJuegoTresEnRaya`
04 / Entrega

## Código fuente & estructura

El zip contiene el proyecto Java listo para abrir en cualquier IDE. La estructura sigue la separación de capas declarada arriba.

### Dos formas de obtenerlo.

Descarga el zip empaquetado para abrirlo directamente desde tu IDE, o navega el código fuente en GitHub para revisarlo commit a commit.

Descargar proyecto.zip
Repositorio en GitHub
JuegoFinal / Programa

    src/
    ├── Controlador/
    │   ├── GestorEstadisticas.java
    │   ├── GestorJuegos.java
    │   ├── GestorPartidas.java
    │   └── GestorUsuarios.java
    ├── Modelo/
    │   ├── Administrador.java
    │   ├── Estadistica.java
    │   ├── EstadoPartida.java     # enum
    │   ├── Juego.java             # abstracta
    │   ├── Jugador.java
    │   ├── Partida.java
    │   ├── PasaPalabra.java
    │   ├── PuntuacionJugador.java
    │   ├── TresEnRaya.java
    │   └── Usuario.java           # abstracta
    ├── Persistencia/
    │   ├── GestorPersistencia.java # interfaz
    │   └── PersistenciaArchivos.java
    └── Vista/
        ├── Aplicacion.java
        ├── Tema.java
        ├── VentanaAdmin.java
        ├── VentanaEstadisticas.java
        ├── VentanaJuego.java      # abstracta
        ├── VentanaJuegoPasapalabra.java
        ├── VentanaJuegoTresEnRaya.java
        ├── VentanaLogin.java
        ├── VentanaMenuPrincipal.java
        └── VentanaSeleccionJuego.java

    data/
    ├── usuarios.txt           # username;sha256;esAdmin
    ├── estadisticas.txt       # username;juego;pts;victoria;fecha
    ├── partidas/              # estados pausados serializados (.dat)
    └── roscos/                # rosco_{infantil,facil,medio,avanzado}.txt