from random import randint

class Monde:

    def __init__(self, duree_repousse = 30, dimension = 50):
        self.duree_repousse = duree_repousse
        self.dimension = dimension
        self.carte = []

        for i in range(self.dimension):
            ligne = []
            for j in range(self.dimension):
                ligne.append(randint(1, self.duree_repousse))
            self.carte.append(ligne)

    def herbePousse(self):
        for i in range(self.dimension):
            for j in range(self.dimension):
                if self.carte[i][j] < self.duree_repousse:
                    self.carte[i][j] += 1


    def herbeMangee(self, x, y):
        self.carte[y][x] = 0

    def nbHerbe(self):
        n = 0
        for i in range(self.dimension):
            for j in range(self.dimension):
                if self.carte[i][j] != 0:
                    n += 1

        return n

    def getCoefCarte(self, x, y):
        return  self.carte[y][x]


class Mouton:

    def __init__(self, x, y, gain_energie = 4, taux_reproduction = 4):
        self.gain_energie = gain_energie
        self.energie = 1.5*gain_energie
        self.taux_reproduction = taux_reproduction
        self.position = (x, y)

    def variationEnergie(self, monde):
        if monde.carte[self.position[1]][self.position[0]] == monde.duree_repousse:
            self.energie += self.gain_energie
            monde.herbeMangee(self.position[1], self.position[0])
        else :
            self.energie -= 1
        return self.energie

    def deplacement(self):
        self.position = ((self.position[0]+randint(-1,1)) % 50, (self.position[1]+randint(-1,1)) % 50)

class Loup:

    def __init__(self, x, y, gain_energie = 20, taux_reproduction = 3):
        self.gain_energie = gain_energie
        self.energie = 1.5*gain_energie
        self.taux_reproduction = taux_reproduction
        self.position = (x, y)

    def variationEnergie(self, mange):
        if mange == True :
            self.energie += self.gain_energie
        else :
            self.energie -= 1
        return self.energie

    def deplacement(self):
        self.position = ((self.position[0]+randint(-1,1)) % 50, (self.position[1]+randint(-1,1)) % 50)

        
class Simulation :

    def __init__(self, nombre_moutons = 50, nombre_loups = 2, fin_du_monde = 100) :
        self.nombre_moutons = nombre_moutons
        self.nombre_loups = nombre_loups
        self.fin_du_monde = fin_du_monde
        self.horloge = 0
        self.moutons = []
        self.loups = []
        self.monde = Monde(80,50)
        self.resultats_herbe = []
        self.resultats_moutons = []
        self.resultats_loups = []

        for i in range(self.nombre_moutons):
            self.moutons.append(Mouton(randint(0,self.monde.dimension-1), randint(0,self.monde.dimension-1)))

        for i in range(self.nombre_loups):
            self.loups.append(Loup(randint(0,self.monde.dimension-1), randint(0,self.monde.dimension-1)))


    def simMouton(self):
        while self.nombre_moutons != 0 and self.horloge != self.fin_du_monde:
            self.horloge += 1
            self.monde.herbePousse()

            for mouton in self.moutons :

                if randint(1,100) <=mouton.taux_reproduction:
                    self.moutons.append(Mouton(mouton.position[0], mouton.position[1]))

                mouton.deplacement()
                energie = mouton.variationEnergie(self.monde)
                if energie <= 0:
                    self.moutons.remove(mouton)

                for loup in self.loups:
                    if mouton.position == loup.position:
                        self.moutons.remove(mouton)
                    energie = loup.variationEnergie(self.monde)
                    if energie <= 0:
                        self.loups.remove(loup)   
                        
            self.resultats_herbe.append(self.monde.nbHerbe())
            self.resultats_moutons.append(len(self.moutons))
            self.resultats_loups.append(len(self.loups))

simulation = Simulation()
simulation.simMouton()
print(simulation.resultats_herbe)
print(simulation.resultats_moutons)
print(simulation.resultats_loups)


