Programación Orientada a Objetos · UEM 2024-25

MiniJuegos

Aplicación de escritorio en Java + Swing con dos minijuegos clásicos, sistema multiusuario con roles, persistencia en disco y panel de administración. Proyecto final de la asignatura, escrito en cuatro capas y cero dependencias externas.

Equipo
JP Aceves Adrián Juan Carlos Nacho
02:30
27
letras · rosco completo
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.

AplicacionTemaVentanaLoginVentanaMenuPrincipalVentanaSeleccionJuegoVentanaJuegoVentanaJuegoPasapalabraVentanaJuegoTresEnRayaVentanaEstadisticasVentanaAdmin
02

Controlador

paquete Controlador

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

GestorUsuariosGestorJuegosGestorPartidasGestorEstadisticas
03

Modelo

paquete Modelo

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

UsuarioJugadorAdministradorJuegoPasaPalabraTresEnRayaPartidaEstadisticaPuntuacionJugadorEstadoPartida
04

Persistencia

paquete Persistencia

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

GestorPersistenciaPersistenciaArchivos
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.

EstadoPartidaPuntuacionJugadorGestorPersistenciaPersistenciaArchivosJuegoPartidaGestorPartidasVentanaJuegoAplicacionTemaVentanaSeleccionJuego
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.

UsuarioJugadorAdministradorPasaPalabraGestorUsuariosVentanaLoginVentanaMenuPrincipalVentanaJuegoPasapalabra
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.

EstadisticaGestorEstadisticasVentanaEstadisticasVentanaAdmin
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.

TresEnRayaGestorJuegosVentanaJuegoTresEnRaya
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.

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