diff --git a/DiagramaEstaticoBonnieGame.png b/DiagramaEstaticoBonnieGame.png new file mode 100644 index 0000000..a472afa Binary files /dev/null and b/DiagramaEstaticoBonnieGame.png differ diff --git a/README.md b/README.md index 4a885a1..159ef11 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,77 @@ -# (reemplazar nombre de juego acá) +# Bonnie UTN - Facultad Regional Buenos Aires - Materia Paradigmas de Programación ## Equipo de desarrollo: -- completar... -- completar... +- Joaquin Burgio +- Maximiliano Alexander Vargas +- Lucas Fajardo +- Gonzalo Grillo - ## Capturas -![pepita](assets/golondrina.png) +![Bonnie](assets/BonnieGame.png) ## Reglas de Juego / Instrucciones -(completar...) +¡Bienvenido a **"Bonnie"**! Ayuda a nuestro valiente conejo a esquivar y recolectar objetos mientras avanza en su camino. Pero ten cuidado: ¡no todo lo que aparece es bueno! Tienes que reaccionar rápido para sobrevivir y ganar la mayor cantidad de puntos posible. + +## Objetivo del Juego + +Tu objetivo es avanzar lo más lejos posible mientras esquivas objetos peligrosos y recoges monedas para sumar puntos. ¡Recuerda, todo puede pasar en cualquier momento! + +## Objetos que encontrarás + +1. **Lobo (Malo)** + - **Efecto**: Si chocas con un lobo, el juego termina de inmediato. ¡Cuidado! + - **Consejo**: ¡Esquívalo a toda costa! + +2. **Mosquito (Malo)** + - **Efecto**: Si chocas con un mosquito, perderás **4 puntos**. + - **Consejo**: A veces es mejor dejarlo pasar que arriesgarse. + +3. **Moneda Dorada (Buena)** + - **Efecto**: Si chocas con una moneda dorada, ganarás **8 puntos**. + - **Consejo**: ¡Aprovecha cada oportunidad para coleccionar monedas! + +4. **Escudo Azul (Beneficioso)** + - **Efecto**: Si chocas con un escudo azul, tu conejo se vuelve **inmune durante 7 segundos**. Durante este tiempo, no puedes ser dañado por ningún objeto malo. + - **Consejo**: Usa el escudo para atravesar zonas peligrosas con seguridad. + +5. **Alas (Beneficioso)** + - **Efecto**: Si chocas con unas alas, tu conejo ganará la habilidad de **doble salto durante 7 segundos**. + - **Consejo**: El doble salto es ideal para esquivar obstáculos altos o saltar a zonas difíciles de alcanzar. + +## Importante sobre los efectos de los objetos + +- Si obtienes tanto el **escudo azul** como las **alas** en el mismo juego, solo se aplicará el último efecto que hayas recogido. ¡Elige bien qué objeto recoger! +- Se pierde inmunidad al saltar + +## Reglas Básicas + +- Esquiva el **lobo** a toda costa, ya que un choque con él terminará el juego. +- Si tocas el **mosquito**, perderás puntos, pero no terminarás el juego. +- Intenta recolectar las **monedas doradas** para sumar puntos. +- Usa el **escudo azul** y las **alas** estratégicamente para mejorar tu rendimiento y evitar daños. + +## Puntaje + +- **Moneda dorada**: +8 puntos +- **Mosquito**: -4 puntos +- **Lobo**: Fin del juego + +## Consejos + +- Siempre mantén los ojos bien abiertos: los objetos caen rápido y a veces no hay tiempo para pensar. +- Aprovecha el **doble salto** para evitar obstáculos o alcanzar objetos difíciles de conseguir. +- El **escudo azul** es una gran herramienta para atravesar zonas llenas de objetos peligrosos sin riesgo. + +## ¡Desafía a tus amigos y demuestra quién es el mejor esquivador de conejos! ## Controles: -- `W` para... +- **Flecha arriba**: Saltar +- **Letra P **: Pausar musica + diff --git a/assets/BonnieGame.png b/assets/BonnieGame.png new file mode 100644 index 0000000..a3d7889 Binary files /dev/null and b/assets/BonnieGame.png differ diff --git a/assets/alas3.png b/assets/alas3.png new file mode 100644 index 0000000..59b2cea Binary files /dev/null and b/assets/alas3.png differ diff --git a/assets/alasBuff.mp3 b/assets/alasBuff.mp3 new file mode 100644 index 0000000..c8bbbf5 Binary files /dev/null and b/assets/alasBuff.mp3 differ diff --git a/assets/bosque.png b/assets/bosque.png new file mode 100644 index 0000000..080d031 Binary files /dev/null and b/assets/bosque.png differ diff --git a/assets/buff.mp3 b/assets/buff.mp3 new file mode 100644 index 0000000..bdd5e6e Binary files /dev/null and b/assets/buff.mp3 differ diff --git a/assets/conejito.png b/assets/conejito.png new file mode 100644 index 0000000..a5d7314 Binary files /dev/null and b/assets/conejito.png differ diff --git a/assets/dinoCoin.mp3 b/assets/dinoCoin.mp3 new file mode 100644 index 0000000..5e73d94 Binary files /dev/null and b/assets/dinoCoin.mp3 differ diff --git a/assets/escudo1.png b/assets/escudo1.png new file mode 100644 index 0000000..f4febc8 Binary files /dev/null and b/assets/escudo1.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/golpeMosquito.mp3 b/assets/golpeMosquito.mp3 new file mode 100644 index 0000000..038939e Binary files /dev/null and b/assets/golpeMosquito.mp3 differ diff --git a/assets/lobo1.png b/assets/lobo1.png new file mode 100644 index 0000000..d12bf46 Binary files /dev/null and b/assets/lobo1.png differ diff --git a/assets/moneda.png b/assets/moneda.png new file mode 100644 index 0000000..76b0711 Binary files /dev/null and b/assets/moneda.png differ diff --git a/assets/mosquito.png b/assets/mosquito.png new file mode 100644 index 0000000..0af4121 Binary files /dev/null and b/assets/mosquito.png differ diff --git a/assets/musiquita.mp3 b/assets/musiquita.mp3 new file mode 100644 index 0000000..bf340b2 Binary files /dev/null and b/assets/musiquita.mp3 differ diff --git a/assets/saltoDino.mp3 b/assets/saltoDino.mp3 new file mode 100644 index 0000000..546a505 Binary files /dev/null and b/assets/saltoDino.mp3 differ diff --git a/example.wlk b/example.wlk new file mode 100644 index 0000000..7bbdd5c --- /dev/null +++ b/example.wlk @@ -0,0 +1,267 @@ +const generadores = [ + generadorDeMonedas, // suman puntos + generadorDeMosquitos, // restan puntos + generadorDeLobos, // termina el juego + generadorDeEscudos, // inmunidad + generadorDeAlas, // doble salto + generadorDeNada +] + +object paleta { + const property amarillo = "FFFF00FF" + + const property blanco = "FFFFFFFF" +} + +class Aviso{ + method position() = game.at(22,16) + + method text() + + method textColor() = paleta.blanco() +} + +class AvisoHabilidad inherits Aviso{ + method duracion() = 0 +} + +object avisoDobleSalto inherits AvisoHabilidad{ + override method duracion() = dobleSalto.duracion() + override method text() = "TENES DOBLE SALTO POR " + self.duracion().div(1000).toString() + " SEGUNDOS" +} + +object avisoInmunidad inherits AvisoHabilidad{ + override method duracion() = inmune.duracion() + override method text() = "TENES INMUNIDAD POR " + self.duracion().div(1000).toString() + " SEGUNDOS" +} + +object puntos{ + method position() = game.at(2,17) + + method text() = "PUNTUACION: " + dinosaurio.puntos().toString() + + method textColor() = paleta.amarillo() +} + +object juegoDeDinosaurio { + method iniciar() { + const musiquita = game.sound("musiquita.mp3") + musiquita.shouldLoop(true) + musiquita.volume(0.1) + game.schedule(500, {musiquita.play()}) + keyboard.p().onPressDo({musiquita.pause()}) + game.width(45) + game.height(20) + game.addVisual(dinosaurio) + game.addVisual(puntos) + game.boardGround("bosque.png") + game.onTick(1000, "aparecerObjeto", { generadores.anyOne().generar() }) + keyboard.up().onPressDo({ dinosaurio.saltar() }) + game.whenCollideDo(dinosaurio, { elemento => elemento.teChocoElDino() }) + } +} + +object normal { + method puntosRestados(n) = n + + method puntosSumados(n) = n + + method terminarJuego() { + dinosaurio.detenerJuego() + } + + method salto() { + if (dinosaurio.position() == game.origin()) dinosaurio.hacerSalto() + } +} + +object dobleSalto { + method avisaAlUsuario() { + game.addVisual(avisoDobleSalto) + game.schedule(2500, {game.removeVisual(avisoDobleSalto)}) + } + + method duracion() = 7000 + + method puntosRestados(n) = n + + method puntosSumados(n) = n + + method terminarJuego() { + dinosaurio.detenerJuego() + } + + method salto() { + if ((dinosaurio.position() == game.origin()) || (dinosaurio.position() == game.at(0,4))) + dinosaurio.hacerSalto() + } +} + +object inmune { + method avisaAlUsuario() {game.addVisual(avisoInmunidad) + game.schedule(2500, {game.removeVisual(avisoInmunidad)}) + } + + method duracion() = 7000 + + method puntosRestados(_) = 0 + + method puntosSumados(n) = n + + method terminarJuego() { + + } + + method salto() { + if (dinosaurio.position() == game.origin()) { + dinosaurio.hacerSalto() + // Si el dino salta mientras que está inmune, pierde la inmunidad. + dinosaurio.estado(normal) + } + } +} + +object dinosaurio { + var property position = game.origin() + var property image = "conejito.png" + var property puntos = 0 + var property estado = normal + + method saltar() { + estado.salto() + game.sound("saltoDino.mp3").play() + } + + method hacerSalto() { + self.subir() + game.schedule(600, { self.bajar() }) + } + + method bajar() { + position = game.origin() + } + + method subir() { + position = position.up(4) + } + + method sumarPtos(n) { + puntos += estado.puntosSumados(n) + } + + method restarPtos(n) { + puntos -= estado.puntosRestados(n) + if(self.puntos()<0) + self.perder() + } + + method perder() { + estado.terminarJuego() + } + + method detenerJuego() { + game.stop() + } + + method cambiarEstadoPorUnosSeg(n, nuevoEstado) { + estado = nuevoEstado + // luego de n milisegundos el estado vuelve a ser normal + game.schedule(n, {estado = normal} ) + } +} + +class Generador { + method generar() + + method apareceYMovete(nuevoObstaculo) { + game.addVisual(nuevoObstaculo) + game.onTick(120, "desplazamiento", { nuevoObstaculo.desplazate() }) + } +} + +object generadorDeMonedas inherits Generador { + override method generar() { + self.apareceYMovete(new Moneda(image = "moneda.png")) + } +} + +object generadorDeMosquitos inherits Generador { + override method generar() { + self.apareceYMovete(new Mosquito(image = "mosquito.png")) + } +} + +object generadorDeLobos inherits Generador { + override method generar() { + self.apareceYMovete(new Lobo(image = "lobo1.png")) + } +} + +object generadorDeEscudos inherits Generador { + override method generar() { + self.apareceYMovete(new Escudo(image = "escudo1.png")) + } +} + +object generadorDeAlas inherits Generador { + override method generar() { + self.apareceYMovete(new Alas(image = "alas3.png")) + } +} + +object generadorDeNada { + method generar() { + + } +} + +class Obstaculo { + var property position = game.at(game.width()-1, self.posY()) + var property image + const valores = [0, 4, 8] + + method posY() = valores.anyOne() + + method teChocoElDino() + + method desplazate() { + position = position.left(2) + } +} + +class Moneda inherits Obstaculo { + override method teChocoElDino() { + dinosaurio.sumarPtos(8) + game.sound("dinoCoin.mp3").play() + } +} + +class Mosquito inherits Obstaculo { + override method teChocoElDino() { + dinosaurio.restarPtos(4) + game.sound("golpeMosquito.mp3").play() + } +} + +class Lobo inherits Obstaculo { + override method teChocoElDino() { + dinosaurio.perder() + } +} + +class Escudo inherits Obstaculo { + override method teChocoElDino() { + dinosaurio.cambiarEstadoPorUnosSeg(inmune.duracion(), inmune) + inmune.avisaAlUsuario() + game.sound("buff.mp3").play() + + } +} + +class Alas inherits Obstaculo { + override method teChocoElDino() { + dinosaurio.cambiarEstadoPorUnosSeg(dobleSalto.duracion(), dobleSalto) + dobleSalto.avisaAlUsuario() + game.sound("alasBuff.mp3").play() + } +} diff --git a/main.wpgm b/main.wpgm index 4337325..540f9be 100644 --- a/main.wpgm +++ b/main.wpgm @@ -1,16 +1,7 @@ import wollok.game.* +import example.* -import pepita.* - -program PepitaGame { - game.title("Pepita") - game.height(10) - game.width(10) - game.cellSize(100) - - game.addVisual(pepita) - - keyboard.w().onPressDo({ pepita.fly(1) }) - +program DinoGame { + juegoDeDinosaurio.iniciar() game.start() } 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..69076d5 100644 --- a/pruebas.wtest +++ b/pruebas.wtest @@ -1,9 +1,79 @@ -import pepita.* +import example.* -describe "group of tests for pepita" { - - test "pepita has initial energy" { - assert.equals(100, pepita.energy()) +describe "Tests de los obstaculos" { + test "La puntuación del conejo aumenta de 0 a 8 al recoger una moneda, la moneda suma 8 puntos" { + dinosaurio.puntos(0) + generadorDeMonedas.generar() + var moneda = new Moneda(image = "moneda.png") + moneda.teChocoElDino() + assert.equals(8,dinosaurio.puntos()) } + test "La puntuación del conejo disminuye de 10 a 6 al chocar con mosquito, ya que el mosquito resta 4 puntos" { + dinosaurio.puntos(10) + generadorDeMosquitos.generar() + var mosquito = new Mosquito(image = "mosquito.png") + mosquito.teChocoElDino() + assert.equals(6,dinosaurio.puntos()) +} +} + +describe "Tests de saltos" { +test "El conejo obtiene doble salto al chocar las alas" { + dinosaurio.estado(normal) + generadorDeAlas.generar() + var alas = new Alas(image = "escudo1.png") + alas.teChocoElDino() + assert.equals(dobleSalto,dinosaurio.estado()) +} +test "El conejo se mueve a la posicion (0,4) al saltar" { + dinosaurio.saltar() + assert.equals(game.at(0,4),dinosaurio.position()) +} + +test "El conejo no puede moverse a la posicion (0,8) haciendo doble salto sin el buff de las alas" { + dinosaurio.saltar() + dinosaurio.saltar() + assert.equals(game.at(0,4),dinosaurio.position()) +} +test "El conejo se mueve a la posicion (0,8) al hacer doble salto y tener buff de alas" { + generadorDeAlas.generar() + var alas = new Alas(image = "escudo1.png") + alas.teChocoElDino() + dinosaurio.saltar() + dinosaurio.saltar() + assert.equals(game.at(0,8),dinosaurio.position()) +} +} + +describe "Tests de inmunidad" { + test "El conejo obtiene inmunidad al chocar el escudo" { + dinosaurio.estado(normal) + generadorDeEscudos.generar() + var escudo = new Escudo(image = "escudo1.png") + escudo.teChocoElDino() + assert.equals(inmune,dinosaurio.estado()) +} + test "El conejo con inmunidad no pierde puntos al chocar con el mosquito" { + dinosaurio.puntos(10) + dinosaurio.estado(normal) + generadorDeEscudos.generar() + generadorDeMosquitos.generar() + var escudo = new Escudo(image = "escudo1.png") + escudo.teChocoElDino() + var mosquito = new Mosquito(image = "mosquito.png") + mosquito.teChocoElDino() + assert.equals(10,dinosaurio.puntos()) + } +test "El conejo con inmunidad no pierde el juego al chocar con el lobo" { + dinosaurio.estado(normal) + generadorDeEscudos.generar() + generadorDeLobos.generar() + var escudo = new Escudo(image = "escudo1.png") + escudo.teChocoElDino() + var lobo = new Lobo(image = "lobo1.png") + lobo.teChocoElDino() + dinosaurio.saltar() + assert.equals(game.at(0,4),dinosaurio.position()) +  } } \ No newline at end of file