Skip to content

Commit c1e71ae

Browse files
committed
#17: Refactor sobre seccion de puntuacion, para tener un ControlDePuntaje, implementando Observer
1 parent 1c79cee commit c1e71ae

11 files changed

Lines changed: 222 additions & 103 deletions

File tree

src/main/java/jwarrior/juego/Juego.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import jwarrior.comandos.Comando;
77
import jwarrior.juego.niveles.Nivel;
8-
import jwarrior.juego.puntuacion.Puntaje;
8+
import jwarrior.juego.puntuacion.ControlDePuntaje;
99
import jwarrior.piezas.unidades.Unidad;
1010
import jwarrior.ui.InterfazDeUsuario;
1111

@@ -14,24 +14,16 @@ public class Juego {
1414
private static final int CANTIDAD_MAXIMA_TURNOS = 100;
1515
private final Mapa mapa;
1616
private final Nivel nivel;
17-
private Puntaje puntaje = new Puntaje();
1817

19-
private static Juego instancia;
18+
private final ControlDePuntaje controlPuntaje = new ControlDePuntaje();
2019

2120
public Juego(final Nivel nivel) {
2221
this.nivel = nivel;
23-
this.mapa = new Mapa(nivel.obtenerPosiciones());
24-
instancia = this;
22+
this.mapa = new Mapa(nivel.obtenerPosiciones(controlPuntaje));
2523
}
2624

27-
public static Juego obtenerInstancia() {
28-
return instancia;
29-
}
30-
31-
public void notificarMuerte(final Unidad unidad) {
32-
if (unidad != this.mapa.obtenerGuerrero()) {
33-
this.puntaje.notificarMuerteEnemigo(unidad);
34-
}
25+
public Unidad obtenerGuerrero() {
26+
return this.mapa.obtenerGuerrero();
3527
}
3628

3729
private void mensaje(final String mensaje) {
@@ -58,11 +50,11 @@ public void jugar() {
5850
turno++;
5951
if (turno > CANTIDAD_MAXIMA_TURNOS || this.mapa.estaTerminado()) {
6052
juegoTerminado = true;
61-
this.puntaje.notificarFinalizacionPartida(this.mapa.obtenerGuerrero());
53+
this.controlPuntaje.notificarFinal(this);
6254
mensaje("juego terminado");
63-
mensaje("Se ha obtenido un puntaje de " + this.puntaje.obtenerPuntaje());
55+
mensaje("Se ha obtenido un puntaje de " + this.controlPuntaje.obtenerPuntaje());
6456
} else {
65-
this.puntaje.notificarTurno();
57+
this.controlPuntaje.notificarTurno(this);
6658
mensaje("");
6759
}
6860
}

src/main/java/jwarrior/juego/niveles/ConstructorDeNiveles.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.ArrayList;
44
import java.util.List;
55

6+
import jwarrior.observadores.ObservadorDeUnidades;
67
import jwarrior.piezas.Puerta;
78
import jwarrior.piezas.Salida;
89
import jwarrior.piezas.unidades.Guerrero;
@@ -11,11 +12,13 @@
1112

1213
public class ConstructorDeNiveles {
1314

14-
public List<Posicion> construirPosiciones(final String plano, final Guerrero guerrero) {
15+
public List<Posicion> construirPosiciones(final String plano,
16+
final ObservadorDeUnidades observadorDeUnidades,
17+
final Guerrero guerrero) {
1518
List<Posicion> posiciones = new ArrayList<Posicion>();
1619

1720
for (char c : plano.toCharArray()) {
18-
posiciones.add(new PosicionCodificada(c).construirPosicion(guerrero));
21+
posiciones.add(new PosicionCodificada(c, observadorDeUnidades).construirPosicion(guerrero));
1922
}
2023
return posiciones;
2124
}
@@ -24,9 +27,11 @@ public List<Posicion> construirPosiciones(final String plano, final Guerrero gue
2427

2528
class PosicionCodificada {
2629
private final char codigo;
30+
private final ObservadorDeUnidades observadorDeUnidades;
2731

28-
public PosicionCodificada(final char codigo) {
32+
public PosicionCodificada(final char codigo, final ObservadorDeUnidades observadorDeUnidades) {
2933
this.codigo = codigo;
34+
this.observadorDeUnidades = observadorDeUnidades;
3035
}
3136

3237
public Posicion construirPosicion(final Guerrero guerrero) {
@@ -35,13 +40,16 @@ public Posicion construirPosicion(final Guerrero guerrero) {
3540
retorno = new Puerta();
3641
}
3742
if (esGuerrero()) {
43+
guerrero.agregarObservador(this.observadorDeUnidades);
3844
retorno = new Posicion(guerrero);
3945
}
4046
if (esSalida()) {
4147
retorno = new Salida();
4248
}
4349
if (esOrco()) {
44-
retorno = new Posicion(new Orco());
50+
Orco orco = new Orco();
51+
orco.agregarObservador(this.observadorDeUnidades);
52+
retorno = new Posicion(orco);
4553
}
4654
return retorno;
4755
}

src/main/java/jwarrior/juego/niveles/Nivel.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,34 @@
33
import java.util.List;
44

55
import jwarrior.juego.Jugador;
6+
import jwarrior.observadores.ObservadorDeUnidades;
67
import jwarrior.piezas.unidades.Guerrero;
78
import jwarrior.posiciones.Posicion;
89

910
public abstract class Nivel {
1011

1112
private final String nombre;
1213
private final String plano;
13-
private Jugador jugador;
14+
private final Jugador jugador;
1415

1516
public Nivel(final String nombre, final String plano, final Jugador jugador) {
1617
this.nombre = nombre;
1718
this.plano = plano;
1819
this.jugador = jugador;
1920
}
2021

21-
public final List<Posicion> obtenerPosiciones() {
22+
public List<Posicion> obtenerPosiciones(final ObservadorDeUnidades observadorDeUnidades) {
2223
ConstructorDeNiveles constructor = new ConstructorDeNiveles();
23-
return constructor.construirPosiciones(this.plano, crearGuerrero());
24+
return constructor.construirPosiciones(this.plano, observadorDeUnidades, crearGuerrero());
2425
}
2526

2627
public final String obtenerNombre() {
2728
return this.nombre;
2829
}
2930

3031
private Guerrero crearGuerrero() {
31-
return new Guerrero(this.jugador.obtenerNombreDelGuerrero(), this.jugador);
32+
Guerrero resultado = new Guerrero(this.jugador.obtenerNombreDelGuerrero(), this.jugador);
33+
return resultado;
3234
}
3335

3436
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package jwarrior.juego.puntuacion;
2+
3+
import jwarrior.juego.Juego;
4+
import jwarrior.observadores.ObservadorDePartida;
5+
import jwarrior.observadores.ObservadorDeUnidades;
6+
import jwarrior.piezas.unidades.Unidad;
7+
import jwarrior.referencias.Espacio;
8+
9+
public class ControlDePuntaje implements ObservadorDePartida, ObservadorDeUnidades {
10+
11+
private Puntaje puntaje = new Puntaje();
12+
13+
@Override
14+
public void notificarMuerte(final Unidad unidad) {
15+
if (unidad.obtenerTipo() != Espacio.GUERRERO) {
16+
Integer puntos = unidad.obtenerSaludMaxima();
17+
this.puntaje.computar(puntos);
18+
}
19+
}
20+
21+
@Override
22+
public void notificarTurno(final Juego partida) {
23+
Integer puntos = -1;
24+
this.puntaje.computar(puntos);
25+
}
26+
27+
@Override
28+
public void notificarFinal(final Juego partida) {
29+
Integer puntos = partida.obtenerGuerrero().obtenerSaludActual() / 2;
30+
this.puntaje.computar(puntos);
31+
}
32+
33+
public Integer obtenerPuntaje() {
34+
return this.puntaje.obtenerPuntaje();
35+
}
36+
37+
public void establecerPuntaje(final Puntaje puntaje) {
38+
this.puntaje = puntaje;
39+
}
40+
}
Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package jwarrior.juego.puntuacion;
22

3-
import jwarrior.piezas.unidades.Unidad;
4-
import jwarrior.ui.InterfazDeUsuario;
53

64
public class Puntaje {
75

@@ -13,28 +11,7 @@ public Integer obtenerPuntaje() {
1311
return this.puntos;
1412
}
1513

16-
// TODO: implementar una CalculadoraDePuntaje
17-
public void notificarTurno() {
18-
Integer puntos = 1;
19-
mensaje("-" + puntos);
20-
this.puntos -= puntos;
21-
}
22-
23-
// TODO: implementar una CalculadoraDePuntaje
24-
public void notificarMuerteEnemigo(final Unidad unidad) {
25-
Integer puntos = unidad.obtenerSaludMaxima();
26-
mensaje("+" + puntos);
14+
public void computar(final Integer puntos) {
2715
this.puntos += puntos;
2816
}
29-
30-
// TODO: implementar una CalculadoraDePuntaje
31-
public void notificarFinalizacionPartida(final Unidad guerrero) {
32-
Integer puntos = guerrero.obtenerSaludActual() / 2;
33-
mensaje("+" + puntos);
34-
this.puntos += puntos;
35-
}
36-
37-
protected void mensaje(final String mensaje) {
38-
InterfazDeUsuario.obtenerInstancia().mensaje(mensaje);
39-
}
4017
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package jwarrior.observadores;
2+
3+
import jwarrior.juego.Juego;
4+
5+
public interface ObservadorDePartida {
6+
7+
void notificarTurno(Juego partida);
8+
9+
void notificarFinal(Juego partida);
10+
11+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package jwarrior.observadores;
2+
3+
import jwarrior.piezas.unidades.Unidad;
4+
5+
public interface ObservadorDeUnidades {
6+
7+
void notificarMuerte(Unidad unidad);
8+
9+
}

src/main/java/jwarrior/piezas/unidades/Guerrero.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import jwarrior.comandos.Comando;
55
import jwarrior.juego.Jugador;
66

7-
87
public class Guerrero extends Unidad {
98

109
private static final int FUERZA_MAXIMA = 5;

src/main/java/jwarrior/piezas/unidades/Unidad.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package jwarrior.piezas.unidades;
22

3+
import java.util.LinkedList;
4+
import java.util.List;
5+
36
import jwarrior.comandos.Comando;
47
import jwarrior.fabricas.LocalizadorDeFabricas;
5-
import jwarrior.juego.Juego;
8+
import jwarrior.observadores.ObservadorDeUnidades;
69
import jwarrior.piezas.Pieza;
710
import jwarrior.referencias.Direccion;
811
import jwarrior.referencias.Espacio;
@@ -17,11 +20,17 @@ public abstract class Unidad extends Pieza {
1720
private Integer saludActual = 0;
1821
private Integer fuerzaMaxima = 0;
1922

23+
private List<ObservadorDeUnidades> observadores = new LinkedList<ObservadorDeUnidades>();
24+
2025
protected Unidad(final String nombre, final Espacio tipo) {
2126
super(tipo);
2227
this.nombre = nombre;
2328
}
2429

30+
public void agregarObservador(ObservadorDeUnidades observadorDeUnidades) {
31+
this.observadores .add(observadorDeUnidades);
32+
}
33+
2534
// Puntos de extensión
2635

2736
public Comando proximoComando() {
@@ -84,10 +93,9 @@ public final void curar(final Integer cantidadARestaurar) {
8493
protected void morir() {
8594
this.decir("muere");
8695
this.obtenerPosicion().liberar();
87-
// FIXME: Deberia haber algo como una CentralDeNotificaciones, para
88-
// evitar que se acople la unidad al juego.
89-
if (Juego.obtenerInstancia() != null) { // FIXME: hack para testear.
90-
Juego.obtenerInstancia().notificarMuerte(this);
96+
97+
for (ObservadorDeUnidades observador : this.observadores) {
98+
observador.notificarMuerte(this);
9199
}
92100
}
93101

0 commit comments

Comments
 (0)