Cursos‎ > ‎Sábados Mañana - Anual‎ > ‎

Tp4 Objetos

Plantas Vs.  Zombies!

¡Siiii! ¡Como no podían faltar Plants vs Zombies versión objetosa!

Nuevamente los Zombies intentan atacarnos para comernos el cerebro (o-nom-nom-nom-nom!).

Nuestro jardín del frente tiene lugar suficiente para poner plantas que nos ayuden a eliminarlos.

Nuevamente contamos con un conjunto de plantas:

  • PeaShooter: Planta terrestre.
  • GatlingPea: Un tipo particular de PeaShooter que dispara 4 veces lo que dispara el PeaShooter.

Todas las *Pea*, tienen una vida de 40.
  • WallNut: Sirve como escudo para frenar a los zombies, si bien no hace daño tiene una vida de 200, lo que da más tiempo para atacar.

  • LilyPad: Permite poner sobre el agua una planta de tierra. Tiene 10 puntos de vida.
  • SeaShroom: Dispara con un poder de 1 y tiene 20 puntos de vida.


Entonces tenemos dos tipos de terrenos Tierra y Agua; cada planta sólo puede crecer en un terreno. En el caso en el cual se quiera ubicar una planta en un terreno incompatible se debe lanzar un error correspondiente. Las líneas (o filas) que forman el jardín y son por las cuales se mueven los Zombies, tienen siempre el mismo tipo de terreno. 


Tener en cuenta también que el jardín define la cantidad máxima de plantas que se pueden agregar por cada línea (sí adivinaron, también esperamos un error en este caso...).



.


Por supuesto que hay Zombies, todos hacen daño de 10, pero es posible que cambie porque puede incrementarse a medida que el virus que los transforma evoluciona. La vida que tienen es propia de cada zombie (lo cual es como una ironía, hablando de un zombie).

Pueden usar distintos artículos para aumentar su resistencia:

  • Cono: Da una protección inicial de 5 puntos. Cuando un zombie que tiene un cono protegiéndolo recibe un ataque, el ataque afecta al cono y no al zombie en sí. Al llegar a cero (o menos), el cono deja de proteger al zombie y este recibe los ataques en forma normal.

  • Balde: En realidad estos zombies despistados llaman balde a un cono metálico, que no es más que un cono que tiene un multiplicador de potencia y resistencia (el mismo para ambos) de acuerdo con la aleación de metal que hayan usado. Cuando un zombie que tiene un “balde” en la cabeza ataca, pega cabezazos que multiplican su potencia normal de acuerdo con el multiplicador. Además, su protección inicial es multiplicada de igual forma respecto de la de un cono común.

  • Short de Los Pumas: La presencia de al menos un zombie con un short de Los Pumas hace que la formación entera reduzca la distancia a las plantas en dos unidades por turno, en lugar de una, ya que aumenta el empuje.

  • Atención: Puede ser muy útil modelar el objeto que represente el “no-artículo” y ponerle comportamiento para poder trabajar en forma homogénea con todos los zombies, tengan o no un artículo.

  • Asumir que los zombies que atacan por agua ya tienen sus correspondientes patitos salvavidas. No vamos a modelar esto.


Los Zombies se organizan en oleadas para atacar el jardín, y cada una tiene una formación de zombies por cada línea de ataque de nuestro jardín.


Se pide:

  1. Agregar una planta a una línea del jardín. Tener en cuenta que importa el orden y también se debe controlar el tipo de terreno. Una planta de tierra debe plantarse sobre tierra o sobre un lillyPad en agua, por lo que para plantarlo en una línea de agua debe haber un lillyPad disponible (vacío). Si se intenta plantar una planta indebida, lanzar un error. Lo mismo si se sobrepasa la cantidad máxima para ese jardín.
  2. Saber si un jardín tiene plantas en cualquiera de sus líneas.
  3. Saber si una oleada tiene zombies en cualquiera de sus formaciones.

  4. Saber el poder de ataque de una planta:
    1. Cada “pea” disparado tiene un poder de 5.
    2. El poder de un Sea Shroom es de 3.
    3. El poder de un WallNut es de 0, porque no ataca. Lo mismo con el LillyPad.
  5. Modelar los ataques individuales:
    1. Que una planta ataque a un zombie. Si el zombie muere, se deberá lanzar una excepción.

    2. Que un zombie ataque a una planta. Si la planta muere, se deberá lanzar una excepción.
  6. Modelar las batallas entre zombies y plantas:
    1. Hacer que una planta ataque a una formación de zombies. Siempre ataca al primer zombie de la formación y, si el zombie muere, debe quitarse de la formación.

    2. Hacer que una formación de zombies ataque a una planta, si puede. La formación de zombies puede atacar a la planta cuando redujo a cero su distancia.

    3. Hacer que la línea de plantas entera batalle con la formación de zombies. Esto es hacer que cada planta de la línea ataque a la formación y que la formación ataque a la última planta, si puede. Si una planta muere debe eliminarse de la línea de plantas o del lillyPad que la sostiene (cuidado: no eliminar un LillyPad de la línea porque muera la planta que éste sostiene, pero sacarle esa planta muerta). La distancia inicial deberá haber sido indicada anteriormente.

    4. Hacer que el jardín batalle un turno con una oleada de zombies. En cada turno, cada formación de la oleada de zombies debe avanzar, reduciendo la distancia hasta las plantas según lo indicado anteriormente. La distancia inicial de cada formación a la línea de plantas se calcula como el tamaño del jardín menos la cantidad de plantas en la línea.
      Nota: Para esto, pueden usar el mensaje with:do: que entienden las colecciones. Este recibe como primer parámetro otra colección y como segundo un bloque de 2 argumentos que se evalúa para cada par de elementos de la primera y la segunda colección respectivamente (el primero con el primero, segundo con el segundo, etc). Si el size de las 2 colecciones es distinto, arroja una excepción

    5. Hacer que el jardín batalle contra una oleada de zombies, hasta que no haya más plantas o no haya más zombies.
      Nota: Para esto pueden usar el mensaje whileTrue: que entienden los bloques y que recibe un bloque como argumento. Si el bloque receptor se evalúa a true, entonces evalúa el bloque argumento y vuelve a evaluar el bloque receptor. Esto se repite hasta que el bloque receptor se evalúe a false.

Algunos tests que podemos pedir que supere el modelo::

  • No se pueden agregar 5 plantas en una misma línea en un jardín que permite un máximo de 4, lanzar un error.
  • Una planta acuática no se puede plantar en una línea de tierra, lanza un error.
  • Una planta terrestre sí se puede plantar en una línea de tierra.
  • Una planta terrestre no se puede plantar en una línea de agua sin LillyPads disponibles, lanza un error.
  • Una planta terrestre sí se puede plantar en una línea de agua con LillyPads disponibles.
  • A una línea acuática con 2 LillyPads disponibles (sin plantas) se le intentan plantar 3 PeaShooters y lanza un error en el tercero.
  • Un zombie sin artículos y con 4 de vida es atacado por un PeaShooter y muere.
  • Un LillyPad sin planta es atacado por un zombie y muere.
  • Un LillyPad con un PeaShooter con 10 de vida es atacado por un zombie y se queda sin el PeaShooter.
Comments