# -*- coding:utf-8 -*-

__projet__ = "Corrections"
__nom_fichier__ = "bataille_navale"
__author__ = "Christine Fay-Varnier"
__date__ = "avril 2024"

class Element:
    def __init__(self, posl, posc):
        self.posl_ = posl   # position en ligne
        self.posc_ = posc   # position en colonne
        self.etat_ = 0      # élément sain au départ

    def __str__(self):
        return "position : " + str(self.posl_) + " " + str(self.posc_) + " etat : " + str(self.etat_)

    def get_etat(self):
        return self.posl_, self.posc_

    def est_touche(self, lig, col):
        """

        @param lig: coordonnées d’un coup joué
        @param col:
        @return:    met à jour l’attribut état de l’élément à 1 si le coup touche l’élément
        """
        if self.posl_==lig and self.posc_==col:
            self.etat = 1

class Bateau:
    def __init__(self, lg, l, c, direction):
        """

        @param lg:          longueur du bateau
        @param l:           position en ligne du 1er élément du bateau
        @param c:           position en colonne du 1er élément du bateau
        @param direction:   "h" horizontal "v" vertical
        """
        if direction == "h":    # si la direction est horizontale on ajoute des éléments en incrémentant le numéro de colonne
            dl, dc = 0, 1
        else:                    # si la direction est verticale on ajoute des éléments en incrémentant le numéro de ligne
            dl, dc = 1, 0

        # on part de la position du 1er élément du bateau
        self.lg_ = lg
        self.elements_ = [Element(l, c)]
        for _ in range(lg-1):
            # on avance selon dl et dc (sur la ligne ou la colonne)
            l += dl
            c += dc
            elt = Element(l, c)
            self.elements_.append(elt)

        self.etat_ = 0  # le bateau est intact au départ

    def get_etat(self):
        return self.etat_

    def __lt__(self, other):
        # un bateau est plus petit qu'un autre si sa longueur est plus petite
        return self.lg_ < other.lg_

    def est_touche(self, lig, col):
        """

        @param lig: coordonnées d’un coup joué
        @param col:
        @return:    met à jour l’attribut état du bateau à jour (intact=0, touché=1 ou coulé=2)
                    Un bateau est coulé si tous ses éléments sont touchés
        """
        # on regarde si le coup atteint un des éléments du bateau
        # et on compte combien d'éléments sont touchés pour savoir si le bateau est coulé

        for elt in self.elements_:
            elt.est_touche(lig, col)

    def maj_etat(self):
        n = 0   # nombre d'élément touchés
        for elt in self.elements_:
            if elt.etat_ == 1:  # l'élément est touché
                n += 1

        if n == 0:  # pas d'élément touché
            self.etat_ = 0  # le bateau est sain
        elif n==self.lg_:   # tous les éléments sont touchés
            self.etat_ = 2  # le bateau est coulé
        else:
            self.etat_ = 1  # le bateau est touché

# définition des différents types de bateaux
class Croiseur(Bateau):
    def __init__(self, l, c, direction):
        Bateau.__init__(self, 3,  l, c, direction)

class Escorteur(Bateau):
    def __init__(self, l, c, direction):
        Bateau.__init__(self, 2,  l, c, direction)

class Sous_marin(Bateau):
    def __init__(self, l, c, direction):
        Bateau.__init__(self, 1,  l, c, direction)
        self.plongee_ = False

    def est_touche(self, lig, col):
        if not self.plongee_:
            Bateau.est_touche(self, lig, col)

class Bataille:
    def __init__(self, dim, lbateaux):
        self.dim_ = dim
        self.lbateaux_ = lbateaux

    def jouer(self, l, c):
        for bateau in self.lbateaux_:
            bateau.est_touche(l, c)

    def fin_partie(self):
        """

        @return:    True si la partie est terminée c'est-à-dire si tous les bateaux sont coulés
        """
        for bateau in self.lbateaux_:
            if bateau.est_touche()!=2:
                # si un bateau n'est pas coulé on peut retourner False tout de suite
                return False

        return True

if __name__ == '__main__':

    barque = Bateau(2, 1, 1, "h")
    print(barque.lg_, barque.etat_)
    for elt in barque.elements_:
        print(elt)
