@startuml
'https://plantuml.com/class-diagram

class Juego{
-primerJugador:Jugador
+accionDeJugador(unJugador:Jugador):void
}

class Jugador{
-paisesOcupados:ArrayList<Pais>
+atacarPaisDesdeA(:Pais, :Pais):void
+moverEjercidoDeA(unPais:Pais, unPais:Pais):void
+colocarEjercitoEn(unPais:Pais):void
+tieneFuerzasEn(:Pais):boolean
+perdisteA(:Pais):void
+ocupasteA(:Pais):void
+agregarFichas(:Pais)
}

class Cuartel{
- fichasDisponibles:int
+ generarDivision (cantidad:int): Ejercitos
+ canjearCartas(primeraCarta:Carta, segundaCarta:Carta, terceraCarta:Carta)
}

class Ejercitos{
+agregarEjercitos(cantidad:int):void
+restarEjercitos(cantidad:int):void
+generarDivision(cantidad:int):Ejercitos
+fueDerrotado():boolean
+sonAliadosDe(:Ejercito):boolean
+estanBajoElMandoDe(:Jugador):boolean
+disputarDominioDe(:Pais, :Ejercitos)
-confirmarNuevaDivision(numeroDeFuerzas:int)
}

class EjercitosNulos{
+ {override} disputarDominioDe(:Pais, :Ejercitos)
}

class EjercitosDeReserva{
+ {override} restarEjercitos(int cantidad)
}

interface EstadoEjercitos{
 + evaluarFuerzasRestantes(): EstadoEjercitos
 + getCantidadFuerzas(): int
 + agregarFuerzas(int numeroDeFuerzas): EstadoEjercitos
 + restarFuerzas(int numeroFuerzas): EstadoEjercitos
 + estanDerrotados(): boolean
}

class EnPie{
-numeroDeEjercitos:int
}
class Derrotados{
}

class Pais{
-nombreDelPais:String
-PaisesConectados:Array<Pais>
-ejerciotos:Ejercitos
+agregarEjercito(cantidad:int):void
+restarEjercito(cantidad:int):void
+atacarA(otroPais:Pais)
+estaOcupadoPor(Jugador unJugador)
}


class ObjetivoJugador{
-objetivoComun: Ocupacion30Paises
}

class Dados{
+tirarDado(cantidad):ArrayList<Integer>
}

class Continente{
-paises:Paises
+ estaOcupadoPor(numeroDeJugador:int): boolean
}

interface FaseDeRonda{
+{abstract} accionDeJugador(unJugador:Jugador):void
}

interface Objetivo{
+ estaCumplido(): boolean
}


class Atacar{
+accionDeJugador(unJugador:Jugador):void
}

class Reagrupar{
+accionDeJugador(unJugador:Jugador):void
}

class ColocarEjercitos{
+accionDeJugador(unJugador:Jugador):void
}

class Batalla{
+batallaEntre(ejercitoAtacante:Ejercitos, ejercitoDefensor: Ejercitos)
}

class Banco

class Carta

Juego ---->"6" Jugador
Juego --> FaseDeRonda

FaseDeRonda <|.. Atacar
FaseDeRonda <|.. Reagrupar
FaseDeRonda <|.. ColocarEjercitos


Jugador --> Pais

Jugador --> Objetivo
Jugador --> Continente

Pais --> Ejercitos

Objetivo <|.. Ocupacion
Objetivo <|.. Destruccion
Objetivo <-- ObjetivoJugador
Objetivo <|.. ObjetivoJugador

ObjetivoJugador --> Ocupacion

Ejercitos ..> Batalla
Ejercitos -->  Jugador
EstadoEjercitos <- Ejercitos
EstadoEjercitos <|.. EnPie
EstadoEjercitos <|.. Derrotados

Batalla ..> Dados

Continente --> "1..*" Pais


Banco --> Carta
Banco --> Continente


EjercitosDeReserva -|> Ejercitos
EjercitosNulos -|> Ejercitos
Jugador -> Cuartel
Cuartel -> Jugador
Cuartel ..> Ejercitos
Cuartel -> "*" Carta

@enduml