from tkinter import * from tkinter.filedialog import askopenfile from copy import deepcopy from time import sleep 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 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.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=1246//self.colonne,795//self.ligne if carre_col0: lst_vivante_dans_ligne.append(ligne) lst_vivante_dans_colonne.append([]) for index, etat in enumerate(self.grille[ligne]): if etat==1: lst_vivante_dans_colonne[len(lst_vivante_dans_colonne)-1].append(index) vie=0 l_ac=0 for ligne in lst_vivante_dans_ligne: for col in range(0,len(lst_vivante_dans_colonne[l_ac])): for cel_l_autour in range(-1,2): for cel_col_autour in range(-1,2): 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+cel_l_autour+l_contour)%len(self.grille)][(lst_vivante_dans_colonne[l_ac][col]+cel_l_autour+cel_l_autour)%len(self.grille[0])]==1: print(copy_grille[(ligne+cel_l_autour+l_contour)],) vie=vie+1 if copy_grille[ligne+cel_l_autour][lst_vivante_dans_colonne[l_ac][col]+ cel_l_autour ]==1 and (vie==2 or vie==3): self.grille[ligne+cel_l_autour][lst_vivante_dans_colonne[l_ac][col]+ cel_l_autour ]=1 elif copy_grille[ligne+cel_l_autour][lst_vivante_dans_colonne[l_ac][col]+ cel_l_autour]==1 and (vie<2 or vie>3): self.grille[ligne+cel_l_autour][lst_vivante_dans_colonne[l_ac][col]+ cel_l_autour ]=0 elif copy_grille[ligne+cel_l_autour][lst_vivante_dans_colonne[l_ac][col]+ cel_l_autour]==0 and vie==3: self.grille[ligne+cel_l_autour][lst_vivante_dans_colonne[l_ac][col]+ cel_l_autour ]=1 vie=0 l_ac=l_ac+1 self.iteration=self.iteration+1 self.affiche_grille () 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 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): grille.change(event.x,event.y) ######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(0.1) 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 =795 , width =1246 , bg="#ffffff") zone.grid(row=1,column=1,rowspan=9,columnspan=9) ##################Grille#################### nb_ligne_choisi=IntVar() mess_ligne=Label(text="Nombre de ligne choisi") mess_ligne.grid(row=10,column=1) choix_l=Entry(textvariable=nb_ligne_choisi,bd=5) choix_l.grid(row=11,column=1) nb_colonne_choisi=IntVar() mess_col=Label(text="Nombre de colone choisi") mess_col.grid(row=10,column=3) choix_col=Entry(textvariable=nb_colonne_choisi,bd=5) choix_col.grid(row=11,column=3) bout_g=Button(text="Créer la grille",command= bouton_grille) bout_g.grid(row=11,column=2) ################Génération################## suivant=Button(text="Prochaine génération",command= gen_suiv) suivant.grid(row=10,column=4) precedent=Button(text="génération précédente",command= gen_prev) precedent.grid(row=11,column=4) gen_continue=Button(text="Génération en continue",command= gen_cont) gen_continue.grid(row=10,column=5) stop=Button(text="Stop",command=stop) stop.grid(row=11,column=5) nb_vivante_lab=StringVar() nb_vivante_lab.set("Nombre de cellule vivante:") lab_cellule_vie=Label(textvariable=nb_vivante_lab).grid(row=10,column=7) nb_morte_lab=StringVar() nb_morte_lab.set("Nombre de cellule morte:") lab_cellule_morte=Label(textvariable=nb_morte_lab).grid(row=11,column=7) lab_iteration=Label(text="Nombre d'itération:0").grid(row=10,column=8) ################Système sauvegarde########## save=Button(text="Sauvegarder",command=save) save.grid(row=10,column=6) load=Button(text="Charger",command=load) load.grid(row=11,column=6) zone.bind_all('', change) grille=Grille(0,0, 0,0,0, zone,fenetre) fenetre.mainloop()