Skip to content

Commit

Permalink
Jueguito terminado
Browse files Browse the repository at this point in the history
Co-authored-by: Santino Bouvet <[email protected]>
Co-authored-by: FeliPampin <[email protected]>
Co-authored-by: FrancoVinaccia <[email protected]>
  • Loading branch information
4 people committed Nov 7, 2024
1 parent 810da20 commit b2e2aac
Show file tree
Hide file tree
Showing 8 changed files with 80 additions and 46 deletions.
13 changes: 9 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,22 @@ El objetivo del juego es controlar al rey negro y sobrevivir la mayor cantidad d
- `Space` para disparar
- `P` para pausar el juego
- `R` para reiniciar el juego una vez terminado
- `T` para mostrar la tabla de puntajes
- `Enter` para iniciar el juego

## Como implementamos los conceptos del paradigama?
En nuestro juego aplicamos varios conceptos del paradigma orientado a objetos, como el polimorfismo entre distintas clases u objetos, y la idea de que todo es un objeto, incluidas las funciones.
En nuestro juego aplicamos varios conceptos del paradigma orientado a objetos, como el polimorfismo entre distintas clases u objetos, la idea de que todo es un objeto, incluidas las funciones, y la herencia entre clases.

El polimorfismo se puede ver principalmente en dos casos: en el método reaccionar(objeto, bala) que tiene el rey negro, y en el método aparecerPieza() del objeto spawnEnemigo.

En la función reaccionar(objeto, bala) usamos polimorfismo porque, en ese momento, no importa qué tipo de objeto es el que reacciona, sino que buscamos que pueda entender el mensaje recibirDaño, que es parte de la función. Como siempre va a ser una pieza blanca, al tener ese método en cada pieza, nos evitamos tener que hacer un if para cada una en particular.

Por otro lado, en la función spawnEnemigo() también usamos polimorfismo para evitar hacer un número aleatorio y luego un montón de ifs para que, dependiendo del número, aparezca una pieza u otra. Al asignar directamente una pieza a una constante y luego hacer que esa constante entienda el mensaje empezarMoverse(), nos ahorramos repetir lógica y usamos un enfoque más acorde al paradigma.

Finalmente, en el objeto spawnEnemigo usamos una lista de funciones, lo que hace mucho más fácil la creación de enemigos. Al poner algo como const pieza = [new Peon(), new Caballo()].anyOne(), logramos que la función sea más simple, corta y flexible. Si en el futuro queremos agregar una nueva pieza, solo tenemos que sumarla a la lista, sin cambiar casi nada del código.
El otro concepto de objetos se puede ver en el objeto spawnEnemigo donde usamos una lista de funciones, lo que hace mucho más fácil la creación de enemigos. Al poner algo como const pieza = [new Peon(), new Caballo()].anyOne(), logramos que la función sea más simple, corta y flexible. Si en el futuro queremos agregar una nueva pieza, solo tenemos que sumarla a la lista, sin cambiar casi nada del código.

## Diagrama de Clases
![Diagrama Clases Tp Juego](assets/DiagramaClasesTpJuego.png)
Finalmente el ultimo concepto del paradigma de objetos que usamos en nuestro tp fue el de herencia. Esto se ve reflejado en la clase piezaBlanca, la cual contiene las bases del comportamiento general que comparten todas las piezas enemigas (movimiento, recepción de daño, entre otros). A partir de esta superclase, desarrollamos las distintas piezas (subclases), cada una con sus propias características y comportamientos unicos.

:)

## Diagrama de Clases
Binary file removed assets/DiagramaClasesTpJuego.png
Binary file not shown.
13 changes: 6 additions & 7 deletions src/juegoAjedrez.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ object juegoAjedrez2{
if(nroJuego == 1) {
keyboard.w().onPressDo({reyNegro.moverArriba()})
keyboard.s().onPressDo({reyNegro.moverAbajo()})
keyboard.space().onPressDo({reyNegro.disparar()})
keyboard.space().onPressDo({if(!juegoPausado && !juegoTerminado) reyNegro.disparar()})
keyboard.p().onPressDo(
{
if(!juegoPausado && !menuInicial.estaEnMenu() && !tablaPuntajes.estaEnTabla()) {
if(!juegoPausado && !juegoTerminado) {
self.pausarJuego()
pausa.agregarTextoDePausa()
}
else self.reanudarJuego()
else if(!menuInicial.estaEnMenu() && !tablaPuntajes.estaEnTabla()) self.reanudarJuego()
}
)
keyboard.r().onPressDo(
Expand All @@ -56,7 +56,6 @@ object juegoAjedrez2{
sistemaOleadas.reiniciarOleadas()
puntajeFinal.sacarPuntajeFinal()
self.iniciar()
juegoPausado = false
}
}
)
Expand Down Expand Up @@ -105,9 +104,6 @@ object juegoAjedrez2{
game.removeVisual(personaje)
listaPersonajes.remove(personaje)
}
method bloquearTeclasMovimientoRey() {

}

method pausarJuego() {
juegoPausado = true
Expand All @@ -125,5 +121,8 @@ object juegoAjedrez2{
listaPersonajes.forEach({personaje => self.removerPersonaje(personaje)})
juegoTerminado = true
}

// Funcion Test
method listaVisuales() = listaVisuales

}
5 changes: 1 addition & 4 deletions src/menu.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,7 @@ object tablaPuntajes {
const filaCuatro = new Texto(texto = "PRESIONE T PARA VOLVER AL MENU INICIAL", posicion = game.at(4,0))

method actualizarTabla(puntaje) {
if(tablaPuntos.size() < 3) {
self.agregarATabla(puntaje)
} else if(tablaPuntos.last() < puntaje) {
if(tablaPuntos.last() < puntaje) {
tablaPuntos.remove(tablaPuntos.last())
self.agregarATabla(puntaje)
}
Expand Down Expand Up @@ -76,7 +74,6 @@ object tablaPuntajes {
}
}


object puntajeFinal {
var puntaje = 0
var filaUno = new Texto(texto = "EL PUNTAJE FUE DE " + puntaje + " PUNTOS")
Expand Down
35 changes: 18 additions & 17 deletions src/piezasBlancas.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class PiezaBlanca {
// FUNCIONES PARA TESTS
method vida() = vida
method cambiarPosicion(posicion) {position = posicion}

method danio() = danioAEfectuar
}

class Peon inherits PiezaBlanca(vida = 100, puntajeDado = 50, danioAEfectuar = 25) {
Expand Down Expand Up @@ -86,35 +86,36 @@ class Caballo inherits PiezaBlanca(vida = 75, puntajeDado = 75, danioAEfectuar =

class Torre inherits PiezaBlanca(vida = 200, puntajeDado = 100, danioAEfectuar = 50, moverse = new Tick(interval = 3500, action = {self.moverse()})) {
method image() = "torre.png"
override method consecuenciaDisparo(){}
}

class Alfil inherits PiezaBlanca(vida = 100, puntajeDado = 75, danioAEfectuar = 35) {
var movimiento = [1,2].anyOne()
class Alfil inherits PiezaBlanca(vida = 100, puntajeDado = 75, danioAEfectuar = 35, moverse = new Tick(interval = 3500, action = {if(!stun) self.moverse()})) {
var movimiento = [1,2].anyOne() // 1 = Moverse siempre hacia arriba || 2 = Moverse siempre hacia abajo
var stun = false
method image() = "alfil.png"

override method accionExtra() {
if(position.y() == 0 || movimiento == 1) {
self.moverseTodoParaArriba()
if(position.y() == 0) {
movimiento = 1
} else if(position.y() == game.height() - 1) {
movimiento = 2
}
if(position.y() == game.height() || movimiento == 2) {
self.moverseTodoParaAbajo()

if(movimiento == 1) {
position = position.up(1)
} else if(movimiento == 2) {
position = position.down(1)
}
}
method moverseTodoParaArriba() {
movimiento = 1
position = position.up(1)
}
method moverseTodoParaAbajo() {
movimiento = 2
position = position.down(1)
}

override method consecuenciaDisparo() {
//desarrollar consecuencia (la idea era que se quede quieto un segundo)
stun = true
game.schedule(1000, {stun = false})
// cambiar imagen a una con pajaritos en la cabeza
}
}

class Reina inherits Caballo(vida = 150, puntajeDado = 200, danioAEfectuar = 50, moverse = new Tick(interval = 2500, action = {self.moverse()})) {
class Reina inherits Caballo(vida = 150, puntajeDado = 200, danioAEfectuar = 50, moverse = new Tick(interval = 1000, action = {self.moverse()})) {
override method image() = "reina.png"
override method consecuenciaDisparo() {
//imagenActual = "reinadañada.png"
Expand Down
54 changes: 43 additions & 11 deletions src/pruebas.wtest
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,50 @@ describe "TESTS DE PIEZAS BLANCAS" {

test "El caballo se mueve uno para delante y uno para arriba o abajo" {
const caballo = new Caballo()
const xIncial = caballo.position().x()
const yInical = caballo.position().y()
const xInicial = caballo.position().x()
const yInicial = caballo.position().y()
caballo.moverse()
assert.notThat(caballo.position().x() == xIncial)
assert.that(caballo.position().y() == yInical + 1 || caballo.position().y() == yInical - 1)
assert.notThat(caballo.position().x() == xInicial)
assert.that(caballo.position().y() == yInicial + 1 || caballo.position().y() == yInicial - 1)
}

// OJO CON ESTA, REVISAR
// test "La pieza desaparece al llegar a la columna del rey" {
// const peon = new Peon()
// peon.cambiarPosicion(game.at(1,2))
// peon.moverse()
// assert.notThat(peon)
// }
test "El alfil se mueve para arriba o para abajo y uno para adelante" {
const alfil = new Alfil()
const xInicial = alfil.position().x()
const yInicial = alfil.position().y()
alfil.moverse()
assert.notThat(alfil.position().x() == xInicial)
assert.that(alfil.position().y() == yInicial + 1 || alfil.position().y() == yInicial - 1)
}

test "La torre se mueve uno para adelante" {
const torre = new Torre()
const xInicial = torre.position().x()
torre.moverse()
assert.notEquals(xInicial, torre.position().x())
}

test "La reina se mueve igual que el caballo" {
const reina = new Reina()
const xInicial = reina.position().x()
const yInicial = reina.position().y()
reina.moverse()
assert.notEquals(xInicial, reina.position().x())
assert.that(reina.position().y() == yInicial + 1 || reina.position().y() == yInicial - 1)
}

test "La reina aumenta el danio cuando le disparan" {
const reina = new Reina()
const danioInicial = reina.danio()
const bala = new Bala()
reyNegro.reaccionar(reina, bala)
assert.notEquals(danioInicial, reina.danio())
}

test "La pieza desaparece al llegar a la columna del rey" {
const peon = new Peon()
peon.cambiarPosicion(game.at(1,2))
peon.moverse()
assert.notThat(juegoAjedrez2.listaVisuales().contains(peon))
}
}
4 changes: 2 additions & 2 deletions src/reyNegro.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import menu.*


object reyNegro {
var vida = 1
var vida = 100
var puntaje = 0
var position = game.at(0,2)
var cooldown = 1
Expand Down Expand Up @@ -71,7 +71,7 @@ object reyNegro {
}

class Bala {
const moverse = new Tick(interval = 200, action = {self.moverse()})
const moverse = new Tick(interval = 200, action = {if(!juegoAjedrez2.estaPausado()) self.moverse()})
var position = reyNegro.position().right(1)

method image() = "bala.png"
Expand Down
2 changes: 1 addition & 1 deletion src/spawn.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ object sistemaOleadas {
return "FINAL"
}
}
const listaTiempos = [4000,3000,1500]
const listaTiempos = [4000,3000,1000]

method nuevoTiempoSpawn(oleadaAnterior, eventoOleada) {
juegoAjedrez2.removerEvento(oleadaAnterior)
Expand Down

0 comments on commit b2e2aac

Please sign in to comment.