Está en la página 1de 6

En todo jardín nos encontramos con una situación muy común: el ataque de los zombies.

Es nuestro deber defender nuestros hogares de estos comedores de cerebros.

La forma más efectiva de repeler el ataque de zombies, claro está, es por medio de
plantas, como todos sabemos.

Para afrontar la grave situación en nuestros jardines se necesita de la codificación de un


programa Haskell que modele esta problemática.

Nuestro querido vecino ​Crazy Dave nos cuenta que, para defendernos de los ataques
zombies, se plantean distintas líneas (o carriles) de defensa, donde cada línea tiene una
serie de plantas que protegen la casa de aquellos zombies que pasan por la misma; por
ejemplo una línea podría tener dos SunFlowers, seguidas de una PeaShooter (es decir, 3
en total), o bien dos SunFlowers, una Nut y una PeaShooter (4 plantas), y a su vez tener
los zombies que la atacan, como podrían ser 2 zombies básicos y uno con un cono en la
cabeza. Más adelante se darán ejemplos más concretos.

Se pide:

1. Modelar las plantas y zombies definidos a continuación mediante funciones


constantes y definir funciones que permitan consultar sus características:
a) Cada planta está definida por una especie, una cantidad de puntos de vida,
una cantidad de soles que produce y un poder de ataque que daña a un
1
zombie. Los soles actúan como una moneda que sirve para poder “comprar”
y agregar más plantas para nuestra defensa. Por ahora, esa parte no la
modelamos.
Aquí varios ejemplos de plantas que se requieren modelar:
● PeaShooter: No genera soles, tiene 5 puntos de vida y su nivel de
ataque es de 2 puntos.
● Repeater: Es igual al Peashooter, excepto que su nivel de ataque es
el doble.
● Sunflower: Tiene 7 puntos de vida, produce 1 sol y no hace ningún
tipo de daño.
● Nut: No hace daño ni genera soles... pero aguanta 100 mordiscos.

b) Los zombies cuentan con un nombre, algunos accesorios y un valor que


representa el daño que le causan a una planta con su mordida:
● Zombie Base: Se llama simplemente “Zombie” y es el zombie más
simple, como su nombre lo sugiere. No lleva ningún accesorio y su
mordida hace 1 punto de daño.
● Balloon Zombie: Es muy similar al zombie básico, con la diferencia de
que cuenta con un globo entre sus accesorios y su nombre es “Pepe
Colgado”.
● Newspaper Zombie: Su nombre es “Beto el chismoso”, lleva consigo
un diario a todas partes, y hace 2 puntos de daño con su mordida.
● Gargantuar: Su nombre completo es ‘Gargantuar Hulk Smash Puny
God’. Carga con un poste de tendido de cableado que encontró
(quién sabe dónde) y lleva también un zombie enano, que
posiblemente sea su mejor amigo. Muerde con una fuerza de 30
puntos.

Además, ​para todo zombie, se debe poder determinar su ​nivel de muerte​. El


mismo se calcula como la cantidad de letras que tiene su nombre, y puede
2
asemejarse a la vida de una planta. Un zombie muere cuando su nivel de
muerte llega a cero... irónico, ¿no?

2. Se requiere poder determinar:


a. De qué especialidad es una planta. Tener en cuenta para esto que:
● Las plantas que dan soles son de especialidad “Proveedora”
● Las plantas cuyo poder de ataque multiplicado por 2 resulta mayor a
su nivel de vida, son de especialidad “Atacante”.
● Si no cumplen con ninguna de las condiciones anteriores son de
especialidad “Defensiva”.

Por ejemplo:

> especialidad sunflower


“Proveedora”

b. Si un zombie dado es peligroso. Esto ocurre cuando tiene más de un


accesorio o su nivel de muerte es mayor a 10.
Por ejemplo:

> esPeligroso gargantuar


True

> esPeligroso zombieBase


False

3. Como nos decía Crazy Dave anteriormente, los jardines están formados por líneas de
defensa, en las cuales puede haber tanto plantas como zombies (que están atacando
por esa línea). Algunos ejemplos de líneas son:

linea1 = LineaDeDefensa {
plantas = [sunflower, sunflower, sunflower],
zombies = []
}
linea2 = LineaDeDefensa {
plantas = [peaShooter, peaShooter, sunflower, nut],
zombies = [zombieBase, newspaperZombie]
}
linea3 = LineaDeDefensa {
plantas = [sunFlower, peaShooter],
zombies = [gargantuar, zombieBase, zombieBase]
}
linea4 = LineaDeDefensa {
plantas = [peaShooter],
zombies = [zombieBase]
}

Se pide:

a. Crear las funciones que hagan falta para:


i. Agregar una planta a una línea (se agrega al final).
3
ii. Agregar un zombie a una línea (se agrega al final).
Nota: ​¡No repetir código!

b. Saber si una línea está en peligro, que es cuando el total de ataque de todas
las plantas es inferior al total de mordiscos de todos los zombies, o bien
todos los zombies de esa línea son peligrosos y hay al menos un zombie.
> estaEnPeligro linea2
False

> estaEnPeligro linea3


True

c. Poder determinar si una línea necesita ser defendida, esto pasa cuando
todas las plantas de esa línea son proveedoras. Por ejemplo:

> necesitaSerDefendida linea1


True

> necesitaSerDefendida linea3


False

d. Responder (agregar un comentario con la respuesta en el archivo con el


código).
i. ¿Qué pasaría al consultar si una línea está en peligro si hubiera una
cantidad infinita de zombies bases en la misma?
ii. ¿Qué pasaría al consultar si una línea con una cantidad infinita de
PeaShooters necesita ser defendida? ¿Y con una cantidad infinita de
Sunflowers?
Justificar las respuestas conceptualmente.

4. Saber si una línea es mixta, que es cuando ninguna de las plantas de la línea tiene
la misma especialidad que su inmediata siguiente. Además, la línea debe tener al
menos dos plantas.
Nota: ​No usar length (ni ninguna función que tenga el mismo propósito).

> lineaMixta linea2


False

5. Conocer el resultado del ataque de...


a. Una planta a un zombie: Cuando una planta ataca a un zombie, lo daña
según su potencia de ataque, pero ese daño consiste en quitarle al nombre
del zombie las primeras n letras, siendo n la potencia de ataque de la planta.
Cuando el nivel de muerte del zombie llega a cero, sabemos que es
derrotado, pero eso no se refleja por ahora.
b. Un zombie a una planta: El zombie muerde a la planta causándole un daño
a la vida equivalente a la fuerza de su mordida.

4
CASOS DE PRUEBA

PUNTO 1

Descripción Resultado Esperado

Consultar el poder de ataque de un ​PeaShooter 2

Consultar el poder de ataque de un ​Repeater 4

Consultar la cantidad de soles que otorga un ​Sunflower 1

Consultar cuántos soles da un ​Nut 0

Determinar cuántos artículos tiene un ​Ballon Zombie​. 1

Consultar el poder de mordida de un ​Newspaper Zombie 2

Determinar el nivel de muerte de un ​Gargantuar 30

PUNTO 2

Descripción Resultado Esperado

Determinar la especialidad de un ​Nut Defensiva

Determinar la especialidad de un ​Sunflower Proveedora

Determinar la especialidad de un ​Repeater Atacante

Saber si un ​Zombie Base​ es peligroso No


(no tiene artículos y su
nivel de muerte es de 6)

Saber si un ​Gargantuar​ es peligroso Sí


(tiene 2 artìculos y su
nivel de muerte es 30)

PUNTO 3

Descripción Resultado Esperado

Tras agregar una planta a ​línea 1​, determinar la cantidad de plantas 4


de la línea

Tras agregar un zombie a ​línea 2,​ determinar la cantidad de 3


zombies

Saber si la​ línea 1​ está en peligro No


(el total de ataque es 0,
pero no hay zombies)

Saber si la ​línea 3​ está en peligro Sí


(el total de ataque es 1 y
el de mordiscos es 32)

Saber si la ​línea 1​ necesita ser defendida Sí


(sólo tiene Sunflowers,

5
que son proveedoras)

Saber si la ​línea 2​ necesita ser defendida No


(tiene PeaShooters, que
no son proveedoras)

PUNTO 4

Descripción Resultado Esperado

Saber si la ​línea 2​ es mixta No


(tiene 2 PeaShooters
consecutivos)

Saber si la ​línea 3​ es mixta Sí


(tiene un Sunflower y un
PeaShooter)

Saber si la ​línea 4​ es mixta No


(tiene una sola planta)

PUNTO 5

Descripción Resultado Esperado

Luego de un ataque de un ​PeaShooter​ a un ​Gargantuar​, saber el 28


nivel de muerte del ​Gargantuar (30 - 2)

Luego de un ataque de un ​Sunflower​ a un ​Newspaper Zombie,​ 16


saber el nivel de muerte del mismo (no cambia)

Luego de 2 ataques de un ​Repeater​ a un ​Zombie Base​, saber el 0


nivel de muerte del zombie (su nombre cambia
“Zombie” -> “ie” -> “”)

Luego del ataque de un ​Gargantuar​ a un ​Nut,​ saber la vida del Nut 70


(100 - 30)

Luego del ataque de un ​Balloon Zombie​ a un ​Sunflower​, el nivel de 6


vida del ​Sunflower (7 - 1)

Luego del ataque de un ​Newspaper Zombie​ a un ​Repeater​, la Atacante


especialidad del ​Repeater (no cambia)

Luego del ataque de un ​PeaShooter​ a un ​Zombie Base​, saber la “m”


inicial del nombre del zombie (su nombre cambia
“Zombie” -> “mbie”)

También podría gustarte