diff --git a/DiagramaDeClases.md b/DiagramaDeClases.md index 719f928..b5f3f07 100644 --- a/DiagramaDeClases.md +++ b/DiagramaDeClases.md @@ -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) - ?????? -} \ No newline at end of file diff --git a/README.md b/README.md index 993dc65..9363d35 100644 --- a/README.md +++ b/README.md @@ -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. @@ -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. \ No newline at end of file diff --git a/assets/homero-silla.png b/assets/homero-silla.png new file mode 100644 index 0000000..98c6e6c Binary files /dev/null and b/assets/homero-silla.png differ diff --git a/assets/silla.png b/assets/silla.png new file mode 100644 index 0000000..de60048 Binary files /dev/null and b/assets/silla.png differ diff --git a/comida.wlk b/comida.wlk index cbaa3ab..9367e35 100644 --- a/comida.wlk +++ b/comida.wlk @@ -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 @@ -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()) @@ -33,6 +35,7 @@ class Comida{ } method interactua(homero){ + fulminante.pierdeONo() homero.come(self) game.removeVisual(self) } @@ -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" -} \ No newline at end of file + } +} +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] diff --git a/homero.wlk b/homero.wlk index 73f5d66..7dce4ae 100644 --- a/homero.wlk +++ b/homero.wlk @@ -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 } @@ -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) } @@ -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 diff --git a/main.wpgm b/main.wpgm index db7661a..546a789 100644 --- a/main.wpgm +++ b/main.wpgm @@ -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()}) } \ No newline at end of file diff --git a/niveles.wlk b/niveles.wlk index ebe0a66..66e54e9 100644 --- a/niveles.wlk +++ b/niveles.wlk @@ -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() @@ -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) @@ -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()}) @@ -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() @@ -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)}) @@ -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") } } diff --git a/pruebas.wtest b/pruebas.wtest index b2847d0..e3338f1 100644 --- a/pruebas.wtest +++ b/pruebas.wtest @@ -1,6 +1,8 @@ +import niveles.* import homero.* import wollok.game.* import comida.* +import tableros.* describe "homero" { // TODO: Hay que testear funcionalidad interesante, lógica del juego. @@ -53,9 +55,33 @@ describe "homero" { assert.that(homero.puntos()>0) } - test "la velocidad de homero aumenta correctamente"{ + test "cuando homero come banana el coeficiente de velocidad aumenta"{ + juego.velocidad(1) + homero.come(banana) + assert.that(juego.velocidad()>1) + } + + test "cuando homero come rosquilla el coeficiente de velocidad disminuye"{ + juego.velocidad(1) homero.come(rosquilla) - assert.that(homero.velocidad()>1) + assert.that(juego.velocidad()<1) + } + + test "cuando homero come una silla de plastico pierde"{ + silla.interactua(homero) + assert.equals(tiempo.timer(),0) + } + + test "cuando homero come té resta puntos"{ + homero.puntos(50) + homero.come(te) + assert.that(homero.puntos()<50) + } + + test "cuando homero tiene 100 puntos gana el nivel"{ + homero.puntos(100) + juego.verificarFinDeNivel() + assert.equals(nivel1.estado(),"ganado") } diff --git a/tableros.wlk b/tableros.wlk index d49844d..2bf378a 100644 --- a/tableros.wlk +++ b/tableros.wlk @@ -6,7 +6,7 @@ object puntosHomero { method position() = position - method text () = "Puntos: " + hom.puntos() + " Velocidad: " + hom.velocidad() + method text () = "Puntos: " + hom.puntos() + " Velocidad: " + juego.velocidad() }