You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
11 KiB
306 lines
11 KiB
from tkinter import *
|
|
from tkinter.filedialog import askopenfile
|
|
from copy import deepcopy
|
|
from time import sleep
|
|
from random import randint
|
|
f_cont=False
|
|
class Grille:
|
|
def __init__(self,unnb_ligne, unnb_col,unvivante,uniteration,unmorte,uncanva,unfenetre):
|
|
self.ligne=unnb_ligne
|
|
self.colonne=unnb_col
|
|
self.lst_grille=[]
|
|
self.grille=[]
|
|
self.taille_carre=0
|
|
self.lst_c=[]
|
|
self.vivante=unvivante
|
|
self.morte=unmorte
|
|
self.can=uncanva
|
|
self.fen=unfenetre
|
|
self.iteration=uniteration
|
|
|
|
def soupe_primordiale(self):
|
|
self.grille=[]
|
|
for ligne in range(0,self.ligne):
|
|
self.grille.append([])
|
|
for colonne in range(0,self.colonne):
|
|
self.grille[ligne].append(randint(0,1))
|
|
|
|
def creer_grille(self):
|
|
self.grille=[]
|
|
for ligne in range(0,self.ligne):
|
|
self.grille.append([])
|
|
for colonne in range(0,self.colonne):
|
|
self.grille[ligne].append(0)
|
|
|
|
|
|
def detruire_ancien_carre(self):
|
|
for detruire_l in range(0,len(self.lst_c)):
|
|
for detruire_col in range(0,len(self.lst_c[0])):
|
|
self.can.delete(self.lst_c[detruire_l][detruire_col])
|
|
|
|
def creer_carre(self,nb_ligne,nb_col):
|
|
self.detruire_ancien_carre()
|
|
self.iteration=0
|
|
self.vivante=0
|
|
self.morte=0
|
|
self.ligne=nb_ligne
|
|
self.colone=nb_col
|
|
###############création_lst_carré##########
|
|
self.lst_c=[]
|
|
for ligne in range(len(self.grille)):
|
|
self.lst_c.append([])
|
|
|
|
###############création_carré##########
|
|
carre_col,carre_ligne=new_width.get()//self.colonne,new_height.get()//self.ligne
|
|
if carre_col<carre_ligne:
|
|
self.taille_carre=carre_col
|
|
else:
|
|
self.taille_carre=carre_ligne
|
|
|
|
for ligne in range(len(self.grille)):
|
|
for colone in range(len(self.grille[0])):
|
|
if self.grille [ligne][colone] == 1:
|
|
new_c=self.can.create_rectangle( colone *self.taille_carre , ligne *self.taille_carre ,
|
|
colone*self.taille_carre+self.taille_carre , ligne*self.taille_carre +self.taille_carre ,
|
|
fill ="black")
|
|
self.lst_c[ligne].append(new_c)
|
|
self.vivante=self.vivante+1
|
|
else:
|
|
new_c=self.can.create_rectangle( colone *self.taille_carre , ligne *self.taille_carre ,
|
|
colone*self.taille_carre+self.taille_carre , ligne*self.taille_carre +self.taille_carre ,
|
|
fill ="white")
|
|
self.lst_c[ligne].append(new_c)
|
|
self.morte=self.morte+1
|
|
nb_morte_lab.set("Nombre de cellule morte:"+str(self.morte))
|
|
nb_vivante_lab.set("Nombre de cellule vivante:"+str(self.vivante))
|
|
nb_it_lab.set("Nombre d'itération:"+str(self.iteration))
|
|
self.fen.update()
|
|
|
|
def affiche_grille(self):
|
|
self.vivante=0
|
|
self.morte=0
|
|
for ligne in range (len(self.grille)):
|
|
for col in range (len(self.grille[0])):
|
|
if self.grille [ligne][col] == 1:
|
|
self.can.itemconfig(self.lst_c[ligne][col],fill ="black")
|
|
self.vivante=self.vivante+1
|
|
|
|
nb_vivante_lab.set("Nombre de cellule vivante:"+str(self.vivante))
|
|
self.fen.update()
|
|
else:
|
|
self.can.itemconfig(self.lst_c[ligne][col],fill ="white")
|
|
self.morte=self.morte+1
|
|
nb_morte_lab.set("Nombre de cellule morte:"+str(self.morte))
|
|
self.fen.update()
|
|
|
|
def gen_suiv(self):
|
|
copy_grille=deepcopy(self.grille)
|
|
self.lst_grille.append(copy_grille)
|
|
|
|
vie=0
|
|
for ligne in range (0,len(self.grille)):
|
|
for col in range (0,len(self.grille[0])):
|
|
for l_contour in range(-1,2):
|
|
for col_contour in range(-1,2):
|
|
if l_contour==0 and col_contour==0:
|
|
pass
|
|
elif copy_grille[(ligne+l_contour)%len(self.grille)][(col+col_contour)%len(self.grille[0])]==1:
|
|
vie=vie+1
|
|
|
|
if copy_grille[ligne][col]==1 and (vie<2 or vie>3):
|
|
self.grille[ligne][col]=0
|
|
self.can.itemconfig(self.lst_c[ligne][col],fill ="white")
|
|
self.vivante=self.vivante-1
|
|
self.morte=self.morte+1
|
|
nb_morte_lab.set("Nombre de cellule morte:"+str(self.morte))
|
|
nb_vivante_lab.set("Nombre de cellule vivante:"+str(self.vivante))
|
|
self.fen.update()
|
|
|
|
elif copy_grille[ligne][col]==0 and vie==3:
|
|
self.grille[ligne][col]=1
|
|
self.can.itemconfig(self.lst_c[ligne][col],fill ="black")
|
|
self.vivante=self.vivante+1
|
|
self.morte=self.morte-1
|
|
nb_morte_lab.set("Nombre de cellule morte:"+str(self.morte))
|
|
nb_vivante_lab.set("Nombre de cellule vivante:"+str(self.vivante))
|
|
self.fen.update()
|
|
vie=0
|
|
|
|
self.iteration=self.iteration+1
|
|
nb_it_lab.set("Nombre d'itération:"+str(self.iteration))
|
|
|
|
|
|
def gen_prev(self):
|
|
self.grille=deepcopy(self.lst_grille[len(self.lst_grille)-1])
|
|
self.lst_grille.pop(len(self.lst_grille)-1)
|
|
self.iteration=self.iteration-1
|
|
nb_it_lab.set("Nombre d'itération:"+str(self.iteration))
|
|
self.affiche_grille ()
|
|
|
|
|
|
########Fonction interface utilisateur###########
|
|
def bouton_grille():
|
|
grille.detruire_ancien_carre()
|
|
grille.ligne=nb_ligne_choisi.get()
|
|
grille.colonne=nb_colonne_choisi.get()
|
|
grille.creer_grille()
|
|
grille.creer_carre(nb_ligne_choisi.get(),nb_colonne_choisi.get())
|
|
|
|
def change(event):
|
|
num_colone=event.x//grille.taille_carre
|
|
num_ligne=event.y//grille.taille_carre
|
|
if 0<event.x<new_width.get() and 0<event.y<new_height.get():
|
|
if grille.grille[num_ligne][num_colone]==0:
|
|
grille.grille[num_ligne][num_colone]=1
|
|
zone.itemconfig(grille.lst_c[num_ligne][num_colone],fill ="black")
|
|
grille.vivante=grille.vivante+1
|
|
grille.morte=grille.morte-1
|
|
nb_morte_lab.set("Nombre de cellule morte:"+str(grille.morte))
|
|
nb_vivante_lab.set("Nombre de cellule vivante:"+str(grille.vivante))
|
|
fenetre.update()
|
|
|
|
elif grille.grille[num_ligne][num_colone]==1:
|
|
grille.grille[num_ligne][num_colone]=0
|
|
grille.vivante=grille.vivante-1
|
|
grille.morte=grille.morte+1
|
|
zone.itemconfig(grille.lst_c[num_ligne][num_colone],fill ="white")
|
|
|
|
fenetre.update()
|
|
def taille_can():
|
|
zone.config(height=new_height.get(),width=new_width.get())
|
|
|
|
def bouton_soupe():
|
|
grille.detruire_ancien_carre()
|
|
grille.ligne=nb_ligne_choisi.get()
|
|
grille.colonne=nb_colonne_choisi.get()
|
|
grille.soupe_primordiale()
|
|
grille.creer_carre(nb_ligne_choisi.get(),nb_colonne_choisi.get())
|
|
|
|
######Fonction de génération##########
|
|
def gen_suiv():
|
|
grille.gen_suiv()
|
|
|
|
def gen_prev():
|
|
grille.gen_prev()
|
|
|
|
|
|
def gen_cont():
|
|
global f_cont
|
|
f_cont=True
|
|
while f_cont==True:
|
|
grille.gen_suiv()
|
|
sleep(float(vitesse.get()))
|
|
if f_cont==False:
|
|
break
|
|
def stop():
|
|
global f_cont
|
|
f_cont=False
|
|
#########Fonction système sauvegarde########
|
|
def save():
|
|
state=open("grille_jeu.txt","w")
|
|
for ligne in range (0,len(grille.grille)):
|
|
if ligne!=0 or ligne==len(grille.grille)-1:
|
|
state.write(",")
|
|
for col in range (0,len(grille.grille[0])):
|
|
if col== len(grille.grille[0])-1:
|
|
state.write(str(grille.grille[ligne][col]))
|
|
else:
|
|
state.write(str(grille.grille[ligne][col])+" ")
|
|
def load():
|
|
new_state=askopenfile(mode="r",initialdir = "/",title = "Choisir un fichier",filetypes = [("Text files","*.txt*")])
|
|
|
|
new_state=new_state.readline()
|
|
new_state=new_state.split(",")
|
|
for chiffre_l in range (0,len(new_state)):
|
|
new_state[chiffre_l]=new_state[chiffre_l].split(" ")
|
|
for int_l in range(0,len(new_state)):
|
|
for int_col in range(0,len(new_state[0])):
|
|
new_state[int_l][int_col]=int(new_state[int_l][int_col])
|
|
grille.grille=new_state
|
|
|
|
grille.ligne=len(grille.grille)
|
|
|
|
grille.colonne=len(grille.grille[0])
|
|
|
|
grille.creer_carre(len(grille.grille),len(grille.grille[0]))
|
|
|
|
##########Programme principale##############
|
|
fenetre = Tk()
|
|
fenetre.title("Jeu Amoa")
|
|
zone = Canvas(fenetre , height =0 , width =0 , bg="#ffffff")
|
|
zone.grid(row=1,column=1,rowspan=1,columnspan=9)
|
|
|
|
##################Grille/Canvas####################
|
|
nb_ligne_choisi=IntVar()
|
|
lab_ligne=Label(text="Nombre de ligne choisi")
|
|
lab_ligne.grid(row=2,column=1)
|
|
choix_l=Entry(textvariable=nb_ligne_choisi,bd=5)
|
|
choix_l.grid(row=3,column=1)
|
|
|
|
nb_colonne_choisi=IntVar()
|
|
lab_col=Label(text="Nombre de colone choisi")
|
|
lab_col.grid(row=2,column=3)
|
|
choix_col=Entry(textvariable=nb_colonne_choisi,bd=5)
|
|
choix_col.grid(row=3,column=3)
|
|
|
|
bout_grille=Button(text="Créer la grille",command= bouton_grille)
|
|
bout_grille.grid(row=3,column=2)
|
|
bout_soupe=Button(text="Créer une soupe primordiale",command= bouton_soupe)
|
|
bout_soupe.grid(row=2,column=2)
|
|
|
|
new_height=IntVar()
|
|
lab_haut=Label(text="Hauteur choisi")
|
|
lab_haut.grid(row=4,column=1)
|
|
choix_haut=Entry(textvariable=new_height,bd=5)
|
|
choix_haut.grid(row=5,column=1)
|
|
|
|
new_width=IntVar()
|
|
lab_long=Label(text="Longueur choisi")
|
|
lab_long.grid(row=4,column=3)
|
|
choix_long=Entry(textvariable=new_width,bd=5)
|
|
choix_long.grid(row=5,column=3)
|
|
|
|
bout_can=Button(text="Créer le canvas",command= taille_can)
|
|
bout_can.grid(row=5,column=2)
|
|
|
|
################Génération##################
|
|
suivant=Button(text="Prochaine génération",command= gen_suiv)
|
|
suivant.grid(row=2,column=4)
|
|
|
|
precedent=Button(text="génération précédente",command= gen_prev)
|
|
precedent.grid(row=3,column=4)
|
|
|
|
gen_continue=Button(text="Génération en continue",command= gen_cont)
|
|
gen_continue.grid(row=2,column=5)
|
|
|
|
stop=Button(text="Stop",command=stop)
|
|
stop.grid(row=3,column=5)
|
|
|
|
vitesse=StringVar()
|
|
lab_vit=Label(text="Vitesse entre les génération (en s)")
|
|
lab_vit.grid(row=2,column=7)
|
|
choix_vit=Entry(textvariable=vitesse,bd=5)
|
|
choix_vit.grid(row=3,column=7)
|
|
|
|
nb_vivante_lab=StringVar()
|
|
nb_vivante_lab.set("Nombre de cellule vivante:")
|
|
lab_cellule_vie=Label(textvariable=nb_vivante_lab).grid(row=2,column=8)
|
|
|
|
nb_morte_lab=StringVar()
|
|
nb_morte_lab.set("Nombre de cellule morte:")
|
|
lab_cellule_morte=Label(textvariable=nb_morte_lab).grid(row=3,column=8)
|
|
|
|
nb_it_lab=StringVar()
|
|
nb_it_lab.set("Nombre d'itération:0")
|
|
lab_iteration=Label(textvariable=nb_it_lab).grid(row=2,column=9)
|
|
################Système sauvegarde##########
|
|
save=Button(text="Sauvegarder",command=save)
|
|
save.grid(row=2,column=6)
|
|
load=Button(text="Charger",command=load)
|
|
load.grid(row=3,column=6)
|
|
zone.bind_all('<Button-3>', change)
|
|
|
|
grille=Grille(0,0,
|
|
0,0,0,
|
|
zone,fenetre)
|
|
fenetre.mainloop()
|