Sobre este proyecto
it-programming / web-development
Abierto
Así pues, hay que implementar un juego de tablero para dos jugadores. El tablero
tendrá unas dimensiones 10x10. Las filas se notarán con una letra y las columnas con un
número, de forma que podemos identificar cualquier casilla del tablero con una dupla.
Por ejemplo: C3.
La implementación es muy simple, un jugador se conecta, abre el juego y espera a que
se conecte otro jugador que será su contrincante. Una vez conectados los dos, ambos
deben elegir en primer lugar donde colocar sus 2 barcos.
Para simplificar, los dos barcos
serán iguales en longitud (3 casillas) y sólo se podrán poner de forma vertical u
horizontal sobre el tablero, nunca en diagonal.
Así pues, el programa cliente de cada jugador preguntará la casilla donde colocar la
proa (parte delantera del barco) y su orientación (vertical u horizontal). Por ejemplo, si
elige A3 vertical, el barco debe colocarse en las casillas A3, B3 y C3.
Este procedimiento se repetirá hasta completar la colocación de los 2 barcos del
jugador. Nota: Comprobar que ningún barco se sale de las dimensiones del tablero.
Cuando ambos jugadores hayan terminado de poner sus barcos, el sistema, a través de la
entidad Servidor, les indicará que empieza el juego mediante un evento.
Para simplificar
el primer disparo lo hará el jugador que abre el juego (el que se conecta primero),
después será el turno del otro jugador que no podrá disparar hasta que lo haya hecho el
primer jugador. Esta mecánica se repite hasta que uno de los jugadores hunda todos los
barcos del oponente. No hay posibilidad de empate.
Una vez que el sistema detecte que la partida ha terminado les comunicara a cada uno de los jugadores su puntuación, la cual se distribuirá de la siguiente manera:
1 punto por cada disparo que impacte en un barco del contrincante.
10 puntos por hundir todos los barcos del contrincante.
Finalizada la partida, los jugadores de nuevo podrán iniciar una nueva partida o unirse a una ya creada por otro jugador y que está en espera de que se conecte un contrincante.
En este sistema actuaran tres tipos de actores cuyas funciones se listan a continuación:
1.- Servidor: La entidad Servidor se encarga de controlar y gestionar las partidas y el proceso de autenticación de los usuarios (jugadores) del sistema. Para ello, hace uso de dos servicios:
• Servicio Autenticación: Se encarga de registrar y de autenticar a los jugadores del sistema. La operación de registro consiste en que los jugadores introducen en el sistema por primera vez sus datos personales (nombre y password), siendo el nombre el identificador único de usuario.
Es decir, no pueden existir dos jugadores en el sistema con el mismo nombre. Una vez registrado, el jugador puede acceder al sistema haciendo login utilizando este servicio de Autenticación.
• Servicio Gestor: Este servicio se encarga de gestionar todas las operaciones de los jugadores en relación con el juego y la emisión de eventos.
Crea todas las estructuras necesarias de datos para jugar la partida, gestiona la lógica de juego, informa a los usuarios del fin de partida y de sus puntuaciones, etc.
2.- Base de datos: Esta entidad es la encargada de almacenar todos los datos del sistema: Jugadores, tableros de juego,...; Sólo la entidad Servidor puede consumir el servicio que suministra esta entidad y cuya funcionalidad se describe a continuación.
• Servicio Datos: Este servicio hará las funciones de una base de datos que relacione jugadores-partidas-tableros. Es decir, mantendrá la lista de jugadores registrados y/o conectados al sistema, junto con los jugadores que han iniciado juego y se encuentran a la espera de contrincante.
También guardará toda la información relativa a la partida: tablero, posición de los barcos, disparos efectuados. Los dos servicios anteriores (Servicio Autenticación y Servicio Gestor) harán uso de este servicio para realizar las operaciones sobre el estado de los jugadores del sistema y sus partidas. Aunque podría usarse un sistema de gestión de bases de datos (SGBD) para implementar este servicio, esto haría muy complejo el desarrollo de la práctica y no atendería a los objetivos de la asignatura.
Así pues, el equipo docente recomienda para la implementación del servicio las clases List y HashMap de Java.
3.- Jugadores (Usuarios): Son los actores principales del sistema, los jugadores se enfrentan entre ellos en partidas cuyo objetivo es hundir la flota del contrario. Los jugadores se registran en el sistema a través de la entidad Servidor. Una ver registrados se logean usando también esta entidad Servidor para poder iniciar una partida y esperar contrincante o unirse a una partida creada por otro jugador y enfrentarse a él.
La entidad Jugador debe implementar un servicio para recibir los mensajes (eventos) que le llegan del servidor que son: partida iniciada permanezca a la espera, otro jugador se ha unido a su partida, colocar los barcos en el tablero, comienza el juego, disparo realizado por el jugador contrario (tocado/agua), disparo realizado por ti (tocado/agua), has hundido un barco, te han hundido un barco, has hundido la flota de tu contrincante (has ganado), te han hundido tu flota (has perdido).
• Servicio CallbackJugador. Es el único servicio que arranca la entidad jugador y tiene los métodos necesarios para recibir los mensajes (eventos) que se han descrito anteriormente de forma automática.
Una vez que un jugador ha creado una partida, esta se registra en el servidor con un identificador único que puede ser un número consecutivo. El jugador contrincante usará este identificador de partida para unirse a ella.
Operativa
Inicialmente la entidad Base de datos levanta su servicio Datos.
Posteriormente, la entidad Servidor levanta sus dos servicios: Autenticación y Gestor.
Por último los jugadores arrancan su aplicación cliente y se registran/autentican en el sistema mediante el servicio Autenticación del servidor. El jugador puede decidir deslogearse (logout) del sistema y el sistema tiene que registrar ese evento convenientemente.
Una vez que el jugador esté logeado en el sistema, podrá realizar las operaciones de iniciar una partida, unirse a una partida creada por otro jugador, consultar sus puntuaciones y, por supuesto, todo lo relativo al juego, colocar sus barcos, disparar contra el enemigo y recibir los disparos del enemigo, cuando el juego se haya iniciado. Estas operaciones son gestionadas por la entidad Servidor.
Cuando un jugador realiza un disparo, éste se procesa por la entidad Servidor, concretamente por su servicio Gestor que una vez procesado envía directa y automáticamente el resultado del evento a ambos jugadores.
Es decir, les dice si ha habido impactado con uno de los barcos o el proyectil ha caído al agua.
Para simplificar, la operación de unirse a una partida creada por otro jugador, no necesita confirmación del jugador que ha creado la partida. Es decir, una vez que se une a la partida empieza ésta.
Por otro lado, se propone como tarea opcional implementar la funcionalidad de que un jugador pueda abandonar el juego una vez comenzada una partida (escribiendo un código en lugar de una coordenada de disparo. Por ejemplo “ME_RINDO”. En este caso, se enviará un mensaje al otro jugador de que el usuario se rinde y le concede todos los puntos de la partida.
Interfaz
• El Servidor debe permitir mediante su interfaz de texto las siguientes
operaciones:
1.- Información del Servidor.
2.- Estado de las partidas que se están jugando en este momento.
3.- Salir.
• La Base de Datos debe permitir mediante su interfaz de texto las siguientes
operaciones:
1.- Información de la Base de Datos.
2.- Listar jugadores registrados (Sus puntuaciones).
3.- Salir.
• Los Clientes (Jugadores) deben permitir mediante su interfaz de texto las
siguientes operaciones:
1.- Información del jugador (consultar puntuación histórica).
2.- Iniciar una partida.
3.- Listar partidas iniciadas a la espera de contrincante.
4.- Unirse a una partida ya iniciada.
5.- Salir "Logout".
IMPORTANTE: Cuando un jugador arranca la aplicación cliente debe aparecer
inicialmente un menú con las siguientes opciones antes del menú anterior. ÉSte debe
permitir el registro de un nuevo jugador en el sistema y/o hacer login:
1.-
Registrar un nuevo jugador.
2.- Hacer login.
3.- Salir
Por favor, para facilitar la corrección de las prácticas, aténganse a presentar los menús
en formato texto con las mismas opciones y orden que se le han presentado
anteriormente.
Por último, como información del Servidor y Base de datos debe aparecer en pantalla el
nombre con el que se ha nombrado al/los objeto/s remoto/s que implemente el servicio
que corresponda en cada caso (Ver apartado recomendaciones más abajo).
Mecánica
Cuando un jugador inicia una partida, le aparece el mensaje “A la espera de
contrincante” y se queda ahí hasta que otro jugador elija enfrentarse a él.
Una vez que
comienza la partida aparece un mensaje a ambos jugadores:
“Introduzca coordenadas barco 1: “
Y después
“Introduzca coordenadas barco 2: “
Las coordenadas se codifican como YXZ, donde:
Y=fila de la proa (A – J).
X=columna de la proa (1 – 10).
Z=orientación (V=vertical, H=horizontal).
Recuerde que los barcos siempre tienen tamaño 3.
Una vez introducidas estas coordenadas por ambos jugadores, el servicio Gestor le
mandará al primer jugador un evento para que inicie la partida realizando su disparo. En
la consola del jugador debe aparecer el mensaje:
“Introduzca coordenadas de tiro [YX]: “
Las coordenadas de tiro se codificarán como se ha descrito anteriormente sin
orientación, ya que el tiro no la necesita.
Una vez que realice esta acción le aparecerá en la pantalla un mensaje que le diga el
efecto de su acción, después del que el servidor haya procesado la acción del disparo. A
continuación, se procederá de igual manera con el otro jugador hasta que se acabe la
partida
Especificaciones Generales
• Se debe utilizar código 100% Java JDK. No se admiten librerías de terceros.
• La sintaxis de llamada desde la línea de comandos tiene que ser:
- basededatos (para iniciar el programa Base de Datos y su servicio).
- Servidor (para iniciar el programa Servidor y sus servicios).
- Jugador (para iniciar un programa cliente del jugador y su servicio).
• Se recomienda encapsular el código dentro de ficheros .jar. Esta es una forma elegante, eficiente y compacta de presentar la aplicación final.
Detalles sobre las clases de la práctica
Con el objetivo de tener cierto orden, unificación y coherencia en el código que se entrega y para facilitar su posterior corrección, se tienen que nombrar obligatoriamente las clases/interfaces principales del programa de la siguiente manera:
-Servidor: Clase que contiene el main de la entidad Servidor.
-Basededatos: Clase que contiene el main de la entidad Base de Datos.
-Jugador: Clase que contiene el main de la entidad Jugador.
-ServicioAutenticacionInterface: contiene la interfaz remota del servicio de autenticación que depende de la entidad Servidor.
-ServicioAutenticacionImpl: clase que implementa la interfaz remota anterior.
-ServicioGestorInterface: contiene la interfaz remota del servicio Gestor que depende de la entidad Servidor.
-ServicioGestorImpl: clase que implementa la interfaz remota anterior.
-ServicioDatosInterface: contiene la interfaz remota del servicio Datos que depende de la entidad Base de Datos.
-ServicioDatosImpl: clase que implementa la interfaz remota anterior.
-CallbackJugadorInterface: contiene la interfaz remota del servicio que le permite recibir al jugador los eventos que le manda el servicio Gestor sobre el estado de la partida.
-CallbackJugadorImpl: clase que implementa la interfaz remota anterior.
Categoría Programación y Tecnología
Subcategoría Programación Web
¿Cuál es el alcance del proyecto? Crear un nuevo sitio personalizado
¿Es un proyecto o una posición? Un proyecto
Actualmente tengo Tengo las especificaciones
Disponibilidad requerida Según se necesite
Roles necesarios Programador
Plazo de Entrega: No definido
Habilidades necesarias