#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Nov  6 09:23:02 2025

@author: pjoulaud
"""

class Cellule:
    def __init__(self):
        self.actuel = False
        self.futur = False
        self.voisins = None
        
    def est_vivant(self):
        return self.actuel
    def set_voisins(self, cell_voisines):
        self.voisins = cell_voisines
    def get_voisins(self):
        return self.voisins
    def naitre(self):
        self.futur = True
    def mourir(self):
        self.futur = False
    def basculer(self):
        self.actuel = self.futur
    def __repr__(self):
        if self.actuel:
            return 'x'
        return '-'
    def __str__(self):
        return self.__repr__()
    def calcule_etat_futur(self):
        nb_voisines_vivantes = 0
        for cel in self.voisins():
            if cel.est_vivant:
                nb_voisines_vivantes = nb_voisines_vivantes + 1
        if self.est_vivant():
            if nb_voisines_vivantes!=2 or nb_voisines_vivantes!=3:
                self.mourir()
        else :
            if nb_voisines_vivantes==3:
                self.naitre()
                
class Grille :
    def __init__(self, haut=5, larg=10):
        self.largeur = larg
        self.hauteur = haut
        self.matrix = []
        for h in range(self.hauteur):
            self.matrix.append([])
            for l in range(self.largeur):
                self.matrix[h].append(Cellule())
    def dans_grille(self, i, j):
        if i<0 or i>=self.hauteur :
            return False
        if j<0 or j>=self.largeur:
            return False
        return True
    def setXY(self, x, y, obj):
        self.matrix[y][x]=obj
    def getXY(self, x, y):
        return self.matrix[y][x]
    def get_largeur(self):
        return self.largeur
    def get_hauteur(self):
        return self.hauteur
    def est_voisin(self, x, y, i, j):
        if abs(x-i)==1 and abs(y-j)<=1:
            return True
        if abs(y-j)==1 and abs(x-i)<=1:
            return True
        return False
    def get_voisins(self, x,y):
        liste_voisins = [self.matrix[y-1][x-1], self.matrix[y-1][x], self.matrix[y-1][x+1], 
             self.matrix[y][x-1], self.matrix[y][x+1], 
             self.matrix[y+1][x-1], self.matrix[y+1][x], self.matrix[y+1][x+1]
             ]
        return liste_voisins
    def affecte_voisins(self):
        for h in range(self.hauteur):
            for l in range(self.largeur):
                self.matrix[h][l].voisins = self.get_voisins(l, h)
    def __repr__(self):
        aff = ""
        for h in range(self.hauteur):
            for l in range(self.largeur):
                aff += self.matrix[h][l].__repr__()
                aff +=' '
            aff += "\n"
        return aff
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        