# Jeu de la vie de Conway
# Le canon

from tkinter import *
from random import randrange

haut = 60  # hauteur du tableau
larg = 60  # largeur du tableau
cote = 15  # côté d'une cellule
vivant = 1
mort = 0
flag = 0

# Créer les matrices
cell = [[0 for row in range(haut)] for col in range(larg)]
etat = [[mort for row in range(haut)] for col in range(larg)]
temp = [[mort for row in range(haut)] for col in range(larg)]

# Calculer et dessiner le prochain tableau
def tableau():
    global flag
    calculer()
    dessiner()
    if flag==1:
        fenetre.after(100, tableau)
    else:
        flag=0

# Données initiales
def init():
    for y in range(haut):
        for x in range(larg):
            etat[x][y] = mort
            temp[x][y] = mort
            cell[x][y] = canvas.create_rectangle((x*cote, y*cote, (x+1)*cote, (y+1)*cote), outline="gray", fill="white")
    # placer les cellules du canon
    etat[26][2] = vivant

    etat[24][3] = vivant
    etat[26][3] = vivant

    etat[14][4] = vivant
    etat[15][4] = vivant
    etat[22][4] = vivant
    etat[23][4] = vivant
    etat[36][4] = vivant
    etat[37][4] = vivant

    etat[13][5] = vivant
    etat[17][5] = vivant
    etat[22][5] = vivant
    etat[23][5] = vivant
    etat[36][5] = vivant
    etat[37][5] = vivant

    etat[12][6] = vivant
    etat[18][6] = vivant
    etat[2][6] = vivant
    etat[3][6] = vivant
    etat[22][6] = vivant
    etat[23][6] = vivant

    etat[12][7] = vivant
    etat[18][7] = vivant
    etat[2][7] = vivant
    etat[3][7] = vivant
    etat[16][7] = vivant
    etat[19][7] = vivant
    etat[24][7] = vivant
    etat[26][7] = vivant

    etat[12][8] = vivant
    etat[18][8] = vivant
    etat[26][8] = vivant

    etat[13][9] = vivant
    etat[17][9] = vivant

    etat[14][10] = vivant
    etat[15][10] = vivant

# Appliquer les 4 règles
def calculer():
    for y in range(haut):
        for x in range(larg):
            nb_voisins = voisins_vivants_tore(x,y)
            # Règle 1 - Mort de solitude
            if etat[x][y] == vivant and nb_voisins < 2:
                temp[x][y] = mort
            # Règle 2 - Toute cellule avec 2 ou 3 voisins survit.
            if etat[x][y] == vivant and (nb_voisins == 2 or nb_voisins == 3):
                temp[x][y] = vivant
            # Règle 3 - Mort par asphyxie
            if etat[x][y] == vivant and nb_voisins > 3:
                temp[x][y] = mort 
            # Règle 4 - Naissance
            if etat[x][y] == mort and nb_voisins == 3:
                temp[x][y] = vivant
    for y in range(haut):
        for x in range(larg):
            etat[x][y] = temp[x][y]

# Compter les voisins vivants - tableau torique
def voisins_vivants_tore(a,b):
    nb_voisins = 0
    if etat[(a-1)%larg][(b+1)%haut] == 1:
        nb_voisins += 1
    if etat[a][(b+1)%haut] == 1:
        nb_voisins += 1
    if etat[(a+1)%larg][(b+1)%haut] == 1:
        nb_voisins += 1
    if etat[(a-1)%larg][b] == 1:
        nb_voisins += 1
    if etat[(a+1)%larg][b] == 1:
        nb_voisins += 1
    if etat[(a-1)%larg][(b-1)%haut] == 1:
        nb_voisins += 1
    if etat[a][(b-1)%haut] == 1:
        nb_voisins += 1
    if etat[(a+1)%larg][(b-1)%haut] == 1:
        nb_voisins += 1
    return nb_voisins

# Dessiner toutes les cellules
def dessiner():
    for y in range(haut):
        for x in range(larg):
            if etat[x][y]==mort:
                coul = "white"
            else:
                coul = "blue"
            canvas.itemconfig(cell[x][y], fill=coul)

# Arrêt de l'animation
def stop():
    global flag
    flag=0

# Démarrage de l'animation
def start():
    global flag
    if flag==0: 
        flag=1
    tableau()

# Animation pas à pas
def pasapas():
    global flag
    flag=2
    tableau()

# Lancement du programme
fenetre = Tk()
fenetre.title("Le jeu de la vie de Conway - Le canon")
canvas = Canvas(fenetre, width=cote*larg, height=cote*haut, highlightthickness=0)
canvas.pack()
bou1 = Button(fenetre,text='Quitter', width=8, command=fenetre.destroy)
bou1.pack(side=RIGHT)
bou2 = Button(fenetre, text='Démarrer', width=8, command=start)
bou2.pack(side=LEFT)
bou3 = Button(fenetre, text='Arrêter', width=8, command=stop)
bou3.pack(side=LEFT)
bou4 = Button(fenetre, text='Pas à pas', width=8, command=pasapas)
bou4.pack(side=LEFT)
init()
tableau()
fenetre.mainloop()
