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.