diff --git a/DiagramaDeClases.md b/DiagramaDeClases.md new file mode 100644 index 0000000..8f82239 --- /dev/null +++ b/DiagramaDeClases.md @@ -0,0 +1,14 @@ +# DIAGRAMA DE CLASES # + +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 “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. + +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. + +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. + +![image](https://github.com/user-attachments/assets/683e082c-a13f-4682-9e7c-4cc8666be9ef) diff --git a/README.md b/README.md index 4a885a1..9363d35 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,57 @@ -# (reemplazar nombre de juego acá) +# El Sueño del Levantapalas: La Carrera por el Morfi UTN - Facultad Regional Buenos Aires - Materia Paradigmas de Programación ## Equipo de desarrollo: -- completar... -- completar... +- Bermejo Fernández, Matías. +- Corro Molas, Agustin. +- Britos, Aylen. +- Dimotta, Cecilia. +- Giangrandi, Agostino. - ## Capturas - -![pepita](assets/golondrina.png) +### Nivel1: +![HomeroGameNivel1Jugando](https://github.com/user-attachments/assets/53372ced-c392-4790-a0ed-aa08f2deba2e) +### Nivel2: +![HomeroGameNivel2Jugando](https://github.com/user-attachments/assets/3f143865-fa52-435a-b6e9-78a8fea186db) ## Reglas de Juego / Instrucciones -(completar...) +### Descripción del Juego: +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. 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. + 2. Tipos de Comida: + 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, 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 comidas nerfeadoras que restan puntos. + Mayor velocidad de aparición de la comida. + Mayor velocidad de caída de los objetos. + +### Consejos para Ganar: + Evita las comidas nerfeadoras y enfócate en atrapar los buffeos. + Administra el tiempo y prioriza las comidas con más puntos. + Ten cuidado: ¡A mayor nivel, más rápido todo se pone! ## Controles: -- `W` para... - +- `A` para moverse a la izquierda. +- `D` para moverse a la derecha. \ No newline at end of file diff --git a/assets/banana.png b/assets/banana.png new file mode 100644 index 0000000..60637c5 Binary files /dev/null and b/assets/banana.png differ diff --git a/assets/cerveza.png b/assets/cerveza.png new file mode 100644 index 0000000..80decb0 Binary files /dev/null and b/assets/cerveza.png differ diff --git a/assets/choripan.png b/assets/choripan.png new file mode 100644 index 0000000..ecf2616 Binary files /dev/null and b/assets/choripan.png differ diff --git a/assets/ensalada.png b/assets/ensalada.png new file mode 100644 index 0000000..a34e027 Binary files /dev/null and b/assets/ensalada.png differ diff --git a/assets/golondrina.png b/assets/golondrina.png deleted file mode 100644 index 1660f61..0000000 Binary files a/assets/golondrina.png and /dev/null differ diff --git a/assets/guiso.png b/assets/guiso.png new file mode 100644 index 0000000..9dcad37 Binary files /dev/null and b/assets/guiso.png differ diff --git a/assets/homero-banana.png b/assets/homero-banana.png new file mode 100644 index 0000000..e7d4f0b Binary files /dev/null and b/assets/homero-banana.png differ diff --git a/assets/homero-cerveza.png b/assets/homero-cerveza.png new file mode 100644 index 0000000..cf15e4e Binary files /dev/null and b/assets/homero-cerveza.png differ diff --git a/assets/homero-choripan.png b/assets/homero-choripan.png new file mode 100644 index 0000000..0672dec Binary files /dev/null and b/assets/homero-choripan.png differ diff --git a/assets/homero-ensalada.png b/assets/homero-ensalada.png new file mode 100644 index 0000000..0a54690 Binary files /dev/null and b/assets/homero-ensalada.png differ diff --git a/assets/homero-guiso.png b/assets/homero-guiso.png new file mode 100644 index 0000000..c861d47 Binary files /dev/null and b/assets/homero-guiso.png differ diff --git a/assets/homero-mate.png b/assets/homero-mate.png new file mode 100644 index 0000000..7342020 Binary files /dev/null and b/assets/homero-mate.png differ diff --git a/assets/homero-plutonio.png b/assets/homero-plutonio.png new file mode 100644 index 0000000..612bf3e Binary files /dev/null and b/assets/homero-plutonio.png differ diff --git a/assets/homero-rosquilla.png b/assets/homero-rosquilla.png new file mode 100644 index 0000000..36d17c3 Binary files /dev/null and b/assets/homero-rosquilla.png differ 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/homero-te.png b/assets/homero-te.png new file mode 100644 index 0000000..a3c1442 Binary files /dev/null and b/assets/homero-te.png differ diff --git a/assets/mate.png b/assets/mate.png new file mode 100644 index 0000000..7ca5723 Binary files /dev/null and b/assets/mate.png differ diff --git a/assets/obelisco2.png b/assets/obelisco2.png new file mode 100644 index 0000000..360766f Binary files /dev/null and b/assets/obelisco2.png differ diff --git a/assets/plutonio.png b/assets/plutonio.png new file mode 100644 index 0000000..c5fb5e4 Binary files /dev/null and b/assets/plutonio.png differ diff --git a/assets/rosquilla.png b/assets/rosquilla.png new file mode 100644 index 0000000..fd3dd49 Binary files /dev/null and b/assets/rosquilla.png differ diff --git a/assets/silla.png b/assets/silla.png new file mode 100644 index 0000000..00b04a8 Binary files /dev/null and b/assets/silla.png differ diff --git a/assets/springfield.png b/assets/springfield.png new file mode 100644 index 0000000..1128e80 Binary files /dev/null and b/assets/springfield.png differ diff --git a/assets/te.png b/assets/te.png new file mode 100644 index 0000000..ac0a960 Binary files /dev/null and b/assets/te.png differ diff --git a/comida.wlk b/comida.wlk new file mode 100644 index 0000000..e614384 --- /dev/null +++ b/comida.wlk @@ -0,0 +1,105 @@ +import homero.* +import wollok.game.* +import tableros.* +import niveles.* + +class Comida{ + var property nombre + var property puntos + var property velocidad + var property velocidadCaida + const tipoAvance = aLaDerecha + const fulminante = noPierde + + method velocidadCaida() = velocidadCaida + + method velocidadCaida(nuevaVelocidad){ + velocidadCaida = nuevaVelocidad + } + + var position = new MutablePosition(x=(0..game.width()).anyOne()*2, y=game.height()) + + method image() = nombre + ".png" + method position() = position + + method positionX(nueva_pos_x){ + position = new MutablePosition(x=nueva_pos_x, y=game.height()) + } + + method bajar(){ + if (position.y() >= -2){ + position.goDown(1) + }else{ + game.removeVisual(self) + position.goUp(game.height()) + self.positionX((0..(game.width()-2)).anyOne()) + game.addVisual(self) + } + } + + method interactua(homero){ + fulminante.pierdeONo() + homero.come(self) + game.removeVisual(self) + } + + method moverseAdelante(posicion){ + tipoAvance.moverseAdelante(posicion) + } + + method moverseAtras(posicion){ + tipoAvance.moverseAtras(posicion) + } + +} + + +object aLaDerecha{ + method moverseAdelante(posicion){ + if(posicion.x() <= game.width() - 3 && posicion.x() + 1 <= game.width() - 2) + posicion.goRight(1) + } + + method moverseAtras(posicion){ + if(posicion.x() >= 1 && posicion.x() - 1 >= 0) + posicion.goLeft(1) + } + +} + +object aLaIzquierda{ + method moverseAtras(posicion){ + if(posicion.x() <= game.width() - 3) + posicion.goRight(1) + } + + method moverseAdelante(posicion){ + if(posicion.x() >= 1) + posicion.goLeft(1) + } +} + +object pierde{ + method pierdeONo(){ + tiempo.timer(0) + } +} + +object noPierde{ + method pierdeONo(){ + + } +} +const rosquilla = new Comida(nombre="rosquilla", puntos=5, velocidad=0, velocidadCaida=1500) +const banana = new Comida(nombre="banana", puntos=-3, velocidad=1.2, velocidadCaida=1400) +const plutonio = new Comida(nombre="plutonio", puntos=15, velocidad=0.25, velocidadCaida=1300) +const cerveza = new Comida(nombre="cerveza", puntos=15, velocidad=0.25, velocidadCaida=1200, tipoAvance=aLaIzquierda) +const choripan = new Comida(nombre="choripan", puntos=7, velocidad=0.5, velocidadCaida=1100) +const mate = new Comida(nombre="mate", puntos=20, velocidad=0.1, velocidadCaida=1000) +const te = new Comida(nombre="te", puntos=-50, velocidad=2, velocidadCaida=900) +const ensalada = new Comida(nombre="ensalada", puntos=-15, velocidad=1.75, velocidadCaida=800) +const guiso = new Comida(nombre="guiso", puntos=15, velocidad=0.75, velocidadCaida=700) +const silla = new Comida(nombre="silla", puntos=-100, velocidad=1, velocidadCaida=600, fulminante=pierde) + +const comidasNivel1 = [rosquilla, banana, plutonio, choripan, cerveza,silla] +const comidasNivel2 = comidasNivel1 + [mate,ensalada,guiso,te] diff --git a/fondos.wlk b/fondos.wlk new file mode 100644 index 0000000..17dd867 --- /dev/null +++ b/fondos.wlk @@ -0,0 +1,12 @@ +class Fondo { + const position = new MutablePosition(x=0, y=0) + var property nombreFondo + + + method position() = position + + method image() = nombreFondo + ".png" + +} + +const obelisco = new Fondo(nombreFondo="obelisco2") \ No newline at end of file diff --git a/homero.wlk b/homero.wlk new file mode 100644 index 0000000..88738b9 --- /dev/null +++ b/homero.wlk @@ -0,0 +1,50 @@ +import wollok.game.* +import comida.* +import niveles.* + +object homero{ + var puntos = 0 + var position = new MutablePosition(x=(game.width()/2).roundUp(), y=0) + var ultimaComida = rosquilla + + method ultimaComida(comida){ + ultimaComida = comida + } + + method positionX(nueva_pos_x){ + position = new MutablePosition(x=nueva_pos_x, y=0) + } + + method come(comida) { + ultimaComida = comida + juego.velocidad(comida.velocidad()) + juego.actualizarCaida() + self.sumarPuntos(comida.puntos()) + } + + method position() = position + + method moverseIzquierda(){ + ultimaComida.moverseAtras(position) + } + + method moverseDerecha(){ + ultimaComida.moverseAdelante(position) + } + + method puntos(nuevosPuntos){ + puntos = nuevosPuntos + puntos = puntos.max(0) + juego.verificarFinDeNivel() + } + + method sumarPuntos(nuevosPuntos){ + puntos += nuevosPuntos + puntos = puntos.max(0) + juego.verificarFinDeNivel() + } + + method puntos() = puntos + + method image() = "homero-"+ ultimaComida.image() +} diff --git a/image.png b/image.png new file mode 100644 index 0000000..0a1cb82 Binary files /dev/null and b/image.png differ diff --git a/main.wpgm b/main.wpgm index 4337325..546a789 100644 --- a/main.wpgm +++ b/main.wpgm @@ -1,16 +1,12 @@ import wollok.game.* +import comida.* +import homero.* +import niveles.* +import tableros.* -import pepita.* +program homeroGame{ -program PepitaGame { - game.title("Pepita") - game.height(10) - game.width(10) - game.cellSize(100) + juego.nivelActual().iniciarFondo() + keyboard.num1().onPressDo({juego.nivelActual().iniciarNivel()}) - game.addVisual(pepita) - - keyboard.w().onPressDo({ pepita.fly(1) }) - - game.start() -} +} \ No newline at end of file diff --git a/niveles.wlk b/niveles.wlk new file mode 100644 index 0000000..7b95c33 --- /dev/null +++ b/niveles.wlk @@ -0,0 +1,199 @@ +import homero.* +import comida.* +import tableros.* +import wollok.game.* +import fondos.* + + +object juego { + var nivelActual = nivel1 + var velocidad = 1 + var contador = 0 + + method contador () = contador + + method sumarContador(){ + contador = contador + 100 + } + + method verificarFinDeNivel(){ + nivelActual.verificarFinDeNivel() + if(nivelActual.estado() == "ganado"){ + nivelActual = nivel2 + } + } + + method actualizarCaida(){ + game.removeTickEvent("baja") + self.nivelActual().bajarComidas() + } + + method nivelActual() = nivelActual + + method velocidad(x){ + velocidad = x + } + + method velocidad() = velocidad +} + +const nivel1 = new Nivel() + +class Nivel{ + var estado = "inicio" + + method estado() = estado + + method estado(x) { + estado = x + } + + method bajarComidas(){ + //lvl1 + game.onTick(rosquilla.velocidadCaida()* juego.velocidad(), "baja", {rosquilla.bajar()}) + game.onTick(cerveza.velocidadCaida()* juego.velocidad(), "baja", {cerveza.bajar()}) + game.onTick(banana.velocidadCaida()* juego.velocidad(), "baja", {banana.bajar()}) + game.onTick(plutonio.velocidadCaida()* juego.velocidad(), "baja", {plutonio.bajar()}) + game.onTick(silla.velocidadCaida()* juego.velocidad(), "baja", {silla.bajar()}) + } + + method inicializarValores(){ + homero.puntos(0) + juego.velocidad(1) + homero.ultimaComida(rosquilla) + tiempo.timer(5*60) + homero.positionX(game.width()/2) + comidasNivel1.forEach({comida => comida.positionX((0..game.width()-2).anyOne())}) + } + + + method iniciarFondo(){ + game.title("Homero en Springfield") + //meter en otro lado + game.height(12) + game.width(18) + game.cellSize(100) + + game.boardGround("springfield.png") + // + game.addVisual(puntosHomero) + game.addVisual(mensajes) + game.addVisual(homero) + game.addVisual(tiempo) + self.inicializarValores() + + game.start() + } + + //Hardcodear los valores de las comidas + //Que el ontick sea global y que el juego.velocidad() sea como un contador de ticks, en el que si pasa cierto tiempo + //baja la comida (para que se actualice en el juego) + + //ACA: Un solo onTick que haga bajar todas las comidas, que tendrías un IF que cada cierta cantidad de onTicks. El onTick tiene que ser global del juego. + //Contador de tick, un valor que se calcula de la propia velocidad y de la velocidad de la comida, y eso que sea divisor del contador que tengo. + //hacer que los asserts sean mas lindos, corregir la velocidad + + method iniciarNivel(){ + self.estado("jugando") + game.removeVisual(mensajes) + comidasNivel1.forEach({comida => game.addVisual(comida)}) + + keyboard.a().onPressDo({homero.moverseIzquierda()}) + keyboard.d().onPressDo({homero.moverseDerecha()}) + + + self.bajarComidas() + + game.onCollideDo(homero, {cosa => cosa.interactua(homero)}) + + game.onTick(1000, "restarSegundo", {tiempo.restarSegundo()}) + } + + method verificarFinDeNivel(){ + if (tiempo.timer() <= 0 || homero.puntos() >= 100) { + self.finalizarNivel() + } + } + + method finalizarNivel(){ + game.removeTickEvent("baja") + game.removeTickEvent("restarSegundo") + self.limpiarJuego() + if(homero.puntos() < 100){ + game.addVisual(mensajeDerrota) + self.estado("perdido") + }else{ + game.addVisual(mensajeVictoria) + game.addVisual(mensajeParaNivel2) + self.estado("ganado") + nivel2.estado("inicio") + nivel2.inicializarValores() + nivel2.iniciarFondo() + keyboard.num2().onPressDo({nivel2.iniciarNivel()}) + } + } + + method limpiarJuego(){ + game.allVisuals().forEach({visual=>game.removeVisual(visual)}) + } + +} + +object nivel2 inherits Nivel(estado = "espera"){ + + override method bajarComidas(){ + //lvl1 + game.onTick(rosquilla.velocidadCaida() * juego.velocidad() * 2, "baja", {rosquilla.bajar()}) + game.onTick(cerveza.velocidadCaida()* juego.velocidad() * 2, "baja", {cerveza.bajar()}) + game.onTick(banana.velocidadCaida()* juego.velocidad() * 2, "baja", {banana.bajar()}) + game.onTick(plutonio.velocidadCaida()* juego.velocidad() * 2, "baja", {plutonio.bajar()}) + game.onTick(silla.velocidadCaida()* juego.velocidad() * 2, "baja", {silla.bajar()}) + + //lvl2 + game.onTick(mate.velocidadCaida() * juego.velocidad(), "baja", {mate.bajar()}) + game.onTick(te.velocidadCaida() * juego.velocidad() , "baja", {te.bajar()}) + game.onTick(ensalada.velocidadCaida() * juego.velocidad(), "baja", {ensalada.bajar()}) + game.onTick(guiso.velocidadCaida() * juego.velocidad() , "baja", {guiso.bajar()}) + } + + override method iniciarFondo(){ + game.title("Homero en El Obelisco") + + game.removeVisual(mensajeParaNivel2) + game.removeVisual(mensajeVictoria) + + game.addVisual(obelisco) + + game.addVisual(puntosHomero) + game.addVisual(mensajeParaNivel2) + game.addVisual(homero) + game.addVisual(tiempo) + } + + override method iniciarNivel(){ + self.estado("jugando") + game.removeVisual(mensajeParaNivel2) + comidasNivel2.forEach({comida => game.addVisual(comida)}) + + self.bajarComidas() + + game.onTick(1000, "restarSegundo", {tiempo.restarSegundo()}) + } + + override method finalizarNivel(){ + game.removeTickEvent("baja") + game.removeTickEvent("restarSegundo") + self.limpiarJuego() + if(homero.puntos() < 100){ + game.addVisual(mensajeDerrota) + self.estado("perdido") + }else{ + game.addVisual(mensajeVictoria) + self.estado("ganado") + } + } + +} + + + diff --git a/pepita.wlk b/pepita.wlk deleted file mode 100644 index 8763973..0000000 --- a/pepita.wlk +++ /dev/null @@ -1,16 +0,0 @@ -object pepita { - var energy = 100 - const position = new MutablePosition(x=0, y=0) - - method image() = "golondrina.png" - method position() = position - - method energy() = energy - - method fly(minutes) { - energy = energy - minutes * 3 - position.goRight(minutes) - position.goUp(minutes) - } - -} \ No newline at end of file diff --git a/pruebas.wtest b/pruebas.wtest index 7342cd1..d7059a6 100644 --- a/pruebas.wtest +++ b/pruebas.wtest @@ -1,9 +1,84 @@ -import pepita.* +import niveles.* +import homero.* +import wollok.game.* +import comida.* +import tableros.* -describe "group of tests for pepita" { +describe "homero" { + test "Homero inicia con 0 puntos" { + assert.equals(homero.puntos(), 0) + } + + test "Homero inicia en la posicion x=mitad de la pantalla, y=0" { + assert.equals(homero.position().x(), (game.width()/2).roundUp()) + assert.equals(homero.position().y(), 0) + } + + test "Homero no se mueve a la izquierda si esta en el borde" { + homero.positionX(0) + homero.moverseIzquierda() + assert.equals(homero.position().x(),0) + } + + test "Homero no se mueve a la derecha si esta en el borde" { + homero.positionX(game.width()-1) + homero.moverseDerecha() + assert.equals(homero.position().x(),game.width()-1) + } + + test "Homero no puede tener puntos negativos" { + homero.puntos(-5) + assert.equals(homero.puntos(),0) + } + + test "Cuando homero esta borracho, si se mueve para la derecha va para la izquierda"{ + const posicion_anterior = homero.position().x() + homero.come(cerveza) + homero.moverseDerecha() + assert.equals(homero.position().x(),posicion_anterior-1) + } + + test "Cuando homero esta borracho, si se mueve para la izquierda va para la derecha"{ + homero.positionX(1) + const posicion_anterior = homero.position().x() + homero.come(cerveza) + homero.moverseIzquierda() + assert.equals(homero.position().x(),posicion_anterior+1) + } + + + test "los puntos de homero aumentan correctamente"{ + homero.come(cerveza) + assert.that(homero.puntos()>0) + } + + 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(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 "pepita has initial energy" { - assert.equals(100, pepita.energy()) + test "cuando homero tiene 100 puntos gana el nivel"{ + homero.puntos(100) + juego.verificarFinDeNivel() + assert.equals(nivel1.estado(),"ganado") } } \ No newline at end of file diff --git a/tableros.wlk b/tableros.wlk new file mode 100644 index 0000000..2bf378a --- /dev/null +++ b/tableros.wlk @@ -0,0 +1,71 @@ +import homero.* +import niveles.* +object puntosHomero { + const hom = homero + const position = new MutablePosition(x=9, y=10) + + method position() = position + + method text () = "Puntos: " + hom.puntos() + " Velocidad: " + juego.velocidad() + +} + +object mensajes { + const position = new MutablePosition(x=9, y=8) + + method position() = position + + method text() = "Bienvenido a Homero en Springfield, presione 1 para comenzar el nivel 1!" +} + +object tiempo { + var timer = 5 * 60 + const position = new MutablePosition(x=9, y=9) + + method position() = position + + method text() = "Tiempo: " + timer + + method timer() = timer + + method timer(nuevoTiempo){ + timer = nuevoTiempo + } + + method restarSegundo(){ + timer -= 1 + juego.verificarFinDeNivel() + } +} + +object mensajeVictoria{ + const position = new MutablePosition(x=9, y=8) + + method position() = position + + method text() = "Ganaste!" +} + +object mensajeDerrota{ + const position = new MutablePosition(x=9, y=8) + + method position() = position + + method text() = "Perdiste!" +} + +object mensajeParaNivel2{ + const position = new MutablePosition(x=9, y=6) + + method position() = position + + method text() = "Presione 2 para comenzar el nivel 2" +} + +object bienvenidaNivel2 { + const position = new MutablePosition(x=9, y=8) + + method position() = position + + method text() = "Bienvenido al nivel 2, homero en el obelisco presione 2 para comenzar!" +} \ No newline at end of file