Batalla Pokémon

Enunciado

Se quiere construir una aplicación que permita jugar Batalla Pokémon desde diferentes computadores. Este es un juego de batallas Pokémon de dos jugadores, cuyo objetivo es debilitar todos los pokémon del oponente.

Al iniciar el juego cada jugador se identifica con su alias y su nombre, se conecta al servidor para comenzar el juego y selecciona 4 pokémon. El orden en el que el jugador selecciona los pokémon al empezar el juego es el orden en el que serán utilizados durante el juego.

De cada pokémon se conoce:

- Tipo. Permite clasificar a los pokémon. Los posibles tipos son: Fuego, Agua, Volador, Eléctrico, Planta o Roca.
- Nombre. Un jugador no puede tener dos pokémon con el mismo nombre.
- Salud. Indica la salud que tiene el pokémon y disminuye según los ataques realizados por el oponente. La salud de todos los pokémon inicia en 30 puntos.
- Imagen.

El jugador con el primer turno es escogido aleatoriamente.

Después de asignar el turno comienza el juego. En cada turno el jugador puede realizar un ataque con el pokémon actual o cambiar el pokémon actual, cediendo el turno.

Un ataque hace daño al pokémon del oponente, descontándole puntos de salud. Un pokémon se considera debilitado cuando su salud es igual a cero. Un jugador gana la batalla una vez debilite los cuatro pokémon de su oponente.

El daño del ataque se define teniendo en cuenta el tipo de cada pokémon (tanto del jugador como el del oponente) y un valor aleatorio, aplicando las reglas que se encuentran en la Descripción.

Como un servicio adicional, el programa debe almacenar información sobre la cantidad de batallas perdidas y ganadas por cada uno de los jugadores.

El programa distribuido debe constar de dos partes: un programa servidor, encargado de mantener la información estadística del juego y permitir a los jugadores encontrarse para una batalla; y un programa cliente, a través del cual un usuario puede jugar Batalla Pokémon.

El programa cliente debe ofrecer las siguientes funcionalidades:

1. Cargar la información de los pokémon disponibles de un archivo de texto.
2. Conectarse al servidor. Para esto el usuario tiene dos alternativas:

a. Registrarse: La primera vez que un usuario ingresa debe registrarse para poder jugar. Para esto debe suministra todos sus datos: Nombres, apellidos, alias (único), contraseña, dirección IP del servidor al cual se quiere conectar y el puerto por el cual dicho servidor se encuentra esperando conexiones. Adicionalmente, debe seleccionar el avatar (femenino o masculino) que desea usar en el juego.
b. Iniciar sesión: Si el usuario ya se encuentra registrado, debe iniciar sesión. Para esto debe suministrar su alias, su contraseña, la dirección IP del servidor y el puerto. Adicionalmente, debe seleccionar el avatar (femenino o masculino) que desea usar en el juego.

3. Seleccionar los pokémon. Una vez se establece la conexión con el oponente, cada usuario debe seleccionar los cuatro pokémon con los que jugará la batalla.
4. Visualizar información de la batalla. El jugador podrá visualizar la siguiente información:

a. Información del oponente: Nombre, cantidad de victorias y cantidad de derrotas.
b. Información de los pokémon: pokémon seleccionados por el jugador y su estado actual (debilitado o con salud), y el estado actual de los pokémon seleccionados por el usuario.
c. Información del juego: Avatar propio y del oponente, pokémon actual propio y pokémon actual del oponente, y el estado de salud de los dos pokémon actuales.
d. Mensajes: Listado de mensajes de las jugadas realizadas y ataques recibidos.
e. Estado de la batalla: Este puede ser: en espera del oponente, en espera de un ataque, realizando un ataque o batalla terminada.

5. Realizar un ataque. Realiza un ataque con el pokémon seleccionado actualmente. Una vez realizado, el turno pasa a ser del oponente.
6. Recibir un ataque. Se calcula el daño recibido según el tipo de pokémon que realizó el ataque y se informa al oponente cuánto daño causó.
7. Cambiar de pokémon. Para esto el usuario debe seleccionar el pokémon por el cual desea cambiar el actual. El programa debe informar a su oponente el cambio realizado. Al cambiar de pokémon, el jugador pierde su turno.

El programa servidor, por su lado, debe esperar a que los jugadores se vayan conectando. Cada vez que se conecten dos jugadores, inicia una batalla. Esto implica que el servidor debe:

1. Verificar la información de cada jugador cuando se conecte.

a. Si el jugador inicia sesión, verifica su alias y contraseña. El alias debe estar registrado y la contraseña dada debe corresponder a la que se encuentra registrada con ese, si esto no ocurre, se le notifica al usuario con un mensaje de error y no se conecta.
b. Si el jugador se registra, verifica el alias dado. No debe existir un jugador con el mismo alias, si esto ocurre, se le notifica al usuario con un mensaje de error y no se registra ni se conecta.

2. Enviar a cada jugador la información de su oponente, una vez se establece una batalla.

Una vez establecida la batalla, el servidor es el responsable de la administración del juego. Esto implica que el servidor debe:

1. Determinar aleatoriamente los turnos e informarle a los jugadores su turno.
2. Notificar el resultado de un ataque a los dos jugadores.

Una vez finalizada la batalla (cuando un jugador derrote los 4 pokémon de su oponente), el servidor debe cerrarla. Esto implica que el servidor debe:

1. Registrar un juego ganado al jugador victorioso.
2. Registrar un juego perdido al jugador derrotado.
3. Notificar el fin del juego a los dos jugadores.
4. Notificar a los dos jugadores el alias del jugador victorioso.


Finalmente, el servidor debe ofrecer las siguientes opciones al usuario:

1. Mostrar las batallas que se encuentren en curso.
2. Mostrar las estadísticas históricas del juego. Se debe mostrar el alias de cada jugador que haya participado en una batalla, la cantidad de victorias y de derrotas, y su porcentaje de efectividad. Este último se define de la siguiente manera:

% Efectividad = Batallas ganadas * 100 / Total de batallas

La información histórica de las batallas debe ser persistente y se debe almacenar en una base de datos, de manera que cada vez que se ejecute de nuevo el servidor, las estadísticas sean presentadas al usuario.

 

Interfaz

n12 pokemon cliente1

Diálogo de inicio. El usuario puede elegir si desea iniciar sesión o registrarse.

 

 

n12 pokemon cliente2

Interfaz principal en batalla.

 

 

n12 pokemon servidor

Interfaz del servidor