Plantas vs Zombies

El juego

Como no puede ser de otra forma los zombies quieren comerse tu cerebro, pero tu misión es evitar que eso ocurra, para ello te defiendes usando plantas aptas contra la invasión zombie!

Pero ojo... no todas las plantas son iguales.

Plantas

Las plantas son las defensoras del jardín y tienen una cantidad de puntos de daño que pueden hacerle a un zombie, que pueden ir desde 0 hasta 100, a su vez también tienen una capacidad defensiva (que se traduce a cantidad de mordiscos que pueden soportar), que puede ir de 1 a 50. Cada mordisco de los zombies daña a la planta y este daño es irreparable. Cuando se recibieron tantos mordiscos como capacidad defensiva que tenía la planta, decimos que la planta ha muerto.

Cuando una planta muere, libera su espacio del terreno.

Cada planta tiene ciertas características particulares, por ejemplo se pueden plantar en diferentes tipos de terrenos:

    • Sobre tierra
    • Sobre agua

Para eso veamos el jardín.

El Jardín

El jardín se compone de filas, cada fila es de un tipo de terreno (en ese tipo de terreno solo se pueden plantar plantas del mismo tipo de terreno). Por ejemplo tenemos un jardín de 6 filas donde 4 son de tierra y 2 son de agua. En las filas de agua solamente se plantan plantas de agua (no hay forma de que haya plantas de tierra).

Las filas tienen “casilleros”, donde se puede plantar una única planta por vez. En principio el número de casilleros no es necesario que sea configurable. Para poner un número, digamos, 5 casilleros por fila.

Zombies

Los enemigos mortales de las plantas son los zombies, que a su vez tienen cierta resistencia, que va de 50 a 100 puntos, cuando un zombie queda con 0 puntos significa que fue vencido.

Estos zombies quieren llegar a tu cerebro atravesando una de las líneas del jardín por lo que se enfrentan a todas las plantas que se encuentren en su camino.

Para esto cada zombie tiene una cierta potencia de ataque. Que se da en número de mordiscos que puede darle a una planta.

Este número irá de 10 a 100.

Más adelante vamos a ver cómo se enfrentan zombies y plantas y como afectan estos valores.

El Jardín Zen

En el Jardín zen se encuentran todas las plantas que utilizaremos para sembrar en nuestro jardín y así defendernos. (Ojo, noten que no tiene el mismo significado que el Jardín Zen del juego original).

También para reducir complejidad inicial, vamos a considerar estas plantas como plantines que se multiplican/clonan. Es decir, son como prototipos, o templates de plantas, que no se consumen.

Entonces, si en mi jardín tengo una planta “Ajo”, puedo plantar en mi jardín todas las que quiero. No sucede que al plantar una se consume ésta del jardín zen.

El jardín se divide en dos zonas:

    • Jardín Terrestre: contiene todas las plantas de tierra.
    • Jardin Acuático: contiene todas las plantas acuáticas

Obviamente no se pueden intercambiar las plantas con las zonas.

Ambos jardines tienen un tamaño finito. Para ponerle un número, digamos, 20 plantas.

Cuando un jugador obtiene una nueva planta para su nuevo jardín zen siempre se posiciona en la variante del jardín que se corresponde, por ejemplo: ganamos el juego del ultimo batallon y como recompensa nos toca un Pea Shooter (que es una planta de tierra de dia), entonces esta aparece directamente en el jardín de tierra del jugador.

La información que se ve en ambos jardines por las plantas que tiene el jugador es:

    • la cantidad de lugares libres en el jardín zen.
    • (por cada planta) la descripción de la planta y sus datos (poder defensivo/ofensivo)
    • Un botón para visitar el próximo jardin (pasa al acuático, o al terrestre, según corresponda).

Acá mostramos un screenshot a modo de ejemplo:

Mejoras a Plantas

A su vez, desde el jardín podemos mejorar una planta.

Para eso, accedemos a una lista de mejoras/poderes, que podrán aumentar el poder ofensivo, o defensivo.

Una mejora tiene además un nombre.

La lista de mejoras la vamos a considerar como fija, algo que ya viene populado en el sistema.

Cada mejora tiene un costo en términos de dinero/recursos.

Allí es donde se utiliza el dinero que se gana al eliminar zombies.

Una posible pantalla seria:

.

Modalidad de Juego y Casos de Uso

A fín de evitar complejidad accidental, nuestro juego no va a ser exáctamente igual al original.

En particular, no queremos pelearnos con la idea de “tiempo” que es central al juego original, donde al pasar el tiempo, los zombies se mueven, pero además las municiones que disparan las plantas, y aparece la noción de día y noche, etc.

No vamos a incluir nada de eso.

Entonces, en nuestra versión simplificada, vamos a tener los siguientes casos de uso:

  • Visualizar y administrar nuestro jardín.
  • Poder agregar una nueva planta a una fila y casillero.
  • Ir al “Jardín Zen”.
  • Poder acceder al “Almanaque de Zombies”.
  • Poner a prueba nuestro jardín atacándolo con un zombie.

Acá ponemos un screenshot de ejemplo, como guía, de una pantalla que agruparía todos estos casos de uso (o el acceso a subcasos de uso):

A continuación explicamos uno por uno los casos de uso:

Visualizar el Jardín

Junto a plantar y a atacar nuestro jardín, debería ser uno de las funcionalidad más importantes. Es la vista del estado de juego.

Nos gustaría:

    • poder ver cuánto dinero tenemos.
    • de las filas y casilleros nos interesa saber cuales tienen plantas.
    • de las plantas, su estado de salud y de paso, su poder ofensivo.
    • de las filas, el tipo de terreno.

Plantar en Casillero

Para prepararnos a la invasión sembramos plantas. Para esto, habrá que seleccionar una fila y un casillero, pero además un plantín a ser plantado.

Los plantines son los que están en el “Jardín Zen” (ver sección de “Jardín Zen” para más detalles).

Como ya dijimos no se puede plantar en un casillero ocupado, ni tampoco en un tipo de terreno distinto al del plantín.

Acceder al Almanaque de Zombies

Caso de uso bastante simple de solo “consulta”, es decir que el usuario entre símplemente a ver detalles de los diferentes “tipos de zombies”.

Nos gustaría poder ver todos sus datos como: nombre, descripción, poder ofensivo y poder defensivo.

Ataque de un Zombie

Este es el caso de uso más importante.

Lo que hay que entender es que a diferencia del juego original, los zombies no aparecen naturalmente. Si no que, para evitar complejidad, el mismo usuario es quien pone a prueba su jardín en un momento dado, eligiendo un tipo de zombie y haciéndolo atacar una de sus filas.

Se puede hacer esto tantas veces como uno quiera o hasta perder el juego.

El juego se pierde cuando el usuario se queda sin plantas, ya que fueron destruidas por los ataques de los zombies.

También vale aclarar que los zombies nunca entran al terreno, ni permanecen en el jardín. Al seleccionar un zombie, una fila y accionar el ataque, se produce algo así como una “pelea” entre ese zombie y las plantas de la fila. Esta pelea termina con cierto resultado (ya veremos más adelante los detalles), y el zombie “desaparece”. No queda en el jardín para seguir atacando otras plantas.

Pueden ver el screenshot que ya presentamos más arriba a modo de ejemplo, en la parte derecha.

En todo caso, es importante al terminar una pelea que se le notifique de alguna forma al usuario lo que sucedió:

  • El zombie “Rabioso” comió su planta “Trebol Asesino” antes de ser eliminado por el “Potus Violento”.
  • El zombie “x” le otorgó $23 como recompensa
  • El zombie “x” le otorgó una planta “y” de recompensa.

Algoritmo de Ataque (Pelea)

El usuario elige un zombie y una fila, y ejecuta el ataque.

El zombie nunca va a entrar y copar una celda, ni nada por el estilo.

En la fila puede haber más de una planta.

Por lo que les proponemos acá un algoritmo para definir cómo pelean las plantas con el zombie

  1. Primero se enfrenta el zombie contra la primer planta más cercana a él, es decir de la derecha o parte exterior del jardín (recorrido inverso de la lista de celdas).
    1. El zombie la ataca según su poder ofensivo, y le saca puntos al estado de la planta.
    2. La planta a su vez, ataca al zombie, según su poder de ataque, y lo mismo (*).
  2. Se checkea:
    1. Murió la planta ?
      1. sí -> se saca del tablero
      2. no ? Queda (se van a atacar nuévamente)
    2. Murió el zombie ?
      1. Sí ? entonces da premio o lo que sea, y termina la pelea ("ésta" pelea).
      2. No ? Entonces sigue atacando. Que podría ser a la misma planta (si no murió) o a la siguiente (posible tip: Pila)
    3. Repite hasta que muera el zombie, o bien mate a todas las plantas.
  3. Si el zombie mata a todas las plantas, se dice que el usuario perdió el juego.

(*) Una variante opcional sería que el zombie sea atacado por todas las plantas de la fila, mientras que el solo ataca a la planta más cercana. Eso lo asemejaría más al juego original. Incluso se podría pensar en que según la distancia de la planta, su poder efectivo será menor, aplicando una especie de "reductor". O sea, si la planta que está al lado del zombie utiliza su poder de ataque al 100%, luego, la que está en el casillero siguiente, supongamos, un 75% de su poder, la que le sigue, 25%, , etc.

Si un zombie muere puede dar un premio, según vimos más arriba.

Recompensas por eliminar zombies

Un zombie muere cuando se queda sin energía (consumida por ataques de las plantas). Ante esta muerte, puede o no, darle un premio al jugador en base a una condición aleatoria con un 50% de probabilidades de dar premio.

daPremio ? random(0,1) >= 0.5

A su vez, el premio puede ser una planta para el jardín en un 25% de los casos (random):

daPlanta ? random(0, 1) <= 0.25

En los otros casos darán puntos según la ecuación:

puntos = random (1, resistenciaInicialdelzombie / 3)

Nota: la planta que dá como premio pueden o bien generarla dinámicamente asignándole los poderes correspondientes y un nombre, o bien podría el juego arrancar con una lista de plantas ya creadas, y en este caso se seleccionaría una en forma aleatoria

plantaPremio = plantas[random(0, plantas.size - 1)]

Almanaque de zombies

En esa pantalla te muestra todos los zombies y sus puntos de resistencia y ataque y el índice de cuántas chances hay de que tire bonus, es básicamente una tabla donde se puede buscar por nombre de zombie.

TP 2 - Jardín Zen en la Web!

Este TP se relaciona con la Unidad 3, es decir con programación web con las tecnologías más tradicionales, o primitivas. En nuestro caso utilizando Servlets y JSP's en lo que se denomina arquitectura o patrón Model 2.

Este conjunto de tecnologías suele ser más interesante para que se introduzcan a los aspectos más tecnológicos o de bajo de nivel de la web, es decir HTML, HTTP, request, response, session, etc.

Pero hoy en día suena bastante criticable la idea de construir una aplicación web productiva con esta arquitectura ya que dificulta la reutilización, la abstracción, el diseño, etc.

Por esto es que este TP se va a basar en el mismo dominio del juego Plantas vs Zombies, pero no les vamos a pedir que implementen toda la funcionalidad a nivel de UI.

Solo una partecita.

Ya luego, en la Unidad 4 y TP3, trabajaremos con herramientas más piolas que nos van a permitir construir la interfaz web completa y diseñar.

Para esta entrega del tp se pide que implemente las pantallas del Jardín Zen.

  1. Siempre se comenzará con el jardín terrestre (pudiendo ir al acuático)
  2. El jardín acuático debe de permitir volver al terrestre
  3. En ambas pantallas se pide:
    1. Mostrar un listado de todas las plantas que se posean por cada jardin (Nombre, Poder Ofensivo y Poder Defensivo)
    2. Permitir seleccionar una planta de ese listado para comprar una mejora (ver mas adelante el punto sobre mejoras)
    3. Permitir filtrar la lista de plantas por nombre
    4. Poder ordenar la lista de plantas de menor a mayor y viceversa por poder Ofensivo o Defensivo
    5. Permitir avanzar al siguiente jardín
  4. Cuando se pide mejorar una planta (esto pasa solo si esta seleccionada la planta) se pide:
    1. Poder visualizar las mejoras que ya tiene la planta
    2. Poder comprar una mejora
    3. Pemitir volver al jardin zen donde estabamos (donde veremos la lista de plantas actualizada si se compraron mejoras)

Algunas cosideraciones:

  • No es necesario permitir ingresar plantas nuevas al jardín Zen, podemos asumir que estamos viendo el jardín de un jugador que ya tiene plantas desde el inicio.
  • Recuerden que el foco de la materia está en el código y NO en los detalles estéticos, no les aconsejamos que descuiden el aspecto pero sí les rescomendamos que no sea lo mas importante de la entrega.
  • Les dejamos algunas posibles pantallas para que se tomen como base a los no inspirados

TP 3 - Plantas vs Zombies Web !!

El enunciado de este TP se puede resumir bastante. Porque lo que queremos hacer es implementar toda el juego Plantas vs Zombies así como lo hicimos en Arena. Pero esta vez en Apache Wicket, y con los cambios introducidos en el TP 2.

Si utilizaron ApplicationModels en el TP2, entonces podrían reutilizarlos aquí.

La idea es que con Wicket por un lado va a ser mucho más feliz que con el modelo 2 (servlets+jsp). Ya que introduce ideas interesantes como el modelo de componentes, la vista como objetos, los controllers, y el MVC con los IModel.

Sin embargo, no deja de abstraernos complétamente de la idea de arquitectura web.

Con lo cual la idea de este TP es enfretarse a la creación de una aplicación web, pero con un framework mas avanzado, que nos va a permitir más posibilidades de diseño.

Vamos a considerar como siempre criterios de aprobación como reutilización de código, claridad, separación de responsabilidades, etc.

Sepan que si bien Wicket introduce el marco de trabajo, ustedes son los que pueden definir extender Wicket, o diseñar por sobre él, con las herramientas de objetos que ya conocemos: composición, herencia, patrones, etc.

Una particularidad de nuestra aplicación es que si bien es web, no hay interacción entre los diferente usuario. Cada usuario conectado al server tiene su propio estado de juego y no afecta a los demás.