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

skinparam classAttributeIconSize 0
skinparam classFontStyle Bold
skinparam style strictuml
hide empty members

package Controller{

    class JeuController{
        - jeu : Jeu
        + JeuController(jeu : Jeu)
        + setNbManches(nbManches : Integer)
        + setNbPionsCombi(nbPionsCombi : Integer)
        + setNbPionsTotal(nbPionsTotal : Integer)
        + setNbTentatives(nbTentatives : Integer)
    }

    class MancheController
    {
        + MancheController(manche : Manche)
        + genererCombinaisonSecrete(manche : Manche)
        + genererIndices(contexte : JeuPrintStrategy, tentative : Tentative)
        + verifierCombinaison(tentative : Tentative) : Boolean
        + calculerScore(tentative : Tentative)
    }
}

package java.awt{
    class Color
}

package Model{

    class Jeu{
        - nbManches : Integer
        - nbPionsCombi : Integer
        - nbPionsTotal : Integer
        - nbTentatives : Integer
        - score : Integer
        -ModeJeu : String
        + Jeu()
        + getContexte() : JeuPrintStrategy
        + getNbManches() : Integer
        + getNbPionsCombi() : Integer
        + getNbPionsTotal() : Integer
        + getNbTentatives() : Integer
        + getScore() : Integer
        + getModeJeu() : String
        + setContexte(contexte : JeuPrintStrategy)
        + setNbManches(nbManches : Integer)
        + setNbPionsCombi(nbPionsCombi : Integer)
        + setNbPionsTotal(nbPionsTotal : Integer)
        + setNbTentatives(nbTentatives : Integer)
        + setModeJeu(md : String)
        + addJeuObserver(obs : JeuObserver)
        + notifyJeuObserver()
    }
    Manche o--> "1\n -partie" Jeu
    '''Jeu o-u-> "*\n -manches" Manche

    class Manche {
        - score : Integer
        - nbTentativesRestantes : Integer
        + Manche(jeu : Jeu)
        + addObserver(obs : MancheObserver)
        + notifyObserver()
        + getPartie() : Jeu
        + getcombinaisonSecrete() : Color[]
        + setCombanaisonSecrete(combi : Color[])
        + getNbTentativesRestantes() : Integer
        + getScore() : Integer
        + setNbTentativesRestantes(tentativesRestantes : Integer)
        + setScore(score : Integer)
    }
    Jeu o-d->"*\n -couleursPion" Color
    Manche o-d->"*\n -combinaisonSecrete" Color

    class Tentative{
        -nbAbs : Integer
        -nbFaux : Integer
        -nbVrais : Integer
        +Tentative(manche : Manche)
        +getCombinaisonTentee() : Color[]
        +getIndicesTentative() : Color[]
        +getAbs() : Integer
        +getFaux() : Integer
        +getVrais() : Integer
        +setCombinaisonTentee() : Color[]
        +setIndicesTentative() : Color[]
        +setAbs()
        +setFaux
        +setVrais
    }
    Tentative o-d->"*\n -combinaisonTentee" Color
    Tentative o-d->"*\n -indicesTentative" Color

    Manche o-d-> "*\n -tentatives" Tentative : > possède

    interface JeuObserver{
        + Update()
    }
    interface MancheObserver{
       + Update()
    }

    interface JeuPrintStrategy{
        + affichIndices(manche : Manche, tentative : Tentative)
    }

    class EasyPrint implements JeuPrintStrategy{
        + affichIndices(manche : Manche, tentative : Tentative)
    }
    class ClassicPrint implements JeuPrintStrategy{
        + affichIndices(manche : Manche, tentative : Tentative)
    }
    class NumericPrint implements JeuPrintStrategy{
        + affichIndices(manche : Manche, tentative : Tentative)
    }

    Jeu "1\n -contexte" o-> JeuPrintStrategy

}
package View{
    class JeuWindow extends JFrame implements Model.JeuObserver{
        - jeu : Jeu
        - jeuController : JeuController
        + JeuWindow(jeu : Jeu, jeuController : JeuController)
        + Menu()
        + Option()
        + game()
        + Update()
    }

    class JeuTextuelle implements Model.JeuObserver
    {
        -jeu : Jeu
        -jeuController : JeuController
        +JeuTextuelle(jeu : Jeu, jeuController : JeuController)
        +Update()
    }
}
class MasterMind
{
    main(args : String[])
}
View.JeuWindow o-> "1 \n controller"Controller.JeuController : > send
View.JeuWindow o->"1 \n jeu" Model.Jeu : > display
MasterMind ..> View.JeuWindow : <<create>>
MasterMind ..> Controller.JeuController : <<create>>
MasterMind ..> Model.Jeu : <<create>>
Model.Jeu "*\n jeuObservers" o-u-> Model.JeuObserver : < observe
Model.Manche "*\n mancheObservers" o-> Model.MancheObserver : < observe
Controller.JeuController  ..> Model.Manche : <<create>>
Controller.JeuController  ..> Controller.MancheController : <<create>>
Controller.MancheController o-u->"1 \n Manche" Model.Manche : > modifie
Controller.JeuController o->"1 \n Jeu" Model.Jeu : > modifie
Controller.MancheController o->"1 \n manche" Model.Manche : > modifie
@enduml