@startuml package "GameSystem" {

enum ProgressType {
    INVENTION
    ROADCONSTRUCTION
    MONOPOLY
}
enum Color {
    RED
    ORANGE
    BLUE
    WHITE
}
enum InfrastructureType {
    CITY
    COLONY
    ROAD
}
enum Resources {
    WOOD
    CLAY
    WOOL
    WHEAT
    MINERALS
}
enum LandType {
    FOREST
    HILL
    MEADOW
    FIELD
    MOUNTAIN
    DESERT
    SEA
}
class Infrastructure {
    - type : InfrastructureType
    - color : Color
    + setToCity()
}
class Build{
  - board : GameBoard
  + updateGameBoard()
}
package "GameBoard" {
    class GameBoard {
        + determinateResources(Integer) : Map<Color,Map<Resources,Integer>>
    }
class LandTile {
    - identifier : Integer
    - num : Integer
    - resource : Resources
    - type : LandType
    + getResources() : Resources
}
class Port {
    - nbResourcesForExchanges : Integer
    + isSpecialised() : boolean
    + getSpecialisation() : Map<Resources,Integer>
}
class CommonPort
class SpecialPort {
    specialisation : Resources
}
    Port <|-- CommonPort
    Port <|-- SpecialPort
    Port -- "[2..3] \n - position" LandTile
    GameBoard -- "[25] \n - tiles" LandTile
    GameBoard -up- "- infrastructuresGameBoard[]" Build
    LandTile "[2..3] \n - position" -up- Infrastructure
}
class Dice {
    - value : Integer
    + rollDice() : Integer
}
package "Card" {
    class DevelopmentCard {
        - name : String
        + playCard(Player)
    }
    class ProgressCard {
        - typeOfProgress : ProgressType
    }
    class KnightCard
    class VictoryPointCard
    DevelopmentCard <|-right- KnightCard
    DevelopmentCard <|-up- ProgressCard
    DevelopmentCard <|-up- VictoryPointCard
}
class Trade{
  + selectResources(Map<Resources, Integer>) : Map<Resources, Integer>
  + sendResourcesToPlayer(Map<Resources, Integer>)
  + sendResourcesToBank(Map<Resources, Integer>)
}
class Game {
    - players : Player[]
    - pointsToWin : Integer
    + start()
    + createGameBoard()
    + attributeColors()
    + determinatePlayersOrder()
    + beginningPlacement()
    + distributeResources(Map<Resources,Integer>)
    + determineWinner() : Player
    + end()
}
Game -- "- gameBoard" GameBoard
Game -- "[25] \n - listDevCards" DevelopmentCard
Game -- "- dice" Dice : "\t\t"
class Player {
    - name : String
    - color : Color
    - /score : Integer
    - nbKnights : Integer
    - hasLongestRoad : Boolean
    - hasGreatestArmy : Boolean
    + playTurn(GameBoard)
    + addToScore(Integer)
    + addToNbKnights(Integer)
    + constructRoad()
    + constructColony()
    + constructCity()
    + startExchangeWithPlayer()
    + startExchangeWithBank()
    + drawDevelopmentCard()
}
Player -left- "- listVictoryPointCards[]" DevelopmentCard : "\t\t\t\t\t\t\t\t\t"
Player -- "[0..9] \n - listPorts" Port
Player --> Trade
Player -- Build
Trade --> Player
Trade -- Game
Build -- Infrastructure
class Map <T,V>{
    put(K,V)
    get(K) : V
}
note bottom of Map : It's a dictionnary. K is the key and V the values. \n We don't associate the methods of Game, Trade, \n GameBoard and Port which need it because of clarity. \n But it will be important.
    Player -left- "- resources" Map : "<<bind>> K = Resources, V = Integer"
}
@enduml