Skip to content

Commit

Permalink
creamos la "comida" silla
Browse files Browse the repository at this point in the history
intentamos implementar el objeto juego de manera mas global, agregamos tests y subimos la velocidad en la que bajan los elementos.
actualizamos el readme.

Co-authored-by: MatttiB <[email protected]>
  • Loading branch information
acorromolas11 and MatttiB committed Nov 7, 2024
1 parent eb954be commit 999c60b
Show file tree
Hide file tree
Showing 10 changed files with 119 additions and 113 deletions.
43 changes: 7 additions & 36 deletions DiagramaDeClases.md
Original file line number Diff line number Diff line change
@@ -1,44 +1,15 @@
# DIAGRAMA DE CLASES #

Homero interactúa con diferentes tipos de comida, modificando su estado, velocidad y puntuación en base a la comida que consume,
sea para ventaja o desventaja del jugador. Dependiendo del nivel en el que se encuentre se modificará la dificultad de jugabilidad.
Homero interactúa con diferentes tipos de comida, modificando su imagen y puntuación en base a la comida que consume,
sea para ventaja o desventaja del jugador. Además, la misma comida que aumenta la puntuacion de homero hace que aumente o disminuya la velocidad del juego que en sí aumenta o disminuye la caida de todos los alimentos a medida que se desarrolla el nivel. Dependiendo del nivel en el que se encuentre se modificará la dificultad de jugabilidad.

Los objetos "Homero" y "Comida" encapsulan su estado interno (variables como puntos, velocidad, estado de Homero, y nombre, puntos,
velocidad de Comida) y solo permiten modificarlo a través de métodos. Por ejemplo, el método “alterarPuntos” de Homero permite cambiar
su puntuación asegurando que no sea negativa.
Los objetos "Homero" y "Comida" encapsulan su estado interno (variables como puntos, velocidad, estado de Homero, y nombre, puntos, velocidad de Comida) y solo permiten modificarlo a través de métodos. Por ejemplo, el método “puntos(nuevosPuntos)” de Homero permite cambiar su puntuación asegurando que no sea negativa.

Homero se abstrae como una entidad que puede moverse y cambiar de estado, mientras que las comidas son abstraídas con comportamientos
específicos que afectan solo a Homero. Los métodos como “moverseIzquierda” e “interactúa” esconden detalles de implementación.
Homero se abstrae como una entidad que puede moverse y cambiar de estado, mientras que las comidas son abstraídas con comportamientos específicos que afectan solo a Homero. Los métodos como “moverseIzquierda” e “interactúa” esconden detalles de implementación.

El método “interactúa” de la clase Comida es un ejemplo de polimorfismo cuando interactúa con diferentes tipos de comidas,
creando diferentes comportamientos en Homero. Dependiendo del tipo de comida (por ejemplo, rosquilla, banana, plutonio),
se invoca un método diferente en homero, alterando su estado y propiedades. Este comportamiento permite que múltiples tipos de "comida"
compartan el mismo método de interacción, pero con efectos distintos.
El método “interactúa” de la clase Comida es un ejemplo de polimorfismo cuando interactúa con diferentes tipos de comidas, creando diferentes comportamientos en Homero. Dependiendo del tipo de comida (por ejemplo, rosquilla, banana, plutonio) homero cambia sus propiedades de maneras diferentes, cambia su imagen, sus puntos y en algunos casos (como en el de la cerveza) sus movimientos, es decir que si se intenta mover para la izquierda homero irá hacia la derecha.

![image](https://github.com/user-attachments/assets/3fa26ba5-d166-4a50-9f13-15494f9e98f0)



Del diagrama de la clase pasada:

object laPorota {
var stock
var precio
Pueden existir objetos letales, como la silla, si homero interactúa con una silla de plastico, lo más probable es que esta lo traicione y termine con la partida inmediatamente.

method vender(cant,comp){
....... ?????
comp.pagar(????)
}

??????
}

class Comprador {
var medio = new Debito()

method pagar(monto){
medio.pagar(asdfasdf)
}
![image](https://github.com/user-attachments/assets/3fa26ba5-d166-4a50-9f13-15494f9e98f0)

??????
}
18 changes: 10 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,26 @@ UTN - Facultad Regional Buenos Aires - Materia Paradigmas de Programación
Homero, el "levantapalas 3000", decidió ceder su puesto en la central nuclear a pasantes de la UTN. Ahora trabaja desde casa, ¡pero hay un problema! Nunca usó una computadora y se quedó dormido intentando encontrar la "tecla cualquiera". En su sueño, Homero debe atrapar comida que cae del cielo, pero cuidado: no toda la comida es buena, y las cosas se complican con cada nivel. ¡Ayuda a Homero a comer bien y ganar!

### Objetivo del Juego:
Atrapa comida para sumar puntos y alcanza el puntaje necesario antes de que el tiempo se agote.
Atrapa comida para sumar puntos y alcanza el puntaje necesario antes de que el tiempo se agote. Cuidado, porque la comida que más suma tambien es la que aumenta la velocidad de caida de los alimentos, lo que conlleva una mayor dificultad.
Si consigues el puntaje requerido, pasas al siguiente nivel. Si no lo logras, "Over Game".

### Cómo Jugar:
1. Movimiento:
Homero solo se puede mover de izquierda a derecha.
Desplázalo para atrapar la comida que cae del cielo con Space.
Desplázalo para atrapar la comida que cae del cielo.
2. Tipos de Comida:
Buffea (suma puntos): Ejemplos como choripanes, donas, plutonio, cerveza, mate.
Nerfea (resta puntos): Ejemplos como banana, ensalada, te, polenta.
Aumenta puntos : Ejemplos como choripanes, donas, plutonio, cerveza, mate, etc.
Disminuye puntos: Ejemplos como banana, ensalada, te, polenta, etc.
Aumenta velocidad caida comida: Ejemplos como rosquilla, plutonio, choripan, etc.
Disminuye velocidad caida comida: Ejemplos como ensalada, banana, etc.
Pierde juego: Silla.

### Mecánica del Juego:
1. Puntos y Niveles:
1. Puntos, Velocidad y Niveles:
Cada comida atrapada puede sumar o restar puntos.
Además, cada comida atrapada aumenta o disminuye la velocidad de caida de los mismos.
Debes alcanzar el puntaje objetivo antes de que el tiempo termine para avanzar al siguiente nivel.
2. Dificultad Progresiva:
Más puntos necesarios en cada nivel.
Más comidas nerfeadoras que restan puntos.
Mayor velocidad de aparición de la comida.
Mayor velocidad de caída de los objetos.
Expand All @@ -51,5 +54,4 @@ Si consigues el puntaje requerido, pasas al siguiente nivel. Si no lo logras, "O
## Controles:

- `A` para moverse a la izquierda.
- `D` para moverse a la derecha.
- `Space` para agarrar objeto.
- `D` para moverse a la derecha.
Binary file added assets/homero-silla.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/silla.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
41 changes: 26 additions & 15 deletions comida.wlk
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import homero.*
import wollok.game.*
import tableros.*

// TODO: La velocidad no debe ser la de homero, sino el coeficiente general de tick de caída
// TODO: Deben existir cosas que no conviene agarrar (silla de plástico) porque pierden de una
Expand All @@ -11,6 +12,7 @@ class Comida{
var property puntos
var property velocidad
const tipoAvance = aLaDerecha
const fulminante = noPierde

var position = new MutablePosition(x=(0..game.width()).anyOne()*2, y=game.height())

Expand All @@ -33,6 +35,7 @@ class Comida{
}

method interactua(homero){
fulminante.pierdeONo()
homero.come(self)
game.removeVisual(self)
}
Expand Down Expand Up @@ -73,19 +76,27 @@ object aLaIzquierda{
}
}

const rosquilla = new Comida(nombre="rosquilla", puntos=5, velocidad=50)
const banana = new Comida(nombre="banana", puntos=-3, velocidad=-50)
const plutonio = new Comida(nombre="plutonio", puntos=15, velocidad=20)
const cerveza = new Comida(nombre="cerveza", puntos=15, velocidad=-30,tipoAvance=aLaIzquierda)
const choripan = new Comida(nombre="choripan", puntos=7, velocidad=-10)
const mate = new Comida(nombre="mate", puntos=20, velocidad=100)
const te = new Comida(nombre="te", puntos=-50, velocidad=-50)
const ensalada = new Comida(nombre="ensalada", puntos=-15, velocidad=20)
const guiso = new Comida(nombre="guiso", puntos=15, velocidad=-100)

const comidasNivel1 = [rosquilla, banana, plutonio, choripan, cerveza]
const comidasNivel2 = comidasNivel1 + [mate,ensalada,guiso,te]
object pierde{
method pierdeONo(){
tiempo.timer(0)
}
}

object noPierde{
method pierdeONo(){

object grasiento {
method imagen() = "rosquilla"
}
}
}
const rosquilla = new Comida(nombre="rosquilla", puntos=5, velocidad=0.75)
const banana = new Comida(nombre="banana", puntos=-3, velocidad=1.2)
const plutonio = new Comida(nombre="plutonio", puntos=15, velocidad=0.25)
const cerveza = new Comida(nombre="cerveza", puntos=15, velocidad=0.25,tipoAvance=aLaIzquierda)
const choripan = new Comida(nombre="choripan", puntos=7, velocidad=0.5)
const mate = new Comida(nombre="mate", puntos=20, velocidad=0.1)
const te = new Comida(nombre="te", puntos=-50, velocidad=2)
const ensalada = new Comida(nombre="ensalada", puntos=-15, velocidad=1.75)
const guiso = new Comida(nombre="guiso", puntos=15, velocidad=0.75)
const silla = new Comida(nombre="silla", puntos=-100, velocidad=1, fulminante=pierde)

const comidasNivel1 = [rosquilla, banana, plutonio, choripan, cerveza,silla]
const comidasNivel2 = comidasNivel1 + [mate,ensalada,guiso,te]
26 changes: 8 additions & 18 deletions homero.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@ import niveles.*

object homero{
var puntos = 0
var velocidad = 1
var position = new MutablePosition(x=(game.width()/2).roundUp(), y=0)
var ultimaComida = rosquilla

method velocidad() = velocidad

method ultimaComida(comida){
ultimaComida = comida
}
Expand All @@ -20,21 +17,12 @@ object homero{

method come(comida) {
ultimaComida = comida
self.puntos(comida.puntos())
self.velocidad(comida.velocidad())
self.sumarPuntos(comida.puntos())
juego.velocidad(comida.velocidad())
}

method position() = position

method setPuntos(nuevosPuntos){
puntos = nuevosPuntos
juego.verificarFinDeNivel()
}

method setVelocidad(x){
velocidad = x
}

method moverseIzquierda(){
ultimaComida.moverseAtras(position)
}
Expand All @@ -43,14 +31,16 @@ object homero{
ultimaComida.moverseAdelante(position)
}


method puntos(nuevosPuntos){
puntos += nuevosPuntos
puntos = nuevosPuntos
puntos = puntos.max(0)
juego.verificarFinDeNivel()
}

method velocidad(nuevaVelocidad){
velocidad += nuevaVelocidad
method sumarPuntos(nuevosPuntos){
puntos += nuevosPuntos
puntos = puntos.max(0)
juego.verificarFinDeNivel()
}

method puntos() = puntos
Expand Down
7 changes: 2 additions & 5 deletions main.wpgm
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ import tableros.*

program homeroGame{

if(nivel1.estado() == "inicio"){
nivel1.iniciarFondo()
keyboard.num1().onPressDo({nivel1.iniciarNivel()})
}

juego.nivelActual().iniciarFondo()
keyboard.num1().onPressDo({juego.nivelActual().iniciarNivel()})

}
65 changes: 37 additions & 28 deletions niveles.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,22 @@ import fondos.*

object juego {
var nivelActual = nivel1
var velocidad = 1

method verificarFinDeNivel(){
nivelActual.verificarFinDeNivel()
if(nivelActual.estado() == "finalizado"){
if(nivelActual.estado() == "ganado"){
nivelActual = nivel2
}
}

method nivelActual() = nivelActual

method velocidad(x){
velocidad = x
}

method velocidad() = velocidad
}

const nivel1 = new Nivel()
Expand All @@ -33,8 +42,8 @@ class Nivel{
}

method inicializarValores(){
homero.setPuntos(0)
homero.setVelocidad(1)
homero.puntos(0)
juego.velocidad(1)
homero.ultimaComida(rosquilla)
tiempo.timer(5*60)
homero.positionX(game.width()/2)
Expand Down Expand Up @@ -63,11 +72,12 @@ class Nivel{
game.removeVisual(mensajes)
comidasNivel1.forEach({comida => game.addVisual(comida)})

game.onTick(1700 + homero.velocidad(), "baja", {rosquilla.bajar()})
game.onTick(1200 + homero.velocidad() , "baja", {banana.bajar()})
game.onTick(700 + homero.velocidad() , "baja", {choripan.bajar()})
game.onTick(1450 + homero.velocidad() , "baja", {cerveza.bajar()})
game.onTick(950 + homero.velocidad() , "baja", {plutonio.bajar()})
game.onTick(1000 * juego.velocidad(), "baja", {rosquilla.bajar()})
game.onTick(600 * juego.velocidad() , "baja", {banana.bajar()})
game.onTick(200 * juego.velocidad() , "baja", {choripan.bajar()})
game.onTick(800 * juego.velocidad() , "baja", {cerveza.bajar()})
game.onTick(400 * juego.velocidad() , "baja", {plutonio.bajar()})
game.onTick(250 * juego.velocidad() , "baja", {silla.bajar()})

keyboard.a().onPressDo({homero.moverseIzquierda()})
keyboard.d().onPressDo({homero.moverseDerecha()})
Expand All @@ -84,17 +94,16 @@ class Nivel{
}

method finalizarNivel(){
game.removeTickEvent("finalizarNivel")
game.removeTickEvent("baja")
game.removeTickEvent("restarSegundo")
self.limpiarJuego()
if(homero.puntos() < 100){
game.addVisual(mensajeDerrota)
self.estado("finalizado")
self.estado("perdido")
}else{
game.addVisual(mensajeVictoria)
game.addVisual(mensajeParaNivel2)
self.estado("finalizado")
self.estado("ganado")
nivel2.estado("inicio")
nivel2.inicializarValores()
nivel2.iniciarFondo()
Expand All @@ -111,8 +120,8 @@ class Nivel{
object nivel2 inherits Nivel(estado = "espera"){

override method inicializarValores(){
homero.setPuntos(0)
homero.setVelocidad(1)
homero.puntos(0)
juego.velocidad(1)
tiempo.timer(5*60)
homero.positionX(game.width()/2)
comidasNivel1.forEach({comida => comida.position().goUp(18)})
Expand All @@ -134,34 +143,34 @@ object nivel2 inherits Nivel(estado = "espera"){

override method iniciarNivel(){
self.estado("jugando")
game.onTick(1000, "restarSegundo", {tiempo.restarSegundo()})
game.onTick(1000, "finalizarNivel", {if((tiempo.timer() <= 0 || homero.puntos() >= 100) && self.estado()!="finalizado") self.finalizarNivel()})
game.removeVisual(mensajeParaNivel2)
comidasNivel2.forEach({comida => game.addVisual(comida)})
//lvl2
game.onTick(250 * juego.velocidad(), "baja", {mate.bajar()})
game.onTick(300 * juego.velocidad() , "baja", {te.bajar()})
game.onTick(500 * juego.velocidad(), "baja", {ensalada.bajar()})
game.onTick(700 * juego.velocidad() , "baja", {guiso.bajar()})
//lvl1
game.onTick(1000 * juego.velocidad(), "baja", {rosquilla.bajar()})
game.onTick(600 * juego.velocidad() , "baja", {banana.bajar()})
game.onTick(200 * juego.velocidad() , "baja", {choripan.bajar()})
game.onTick(800 * juego.velocidad() , "baja", {cerveza.bajar()})
game.onTick(400 * juego.velocidad() , "baja", {plutonio.bajar()})
game.onTick(250 * juego.velocidad() , "baja", {silla.bajar()})

game.onTick(450 + homero.velocidad(), "baja", {mate.bajar()})
game.onTick(700 + homero.velocidad(), "baja", {choripan.bajar()})
game.onTick(1200 + homero.velocidad(), "baja", {banana.bajar()})
game.onTick(950 + homero.velocidad(), "baja", {plutonio.bajar()})
game.onTick(1450 + homero.velocidad(), "baja", {cerveza.bajar()})
game.onTick(1700 + homero.velocidad(), "baja", {rosquilla.bajar()})
game.onTick(1950 + homero.velocidad() , "baja", {te.bajar()})
game.onTick(2200 + homero.velocidad(), "baja", {ensalada.bajar()})
game.onTick(2450 + homero.velocidad() , "baja", {guiso.bajar()})

game.onTick(1000, "restarSegundo", {tiempo.restarSegundo()})
}

override method finalizarNivel(){
game.removeTickEvent("finalizarNivel")
game.removeTickEvent("baja")
game.removeTickEvent("restarSegundo")
self.limpiarJuego()
if(homero.puntos() < 100){
game.addVisual(mensajeDerrota)
self.estado("finalizado")
self.estado("perdido")
}else{
game.addVisual(mensajeVictoria)
self.estado("finalizado")
self.estado("ganado")
}
}

Expand Down
Loading

0 comments on commit 999c60b

Please sign in to comment.