# Reconquistando la Tierra de Fantasía En esta aventura acompañarás a una raza de guerreros en su misión por reconquistar la tierra que le ha sido arrebatada en anteriores batallas. Estos guerreros han recobrado fuerzas y disponen de un ejército que consideran suficientemente poderoso para emprender esta epopeya. De camino a la tierra deseada se encontrarán con diversos poblados, algunos de los cuales son hostiles y deberán vencer para poder continuar el camino. Otros, son aliados, y permitirán que las tropas descansen. Es importantísimo no desperdiciar recursos y, aún a riesgo de no encontrar poblados aliados, recorrer el menor camino entre su ubicación actual y la tierra destino: el tiempo apremia. Cada batalla o descanso, duran un día. Se te buscó, hechicero del código, para que prepares unos conjuros algorítmicos que predigan si esta misión es factible, y si así lo fuera, cuántos guerreros llegarían hasta el final del camino y en cuánto tiempo. ## Datos para resolver el problema ### Razas Un **Wrives** tiene una salud inicial de 108. Utiliza magia, y su rango de ataque es de 14 a 28 metros. Ocasiona un daño básico de 113 puntos. Cuando ataca, lo hace con 2 veces su daño, cada 2 ataques. Al recibir un ataque recibe 2 veces el daño, ya que no lleva armadura. Cuando descansa, medita, y como considera la violencia como algo malo, se rehúsa a atacar hasta que lo ataquen. Gracias a esto, aumenta su salud y su salud máxima en 50. Una **Reralopes** tiene una salud inicial de 53. Utiliza una catapulta, y su rango de ataque es de 5 a 46 metros. Ocasiona un daño básico de 27 puntos. Cuando ataca, erra 2 de cada 4 ataques. Al recibir un ataque se desconcentra y sus ataques vuelven al valor normal inicial. Cuando descansa, se concentra y sus próximos 3 ataques dañan el doble del valor correspondiente. Una **Radaiteran** tiene una salud inicial de 36. Utiliza shurikens, y su rango de ataque es de 17 a 41 metros. Ocasiona un daño básico de 56 puntos. Cuando ataca, lo hace cada vez con más fuerza (3 de daño extra x la cantidad de ataques dados). Al recibir un ataque lo hace normalmente. Cuando descansa, no le sucede nada. Un **Nortaichian** tiene una salud inicial de 66. Utiliza un arco, y su rango de ataque es de 16 a 22 metros. Ocasiona un daño básico de 18 puntos. Cuando ataca, se cura un 4 por ciento de su salud. Al recibir un ataque se enfurece y sus ataques multiplican por 2 su daño (dura 2 turnos). Cuando descansa, recupera toda su salud, pero se vuelve de piedra por 2 turnos, lo que hace que no pueda atacar, pero reduce el daño entrante en 1/2. ### Batallas Las batallas en la Tierra de Fantasía se realizan de una manera muy ordenada: 1. Se forman ambos ejércitos en línea 2. Siempre comienza a atacar nuestro ejército 3. Se turnan ambos ejércitos para atacarse 4. Al quedarse con la salud en cero, la unidad se desmaya y queda fuera de combate 5. Termina el combate cuando un ejército se queda sin contenidentes de pie ### Poblados Se suministrará un archivo con la información de los caminos que interconectan a los poblados, y los datos de dicho poblado. Por ejemplo: ``` 4 1 100 Wrives propio 2 30 Reralopes aliado 3 40 Nortaichian enemigo 4 60 Nortaichian enemigo 1 -> 4 1 2 10 1 3 20 2 3 5 3 4 7 ``` En ese archivo figura toda la información necesaria para la predicción: - Una línea con la cantidad de pueblos (n, 4 en el ejemplo) - n líneas autonumeradas, que representan cada pueblo, con el total de habitantes, la raza, y si es `propio / aliado / enemigo`. - Una línea que indica el pueblo inicial, y el pueblo final (`1 -> 4`) - x línas que indican el costo de trasladarse entre cada par de pueblos, siendo estos datos pueblo de origen, pueblo destino, costo del traslado en días. ## Condiciones 1. Las razas deberán programarse utilizando la técnica de TDD. A cada prueba escrita deberán asignarle un número consecutivo, que evidencie el desarrollo incremental. Por ejemplo, `prueba001`, `prueba002`, etc. Por supuesto, separar las pruebas en distintas clases, según qué raza se está probando. Se verificará una cobertura mayor al 92%. 2. El camino más corto deberá calcularse utilizando un algoritmo de grafos apropiado. El mismo deberá programarse en términos de un grafo y no de los terrenos, para poder ser reutilizado en futuros usos. 3. El mapa es único para todo el problema, y debe poder accederse a la misma instancia desde cualquier clase que lo requiera. Utilizar un patrón de diseño para este comportamiento. 4. Tanto el ejército como la unidad individual deben poder tratarse de manera uniforme para el ataque, la recepción de golpes y el descanso. Utilizar un patrón de diseño para este comportamiento. ## Puntos extra El grupo que dada una configuración que resulte en derrota, pueda dar programáticamente una alternativa determinística que acabe con la victoria, teniendo el menor costo posible, con una complejidad computacional aceptable. ## Sobre las entregas Cada equipo tiene asignado **un/a tutor/a**, el cual los acompañará durante el desarrollo del trabajo práctico, y será quien lo corrija. Es importante que aprovechen esta relación para evacuar dudas, discutir implementaciones, y coordinar las entregas. Todo esto debe ser coordinado con su tutor previamente, con suficiente antelación. Habrá una **preentrega**, para confirmar que el rumbo que tomaron es el correcto, más allá de las consultas que puedan coordinarse. Esta preentrega deberá tener al menos el diagrama de clases del problema, para poder discutir la solución. La **fecha de esta primera aproximación se coordinará con cada tutor**. Para la entrega final, el 22 y 23 de Junio (dependiendo su día de cursada), se deberá disponer de los siguientes entregables: * **Diagrama de clases** actualizado (.jpg) * **Pruebas unitarias** del código * El **código** debidamente comentado, formateado y sin errores de compilación * Un **main** que evidencie el funcionamiento del programa * Al menos **cuatro archivos de entrada** de prueba significativamente diferentes, para poder ejecutar distintas versiones del problema. * Un **pequeño informe** que explique el trabajo realizado (.pdf). Este informe no debe explicar el código, sino cómo se pensó la solución y cómo se distribuyó el trabajo.