Diseño del juego Hundir la Flota

Diseño de la parte compartida

  • DatosHundirLaFlota: almacena la información para el inicio de la partida. A los campos de DatosPartida se le agrega la modalidad de partida y el tiempo de turno.
  • Barco: esta clase representa un barco, incluidas su posición, orientación, impactos recibidos y tipo. También permite saber si solapa con otro barco.
  • TableroAbstracto: contiene todo lo necesario para representar un tablero del juego Hundir la Flota, almacena: barcos, disparos al agua y disparos sobre los barcos.
  • Tablero: está diseñado para ser el tablero propio de un jugador. Es decir que cuando se agrega un barco este se considera como colocado, y sin recibir ningún disparo. A través de su función recibeDisparo se irá hundiendo los barcos, y mostrando los disparos del rival. Este tablero se usa en el servidor y el cliente.
  • TableroTiros: está diseñado para ser el tablero con los tiros propios de un jugador. Es decir que almacenará disparos al agua y sobre los barcos, cuando se agregue un barco este se considerará hundido.

UML de la parte compartida

HundirLaFlota_Compartido.png

Diseño de la parte del servidor

  • InicioHundirLaFlota: clase que hereda de la factoría de juegos. Se utiliza para crear instancias de ServidorHundirLaFlota.
  • ServidorHundirLaFlota: esta clase se encarga de la lógica del juego y de comunicar a los clientes el resultado de los disparos y trasmitir el tiempo de turno.

UML de la parte del servidor

HundirLaFlota_Servidor.png

Diseño de la parte del cliente

El programa que se ejecuta en el cliente cuando se juega al hundir la flota contiene, además de las clases pertenecientes al framework, las siguientes:

  • JuegoHundirLaFlota: Contiene la máquina de estados, procesa los eventos que le envía el panel y los mensajes que le llegan del servidor. En base a eso actualiza la visualización y/o envía mensajes al servidor.
  • PanelJuegoHundirLaFlota: Panel que implementa todas las funcionalidades visuales de cara con el cliente y se encarga de recoger los eventos ocurridos en el mismo.
  • DialogoConfHundirLaFlota: Diálogo inicial para elegir la modalidad de la partida.
  • IEstadoHundirLaFlota: Interfaz que pertenece al patrón State que especifica la funcionalidad que deben tener los estados.

Máquina de estados

Además de las tres clases anteriormente mencionadas, existen una serie de clases que implementan la interfaz IEstadoHundirLaFlota, según indica el patrón State. Esas clases son las siguientes:

  • EstadoInactivo: No se reacciona ante los eventos sucedidos en el cliente
  • EstadoPonerBarcos: Se ubican los barcos los 5 barcos en el tablero propio.
  • EstadoDisparar: Se elige la casilla de la cuadrícula en la que se quiere realizar el disparo.

Este el el autómate de la máquina de estados:

estados.PNG

UML de la parte del cliente

HundirLaFlota_Cliente.jpg

Protocolo de mensajes

Aparte de los mensajes de control (transparentes al desarrolador del juego) se envían los siguientes mensajes:

Barcos colocados

Cuando el jugador termina de colocar los barcos en el tablero se envía un mensaje al servidor. (El mensaje es una instancia de la clase Tablero).

Jugador listo

Cuando se recibe el mensaje "barcos colocados" se envía al jugador creador de la partida, un mensaje de "jugador listo" para saber que cuando termine de ubicar sus barcos podrá dar comienzo a la partida.

Disparo

Cuando el jugador en posesión del turno efectúa un disparo se envía un mensaje al servidor con las coordenadas (x,y) del disparo. (El mensaje es una instancia de la clase java.awt.Point)
El servidor podrá responder con un mensaje de tipo:

  1. "disparo agua" para indicar que el había agua en las coordenadas del disparo
  2. "disparo toque" si el disparó hizo daño parcial a un barco.
  3. "disparo barco" si el disparo hundió un barco.

En los puntos 1 y 2 el contenido del mensaje será una instancia de la clase java.awt.Point con las mismas coordenadas (x,y) recibidas.
En el punto 3 envía un array de Object, de dos posiciones. En la primera se envía el barco hundido y en la segunda el punto.

Tiempo

Cada vez que se agrega un jugador a la partida se le envía un mensaje con el tiempo de duración del turno expresado en segundos.

Ganador

Se envía a los clientes el nombre del jugador ganador, cuando se termina la partida.

Tabla resumen

El origen Cliente representa el jugador que tiene el turno, o productor del evento..

Id Origen Destino Evento Acción que lo produce Respuesta
1 Cliente Servidor Barcos ubicados Colocar los 5 barcos en la cuadrícula -
2 Cliente Servidor Disparo Disparar sobre una posición de la cuadrícula 6, 7 u 8
3 Servidor Cliente Tiempo Ingreso en la partida -
4 Servidor Todos Ganador Fin de la partida -
5 Servidor Creador Jugador listo El jugador que no es el creador ya ubicó sus barcos -
6 Servidor Todos Agua Difusión del resultado del disparo efectuado por el jugador con turno -
7 Servidor Todos Tocado Difusión del resultado del disparo efectuado por el jugador con turno -
8 Servidor Todos Hundido Difusión del resultado del disparo efectuado por el jugador con turno -

Patrones

  • State