Aut 9

Vous aimerez peut-être aussi

Vous êtes sur la page 1sur 7

#!

/usr/bin/python3
#automata unidimensional
from tkinter import *
from random import randint
global move,stop
move = 1 #this a variable which can take a value 1 or 0
stop='Initial-Value' #This is a variable to control the for and while loops.
#Assignment of string as variable is optional. It could be
#integer as well

def switch(): #controls back and forth switching between Pause and Resume
global move
move = not move

def Matriz(m,n):
M = []
for i in range(m):
M.append([0]*n)
return M

def pinta():

warning9.delete('1.0', '4.0')
while True:
try:
periodos = int(confi[0][0].get()) #num pasos
fil = int(confi[0][1].get()) #tamanio tablero
col = int(confi[0][2].get())
geometria = int(confi[0][3].get())#geometria 5 cruz,6 aspa,9 todas las
vecinas
if geometria not in (5,6,9) :
warning9.insert('1.0', 'error geometria solo 5,6,9')
return
numcolores = int(confi[0][4].get())#colores
if numcolores < 2 or numcolores > 9:
warning9.insert('1.0', 'error:colores 2 a 9')
return

for i3 in range (3):#celdas iniciales


for j in range(3):
cas_in[i3][j]=int(e000[i3][j].get())
if cas_in[i3][j] > (numcolores-1) :
warning9.insert('1.0', 'cifra conf inicial incorrecta')
return

if geometria == 5 or geometria == 6 :
regla0 = confi[0][5].get()
cifras = numcolores*(4*(numcolores-1)+1)#opciones con col de 0 a n-
1
if len(regla0) != cifras:
warning9.insert('1.0',
'antepon/ceros/en/regla/hasta'+str(cifras)+'cifras')
return
if geometria == 9:
regla0 = confi[0][5].get()
cifras = numcolores*(8*(numcolores-1)+1)
if len(regla0) != cifras:
warning9.insert('1.0',
'antepon/ceros/en/regla/hasta'+str(cifras)+'cifras')
return
checkregla = int(confi[0][5].get())#comprob regla es num

list1 = list(regla0)#comprobar que son menores que colores


rule = list(map(int,list1))#matriz con ceros unos , doses,etc segun
num colores
for i in range(len(rule)):
if rule[i] > (numcolores-1):
warning9.insert('1.0', 'cifra en regla mayor
que'+str((numcolores-1)))
return
for i in range(9):
mcolor[0][i] = color[0][i].get()

break

except ValueError:#alternar colores aviso


colo = randint(0,9)
if colo == 0:
colora = "yellow"
if colo == 1:
colora = "red"
if colo == 2:
colora = "green"
if colo == 3:
colora = "blue"
if colo == 4:
colora = "cyan"
if colo == 5:
colora = "white"
if colo == 6:
colora = "HotPink1"
if colo == 7:
colora = "DarkOrange1"
if colo == 8:
colora = "chartreuse2"
if colo == 9:
colora = "aquamarine"

warning9.config( background=colora, foreground="black")


warning9.insert('1.0', 'error entrada dato')
return

otrav11=Toplevel(root)
tablero=Matriz(fil,col)
nuevo = Matriz(fil,col)

invrule=[]#invierte la matriz rule pa leer reglas


for i in range(len(rule)): #invertir
invrule.append(rule[(-1-i)])

length_0= root.winfo_screenheight()#dimensiones pantalla


width_0= root.winfo_screenwidth()
frame1=Frame(otrav11)
frame1.pack()
frame2=Frame(otrav11)
frame2.pack()

Pause_Button=Button(frame1,bg='green',command=switch,activebackground="#F50743",rel
ief="raised", borderwidth=4,font = "Helvetica 8 bold italic")
Pause_Button.pack(side=LEFT)
texto1=Entry(frame1)
texto1.insert(0," num_pasos>>>")
texto1.pack(side=LEFT)
texto=Entry(frame1)
texto.insert(0,"0")
texto.pack(side=LEFT)
xscrollbar=Scrollbar(frame2,orient=HORIZONTAL)
xscrollbar.pack(side=BOTTOM, fill=X)
yscrollbar=Scrollbar(frame2, orient=VERTICAL)
yscrollbar.pack(side=RIGHT, fill=Y)
canvas =Canvas(frame2, width=width_0, height=length_0,
cursor="cross",bg="white", scrollregion=(0, 0, 2000, 2000),
xscrollcommand=xscrollbar.set,yscrollcommand=yscrollbar.set)
canvas.pack()
xscrollbar.config(command=canvas.xview)
yscrollbar.config(command=canvas.yview)

n1 = fil//2 #centrar casos iniciales en tablero


n2 = col//2
for y in range(3):
for x in range(3):
tablero[n2+y][n1+x] = cas_in[y][x]
color_rectangle0=mcolor[0][cas_in[y][x]]

canvas.create_rectangle(4*(n1+x),4*(n2+y),4*(n1+x+1),4*(n2+y+1),fill=color_rectangl
e0,outline=color_rectangle0)

for i in range(fil):
nuevo[i]=tablero[i][:]

for pulsos in range(periodos):#calcular y pintar


texto.delete(0,END)
texto.insert(0,pulsos)
stop='continue_while_loop' #control pause
while pulsos<periodos and stop=='continue_while_loop':
stop='enter_for_loop_again'
Pause_Button.update()
if move==1:
Pause_Button["text"]='Pause'
for y0 in range(1,fil-1): # pintar
for x0 in range(1,col-1):

if geometria == 5:
opciones=5*(numcolores-1)
suma = tablero[y0-1][x0]+tablero[y0][x0-1] +tablero[y0]
[x0+1]+tablero[y0+1][x0]

if geometria == 6:
opciones=5*(numcolores-1)
suma = (tablero[(y0-1)%fil][(x0-1)%col]+tablero[(y0-
1)%fil][(x0+1)%col]
+tablero[y0%fil][x0%col]+tablero[(y0+1)%fil][(x0-
1)%col]+tablero[(y0+1)%fil][(x0+1)%col])
if geometria == 9:
opciones=9*(numcolores-1)
suma = 0
for yp in (-1,0,1):
for xp in (-1,0,1):
suma = suma+tablero[(y0+yp)%fil][(x0+xp)%col]
#calcular nuevo num de nuevo
posicion=tablero[y0][x0]+suma*(numcolores)
nuevo[y0][x0] = invrule[posicion]
#colorear segun tablero
if nuevo[y0][x0]!=tablero[y0][x0]:
color_rectangle=mcolor[0][nuevo[y0][x0]]

canvas.create_rectangle(4*x0,4*y0,4*(x0+1),4*(y0+1),fill=color_rectangle,outline=co
lor_rectangle)

for i in range(fil):
tablero[i] = nuevo[i][:]
canvas.update()

else:
stop='continue_while_loop'
Pause_Button["text"]='Resume'
def basek(n,k):

e = n//k
q = n%k
if n == 0:
return '0'
elif e == 0:
return str(q)
else:
return basek(e,k) + str(q)

def conv():
warning9.delete('1.0', '4.0')
while True:
try:
numero = int(confi[0][6].get())
base = int(confi[0][4].get())
break

except ValueError:
warning9.insert('1.0', 'error:color/conversor')
return
confi[0][7].delete(0, END)
confi[0][7].insert(0,basek(numero,base))

def ayud():
tra=Toplevel(root)
s = Scrollbar(tra)
T = Text(tra)
T.focus_set()
s.pack(side=RIGHT, fill=Y)
T.pack(side=LEFT, fill=Y)
s.config(command=T.yview)
T.config(yscrollcommand=s.set)
T.insert(END,"automata celular conway-wolfram unidimensional; cada linea(fila)
es un paso temporal."
+"\n"+"Por defecto vienen unas configuraciones, modificables al gusto: "
+"\n"+"puedes elegir (en la casilla num pasos) las iteraciones(cada
iteracion es una linea). "
+"\n"+"Puedes elegir numero de columnas(celulas por linea), del tablero
universo"
+"\n"+"En aleatorio seleccionando 1, toda la fila inicial se siembra
aleatoriamente de cel vivas. "
+"\n"+"Seleccionando 0 ,las celulas vivas iniciales las escribes tu,en
conf_inicial,"
+"\n"+"escribiendo unos y ceros, por ej si escribes 100101, la semilla
inicial"
+"\n"+"es una celda viva, 2 apagadas,otra viva,otra apagada y la de la
derecha viva"
+"\n"+"y todas las demas en la fila inicial (hasta num celdas que
seleccionaste), apagadas. "
+"\n"+"Despues vienen las reglas de nacimiento del sig ciclo en binario de
8 digitos, de acuerdo con la"
+"\n"+"nomenclatura de wolfram,por ej la regla 00000010 ,asigna
nacimiento(1), al triplete"
+"\n"+"001 (la celda del medio es cero,osea apagada,nace si la de su
izquierda esta apagada"
+"\n"+"osea cero y la de su dcha viva,osea 1).Los tripletes son (de izq a
dcha 111,110,101 "
+"\n"+"100,011,010,001 y 000) y representan el estado de una celula(viva
1,, o muerta 0) junto"
+"\n"+"con el de sus vecinas izq y dcha.Las reglas wolfram son los posibles
nuevos"
+"\n"+"nacimientos segun cada posible triplete.Por ej la regla 00001101
indica que en la siguiente"
+"\n"+"iteracion permaneceran vivas las celulas centrales de los tripletes
quinto,sexto y octavo( 011,010 y 000)"
+"\n"+"osea las zonas de universo cuya celula central este encendida y su
izq apagada y su dcha"
+"\n"+"encendida (caso 011),, etc..."
+"\n"+"el boton convert.bin es un conversor para convertir las reglas
wolfram (0 a 255) a binario"
+"\n"+"y poderla escribir en la casilla de las reglas.La ultima ventana es
un aviso de errores")
return

root=Tk()
length_root= root.winfo_screenheight()#dimensiones pantalla
width_root= root.winfo_screenwidth()
root.geometry("1100x600+30+75")
etiqueta=Label(root,text="asignar 0 a 101 por ej signif que la cel del
medio(muerta=0) en la sig iteracion sigue muerta mientras tenga a sus lados
vivas(1)")
etiqueta.grid(row=1,column=1,columnspan=5)

boton1=Button(root,text="pintar",command=pinta,activebackground="#F50743",bg="#38EB
5C",relief="raised", borderwidth=5,font = "Helvetica 14 bold italic")
boton1.grid(row=10,column=0)
boton3=Button(root,text="ayuda",command=ayud,activebackground="#F50743",bg="#38EB5C
",relief="raised", borderwidth=5,font = "Helvetica 14 bold italic")
boton3.grid(row=10,column=4)
boton4=Button(root,text="cambio_base",command=conv,activebackground="#F50743",bg="#
38EB5C",relief="raised", borderwidth=2,font = "Helvetica 12 bold italic")
boton4.grid(row=42,column=1)
global a
global color
color = Matriz(1,9)
for x in range(9):
color[0][x]=Entry(root)
for y in range(9):
color[0][y].grid(row=20+2*y,column=4)
global mcolor
mcolor = Matriz(1,9)
global tabcolor
tabcolor =
['white','black','yellow','red','green3','goldenrod','purple','blue2','brown1']
for x in range(9):
color[0][x].insert(0,tabcolor[x])
global cas_in
cas_in = Matriz(3,3)
global e000
e000 = Matriz(3,3) # matriz de elecciones
for y in range(3):
for x in range(3):
e000[y][x]=Entry(root)
e000[y][x].grid(row=20+2*y,column=x)
if x ==1 and y ==1:
e000[y][x].insert(0,"1")
else:
e000[y][x].insert(0,"0")
global confi
confi = Matriz(1,8) # matriz de elecciones
for y in range(8):
confi[0][y]=Entry(root)
for y in range(6):
confi[0][y].grid(row=30+2*y,column=0)
confi[0][0].insert(0,"300")#pasos
confi[0][1].insert(0,"400")#filas
confi[0][2].insert(0,"400")#columnas
confi[0][3].insert(0,"5")#geometria ,x, + ,aleat ,todos lasceldas vecinas que
afectan
confi[0][4].insert(0,"2")#colores, para base
confi[0][5].insert(0,"0111001100")#regla elegida

confi[0][6].grid(row=42,column=0)#entrada regla
confi[0][6].insert(0,"460")
confi[0][7].grid(row=42,column=2)#salida regla
confi[0][7].insert(0,"0111001100")

global letreros
letreros = Matriz(1,7)
letreros[0][0]=Label(root,text="----------------num pasos")
letreros[0][1]=Label(root,text="----------------num filas")
letreros[0][2]=Label(root,text="-------------num columnas")
letreros[0][3]=Label(root,text="----------------geometria")
letreros[0][4]=Label(root,text="--------------num_colores")
letreros[0][5]=Label(root,text="-----------reglas_wolfram")
letreros[0][6]=Label(root,text="----configuracion inicial")
for i in range(6):
letreros[0][i].grid(row=30+2*i,column=1)
#letreros[0][5].grid(row=44,column=2)

letreros[0][6].grid(row=22,column=3)
global warning9
global warning9
warning9=Text(root,bg="white",fg="red",font = "Helvetica 14 bold
italic",height=6,width=10)
warning9.grid(row=50,column=0)

root.title()
root.mainloop()

Vous aimerez peut-être aussi