Prácticas de la asignatura de Programación Orientada a Objetos. Grado en Ingeniería Informática _______________________________ Curso 2023/2024 Práctica grupal de la convocatoria ordinaria. A-POO-Calipsis zombi Pues ya está, ha ocurrido. El apocalipsis zombi ha empezado en el campus de Móstoles de la URJC. Los estudiantes inundan las redes con mensajes sobre lo que está pasando. "Sabía que los exámenes finales eran mortales, ¡pero esto es ridículo!" "Bueno, al menos ahora sé cómo se siente tener que escapar de un bucle infinito en la vida real." "No sé si prefiero los zombis o POO, pero al menos en el apocalipsis zombi, no tengo que preocuparme por herencias ni polimorfismo." “Cuando empezó el apocalipsis zombi estaba a punto de entrar en clase de POO, así que ni tan mal”. “Me viene fatal. Quisiera ver si estos zombis seguirían con ganas de ir correteando por ahí si tuvieran que prepararse 3 parciales y 4 entregas de prácticas en las próximas semanas.” “¿Que cómo mordieron al profesor? Se quedó en el aula llena de zombis diciendo algo sobre lo contento que estaba de que hoy le estuvieran prestando tanta atención” En este trabajo se pide diseñar e implementar las clases necesarias para hacer funcionar un sencillo juego de supervivencia en un apocalipsis zombi. En este juego se tienen que modelar varios conceptos y entidades, algunos de los cuales tiene que deducirlos el alumno y otros se comentan a continuación(*). NOTA (*): Es posible que el alumno tenga que añadir información a las entidades aquí identificadas si lo considera relevante en su diseño. El Superviviente Los supervivientes tienen las siguientes características: - Un nombre que identifica al personaje. - Un estado que es un valor que puede variar entre VIVO y ELIMINADO. - Un valor entero que representa el número máximo de acciones que puede ejecutar. En la práctica serán 3 acciones. - Un conjunto de hasta 5 instancias de Equipo (ver más adelante). - Tiene la posibilidad de tener hasta dos Armas activas (una en cada mano). - Un entero con la cuenta del número de zombis eliminados. - Un entero con la cuenta de las heridas recibidas. El Superviviente es eliminado con dos heridas. El Zombi Los zombis no son todos iguales, pues se han identificado 3 tipos de zombi distintos según reaccionan a los ataques. Dentro de cada tipo de zombi, hay más tipos distintos según su aguante y velocidad. Lo que tienen todos los zombis en común es: - - - El aguante: sería un valor que expresa la vulnerabilidad del zombi ante los ataques que se realizan con un Arma determinada (más adelante se ven las armas). Si el zombi tuviera aguante 3, sería imposible de eliminar por armas de potencia 1 ó 2 por muchos ataques que recibiera de ese arma. El arma tendría que tener potencia 3 para eliminar a un zombi de aguante 3. Número de activaciones: Los zombis se activan después del turno de los supervivientes. Algunos zombis tendrán 1 activación y los más rápidos tendrán 2 activaciones. En cada activación los zombis hacen lo mismo: si están en la misma casilla que un Superviviente, lo muerden. Si no, moverán una casilla hasta el Superviviente más cercano. Todos los zombis tienen que poder reaccionar ante un ataque, pero no lo hacen igual. Las reacciones ante ataques de todos los zombis necesitan recibir al superviviente atacante y el arma que está usando. El primer tipo de zombi es el Caminante Normal. Este zombi tiene aguante = 1 y el número de activaciones es 1. Su reacción ante un ataque es que encuentra la muerte definitiva si el arma con el que le atacan tiene una potencia igual a su aguante (1) y el ataque no falla. El segundo tipo de zombi es el Caminante Berserker. Este zombi tiene el mismo aguante y el mismo número de activaciones que el Caminante Normal (todos los que son caminantes tienen ambas características iguales). Su reacción ante un ataque tiene la peculiaridad de la inmunidad a los ataques con armas a distancia. Estos zombis han desarrollado unas placas protectoras que les protegen de balas, flechas y de cualquier ataque a distancia. Con armas de cuerpo a cuerpo reaccionan exactamente igual que los Caminantes Normales. El tercer tipo de zombi es el Caminante Tóxico. Este zombi tiene el mismo aguante y número de activaciones que los otros dos Caminantes. Su reacción ante los ataques implica que el Superviviente que le ataca sufre también una herida si está en la misma casilla que el Zombi Tóxico. Estos zombis tienen sangre tóxica y al salpicar hieren al Superviviente que les atacó (sólo si está en la misma casilla, la sangre tóxica no tiene mucho alcance). También hay que modelar al Corredor Normal. Este zombi tiene aguante = 1 pero el número de activaciones es 2. Su reacción ante ataques es la misma que la de un Caminante Normal. De la misma manera, hay que modelar al Corredor Berserker y al Corredor Tóxico. Estos zombis tienen las mismas características que el Corredor Normal (aguante = 1 y número de activaciones = 2) pero el Corredor Berserker tiene la misma reacción ante ataques que el Caminante Berserker y el Corredor Tóxico tiene la misma reacción ante ataques que el Caminante Tóxico. Por último, están los zombis Abominación Normal, la Abominación Berserker y la Abominación Tóxica. Todas las Abominaciones tienen aguante = 3 y su número de activaciones es 1. El comportamiento ante ataques de la Abominación Normal es la misma que la del Caminante Normal. El comportamiento ante ataques de la Abominación Berserker es la misma que la del Caminante Berserker. El comportamiento ante ataques de la Abominación Tóxica es la misma que el del Caminante Tóxico. Activables El Superviviente y el Zombi son dos entidades que no son lo mismo, pero tienen algunas cosas en común: son dos entidades activables. Un entidad activable puede activarse, moverse o atacar. Activarse y moverse serían dos comportamientos de entidades Activables que requieren información sobre un Juego (ver más adelante). Mientras que atacar sería un comportamiento de una entidad activable que actuaría sobre otra entidad activable. Además, las entidades activables también tendrían que tener el comportamiento de devolver una coordenada (la casilla en la que se encuentran). Equipo. El equipo son elementos que puede llevar un Superviviente. Hay dos tipos de Equipo: Armas Las armas pueden ser armas activas en un Superviviente. Tienen varias características. - - - Nombre, que identifica el arma. Potencia. El valor de daño que puede hacer un arma. Las armas de potencia 1 podrán eliminar a zombis de aguante 1, las armas de potencia 2 a los zombis de aguante 2 y así sucesivamente. AlcanceMáximo. Las armas de cuerpo a cuerpo tienen alcance 0 (se pueden usar en la misma casilla en la que se encuentra el superviviente). Las armas a distancia tendrán un valor mayor que cero que indicará a cuántas casillas de distancia se puede atacar. NúmeroDados. El número de dados que lanza el arma (ver más adelante cómo funciona el ataque de los supervivientes). ValorÉxito. El valor que tiene que igualar o superar cada dado para considerarse un éxito. Cada éxito de un arma sirve para aplicar su potencia a un zombi. Si se obtienen 3 éxitos con un arma de potencia 1, podrían eliminarse 3 caminantes (por ejemplo). Provisiones. Las provisiones tienen otras características: - Nombre que identifica la provisión. Valor energético. Un número real con las kCal que proporciona el alimento. Caducidad. Una fecha. Cuando un Superviviente hace una acción de buscar, no sabe si encontrará un arma o provisiones. El alumno puede decidir la probabilidad de cada suceso. Acciones de los Supervivientes. Los supervivientes en su turno tienen 3 acciones. Cuando todos los supervivientes hayan hecho sus acciones, es el turno de las activaciones de los zombis. Las acciones posibles para el superviviente son: - - - - - Moverse. El superviviente puede gastar una acción para moverse de una casilla a otra casilla contigua. Pero si hay zombis en la casilla en la que se encuentra, gastará una acción extra por cada zombi. Es decir, si no hay zombis en su casilla, gasta una acción para moverse a una casilla adyacente. Si hay un zombi, gasta dos acciones para hacer el mismo movimiento. Si hay dos zombis, gasta las 3 acciones en moverse. Si hay 4 zombis, no se puede mover, está rodeado. Buscar. El superviviente puede gastar una acción para buscar en su casilla una instancia de Equipo. Obtiene aleatoriamente una instancia de Equipo. No se puede buscar dos veces en la misma casilla. Atacar. El superviviente puede gastar una acción para atacar a una casilla usando un arma equipada. Los éxitos obtenidos se emplearán en eliminar todos los zombis posibles de esa casilla. Elegir arma. El superviviente puede gastar una acción en elegir un arma que tenga en su inventario (puede tener hasta 5 instancias de equipo) para que sea una de sus armas activas. No hacer nada. El superviviente simplemente puede gastar su acción sin hacer nada. Ataque de los supervivientes El ataque sigue estos pasos: - - - El superviviente elige una de las armas que tiene activas (si tiene más de una). El superviviente elige la casilla objetivo. Se obtienen tantos números aleatorios entre 1 y 6 como el número de dados que tenga el arma (si el arma tiene NúmeroDados = 3, se generan 3 números aleatorios entre 1 y 6). Se cuenta la cantidad de números que igualan o superan su valor de éxito. (Si el arma tenía un valor de éxito de 4 y los números generados han sido 3,4 y 6 entonces el número de éxitos es 2). Se recoge el resultado de aplicar el ataque a todos los zombis de la casilla hasta que se eliminen dos zombis o ya se haya comprobado con todos. Ejemplo: Atacar con un arma a distancia de alcance = 1, potencia = 1, número de dados = 3 y valorÉxito = 4. Se ataca a una casilla adyacente donde hay un Caminante Berserker, una Abominación Normal y un Corredor Tóxico. Se obtiene un 2, un 5 y un 6. Como hay dos éxitos, hasta que no se eliminen dos zombis o se haya comprobado la reacción de todos los zombis de la casilla, se hará la comprobación de la reacción de un zombi de la casilla ante el ataque. Se comprueba la reacción del Caminante Berserker. El alcance del arma es 1, por lo que es un arma a distancia y no afecta al Caminante Berserker. Se comprueba la reacción de la Abominación Normal. Como tiene aguante = 3 y el arma tiene potencia = 1, no afecta a la Abominación Normal. Se comprueba la reacción del Corredor Tóxico. El Corredor Tóxico es eliminado (aguante = 1). No ocurre nada más porque la sangre tóxica no salpica al Superviviente (el zombi está en la casilla adyacente, el ataque era a distancia). Se ha eliminado 1 zombi (el Corredor Tóxico). El otro éxito del ataque se pierde. El juego El juego contiene todos los supervivientes, zombis y equipo que se generen. Además, el juego contiene una cuadrícula de coordenadas bidimensionales. Los supervivientes y zombis se mueven por esa cuadrícula. El juego debe permitir que los supervivientes hagan sus acciones y controlar las activaciones de los zombis. La cuadrícula tendrá un tamaño de 7x7 casillas si hay 1 Superviviente. El tamaño será de 8x8 casillas si hay 2 Supervivientes. Será de 9x9 casillas si hay 3 Supervivientes y 10x10 si hay 4 Supervivientes. No se permiten más Supervivientes. Tiene que haber una casilla objetivo. Los Supervivientes empiezan en una esquina de la cuadrícula y el objetivo está en la esquina opuesta. Inicialmente aparecen tres zombis aleatorios en casillas aleatorias por cada superviviente en la partida. Cuando todos los supervivientes alcancen la casilla objetivo con al menos una instancia de Provisiones por superviviente, el juego finaliza. Si todos los supervivientes son devorados, el juego finaliza. También tiene que haber una opción de finalizar el juego a voluntad. El sistema de juego consiste en un turno para cada superviviente, que realizará sus 3 acciones. Después se activarán todos los zombis (cada zombi puede tener distinto número de activaciones) y aparecerá un zombi nuevo aleatorio en una casilla aleatoria por cada superviviente en la partida. Se repite esto hasta el fin del juego (turnos de jugadores, luego activaciones de zombis y luego aparición de zombis). Cuando se hace una aparición de zombis, los Caminantes tienen un 60% de probabilidad de aparecer, los Corredores un 30% y las Abominaciones un 10%. Dentro de estas categorías, las variantes Normal, Berserker o Tóxica son equiprobables. La probabilidad de que se descubra un arma de potencia 3 cuando un superviviente busca, es de 5%. NOTA: El main NO es el juego. El juego tiene entidad propia. NOTA2: Separad la lógica de negocio de la interacción con el usuario. Esto es que no hagáis métodos de la funcionalidad principal de las clases que requieran el uso de System.out.println o de Scanner, porque si lo hacéis luego no podréis incluir la la inferfaz gráfica con facilidad. __________________________________________________________________ El alumno debe modelar el sistema propuesto y realizar una aplicación que cumpla con los siguientes requisitos: 1. Crear Supervivientes, Zombis y Equipo. Se tiene que poder comprobar la generación de todas estas entidades. 2. Poder visualizar supervivientes, zombis y equipo. 3. Poder visualizar todo lo que ocurre en una partida (resultados de dados, heridas infligidas, resultados de ataques, provisiones con las que terminan los supervivientes…). 4. Poder comprobar de manera aislada el ataque de un superviviente a un zombi elegido a voluntad con un arma del juego (viendo todo lo que ocurre). 5. Poder comprobar de manera aislada el ataque de un zombi a un superviviente (viendo todo lo que ocurre). 6. Comprobar de manera aislada que los supervivientes hagan las búsquedas de Equipo. 7. Visualizar un registro de todos los zombis que ha eliminado un Superviviente después de una partida. 8. Visualizar un registro después de la partida de los zombis que han mordido a supervivientes. 9. El juego tiene que ser persistente. Eso quiere decir que podemos salir del programa y cuando volvamos a entrar se debe poder continuar la partida. 10. Crear una interfaz gráfica de usuario (Nota: no realizar este apartado implicará que la nota final de la práctica no podrá ser mayor de 7). Entrega: A lo largo del cuatrimestre habrá dos hitos evaluables a cumplir: 1. Diseño del sistema. Se entregará un documento donde se recoja un diagrama de clases que represente todo el sistema. Dicho diagrama se debe justificar y explicar en una memoria adjunta. Fecha de entrega: 23 de octubre. 2. Entrega final. Sistema completamente funcional con todos los apartados implementados. Los alumnos deberán entregar una memoria final que muestre el trabajo realizado y su evolución (cómo ha evolucionado el diseño a lo largo del cuatrimestre). Asimismo se debe hacer una entrega del código fuente necesario para compilar y ejecutar el programa. Los alumnos tendrán que defender el trabajo ante el profesor (las fechas de la defensa se concretarán después de la entrega). Fecha de entrega: 22 de diciembre. IMPORTANTE: Es responsabilidad del alumno asegurarse de que el programa funciona en el ordenador donde vaya a hacer la defensa (que puede ser uno de los laboratorios de la URJC o un ordenador propio del alumno).