@startuml

class Jugador {
    - penalizaciones : int
    - vehiculo : Vehiculo
    - posicion : Posicion
    - cantidadMovimientos : int
    + totalPenalizaciones() : int
    + posicionDelJugador() : Posicion
    + movimientosRealizados() : int
    + moverse(Movimiento, Escenario)
}

class Movimiento {
    - x : int
    - y : int
    + obtenerX() : int
    + obtenerY() : int
}

class Escenario {
    - altura : int
    - anchura : int
    - matriz : ElementoDelEscenario
    + ponerUnElemento(ElementoDelEscenario,Posicion)
    + obtenerElementoEnEscenario(Posicion) : ElementoDelEscenario
    + estaDentroDelEscenario(Posicion) : Bool
}

class Posicion {
    - x : int
    - y : int
    + obtenerX() : int
    + obtenerY() : int
    + moverseDesdePosicionInicial(Movimiento)
}

class Pozo {
    +  obtenerPuntosDePenalizacion(Moto) : int
    +  obtenerPuntosDePenalizacion(Auto) : int
    +  obtenerPuntosDePenalizacion(Todoterreno) : int
}

class Vacio {
    +  obtenerPuntosDePenalizacion(Moto) : int
    +  obtenerPuntosDePenalizacion(Auto) : int
    +  obtenerPuntosDePenalizacion(Todoterreno) : int
}

class Auto {
    + chocar(ElementoDelEscenario) : int
}

class Moto {
    + chocar(ElementoDelEscenario) : int
}

class Todoterreno {
    - pozosEncontrados : int
    + chocar(ElementoDelEscenario) : int
}

interface Vehiculo {
    + chocar(ElementoDelEscenario) : int
}

interface ElementoDelEscenario {
    + obtenerPuntosDePenalizacion(Moto) : int
    + obtenerPuntosDePenalizacion(Auto) : int
    + obtenerPuntosDePenalizacion(Todoterreno) : int
}

Jugador -> Vehiculo
Movimiento <- Jugador

Vehiculo <|-- Auto
Vehiculo <|-- Moto
Vehiculo <|-- Todoterreno

ElementoDelEscenario <|-- Pozo
ElementoDelEscenario <|-- Vacio

Jugador --> Posicion
Jugador -> Escenario

Escenario --> ElementoDelEscenario
Escenario -> Posicion
Movimiento <-- Posicion
Vehiculo ..> ElementoDelEscenario

@enduml