@startuml


    abstract Epoque {
        public String nom
        public abstract Set<Bateau> creerBateau()
        public String getNom()
    }
    class EpoqueXX {
        public EpoqueXX()
        public Set<Bateau> creerBateau()
    }

   class EpoqueXVI {
           public EpoqueXVI()
           public Set<Bateau> creerBateau()
   }
   class Jeu {
        private Epoque epoque
        private Humain user
        private Machine ia
        private Map<Integer,Integer> bateauDispo

        public void setEpoque(String epoque)
   }
   abstract Joueur {
        private Set<Bateau> ensBateau
        private Map<Coordonnees, Boolean> ensTir
        private Jeu jeu

        public void addBateau(Set<Bateau> bateau)
        public void tirer(Coordonnees coord)
        public boolean estDisponible(Bateau bateau)
        public boolean toucher(Coordonnees tir)
   }

   class Coordonnees {
        private int x
        private int y

       public int getX()
       public int getY()
       public void setX()
       public void setY()
   }
   class Humain {

   }
   class Machine {
        public void jouer()
        public void jouerAlgo1()
        public void jouerAlgo2()
   }
   class Bateau {
        private Set<Coordonnees> posBateau
        private String nom
        private int nbCases
        private int puissance
        private int vie
        public Bateau(String nom, int nbCases, int puissance, int vie)
        public String getNom()
        public int getNbCases()
        public int getPuissance()
        public int getVie()
        public void setNom(String nom)
        public void setNbCases(int nbCases)
        public void setPuissance(int puissance)
        public void setVie(int vie)
        public Set<Coordonnees> getPosBateau()
        public void addPosBateau(Coordonnees coord)
        public void calculPosBateau(Coordonnees avant, int direction)
        public boolean estPlace()
   }

   class VueGenerale {

   }

   class VuePlateau {

    }

   class VueMenu {

   }

   class DaoFactory {
       public abstract JeuDao getJeuDao()
       public static DaoFactory getInstance(String type)
   }

   class DaoFactoryCSV {
       private static DaoFactoryCSV instance
       public JeuDao getJeuDao()
       public static DaoFactoryCSV getInstance()
   }

   class JeuDao {
       public void save(Jeu jeu)
       public Jeu load()
   }

   class JeuDaoCSV{
       public void save(Jeu jeu)
       public Jeu load()
   }

   class Historique{
        private ArrayList<ActionStrategie> actions
            private static Historique instance
            private Historique()
            public ArrayList<ActionStrategie> getActions()
            public void addAction(ActionStrategie a)
            public void setActions(ArrayList<ActionStrategie> actions)
            public String toString()
            public static Historique getInstance()
   }

   interface ActionStrategie {
        public String getHisto()
        public void execute(Bataille mod)
   }

    class ActionEpoque {
        private String epoque
         public ActionEpoque(String epoque)
         public String getEpoque()
         public void setEpoque(String epoque)
         public String toString()
         public String getHisto()
         public void execute(Bataille mod)
    }

    class ActionPlacerBateau {
        private int nbCase;
        private Direction dir
        private Coordonnees coordonnees
        private String joueur
        private int idBateau
        public ActionPlacerBateau(int nbCase, Direction dir, Coordonnees coordonnees, String joueur, int id)
        public int getNbCase()
        public void setNbCase(int nbCase)
        public Direction getDir()
        public void setDir(Direction dir)
        public Coordonnees getCoordonnees()
        public void setCoordonnees(Coordonnees coordonnees)
        public String getJoueur()
        public void setJoueur(String joueur)
        public String toString()
        public String getHisto()
        public void execute(Bataille mod)
    }

    class ActionTirer {
        private Coordonnees coord
        private String joueur
        private int idBateau
        public ActionTirer(Coordonnees c, String j, int i)
        public Coordonnees getCoord()
        public String getJoueur()
        public int getIdBateau()
        public String toString()
        public String getHisto()
        public void execute(Bataille mod)
    }

   interface Observer

    Observable <|-- Jeu
    Observer <.. VueGenerale
    VueGenerale -- "1" Jeu
    VueGenerale -right- "2" VuePlateau
    VueGenerale -left- "1" VueMenu
    Epoque <|-- EpoqueXX
    Epoque <|-- EpoqueXVI
    Joueur <|-- Humain
    Joueur <|-- Machine
    Joueur -left- "*" Bateau
    Joueur -up- "*" Coordonnees
    Jeu -right- "1" Epoque
    Jeu "1" -left- "2" Joueur
    Coordonnees "2" -- Bateau
    DaoFactory <|-- DaoFactoryCSV
    JeuDao <.. JeuDaoCSV
    Historique -right- "*" ActionStrategie
    Bateau -[hidden]-- Historique
    ActionStrategie <.. ActionTirer
    ActionStrategie <.. ActionEpoque
    ActionStrategie <.. ActionPlacerBateau
    VueCentrale "1" -- VueGenerale
    VueHistorique "1" -- VueGenerale


@enduml
