You are on page 1of 5

#!

/usr/bin/python3
#automata unidimensional
from tkinter import *

from random import randint

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

def pinta():
warning9.delete('1.0', '4.0')
while True:
try:
periodos = int(e000[0].get()) #num pasos
columnas = int(e000[1].get()) #tamanio tablero
aleatorio = int(e000[2].get())
casosinic = int(e000[3].get(),3)#en base3
lista0 = e000[3].get()
regla = int(e000[4].get(),3) #b3
regla0 = e000[4].get()
if len(regla0) != 7:
warning9.insert('1.0', 'error num cifras regla')
return

break

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

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


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

otrav11=Toplevel(root)
otrav11.attributes('-zoomed', True)
tablero=Matriz(columnas)
nuevo=Matriz(columnas)
if aleatorio == 1: #aleatoriamente activa celdas iniciales
for i in range(columnas):
ne = randint(0,2)
tablero[i] = ne

else: #activar celdas elegidasiniciales

list1 = list(lista0)
list2 = list(map(int,list1))#matriz con ceros unos y doses
zi = 0 #eliminar los primeros ceros
while zi < len(list2):
if list2[zi] == 0:
del list2[zi]
else:
break
n1 = (len(list2))//2 #centrar casos iniciales en tablero
n2 = columnas//2
n3 = n2-n1
list3 = [0]*n3 + list2
for y in range(len(list3)):
tablero[y] = list3[y]
regla1 = list(regla0)
Rules = list(map(int,regla1))

xscrollbar=Scrollbar(otrav11,orient=HORIZONTAL)
xscrollbar.pack(side=BOTTOM, fill=X)
yscrollbar=Scrollbar(otrav11, orient=VERTICAL)
yscrollbar.pack(side=RIGHT, fill=Y)
canvas =Canvas(otrav11, width=1100, height=600, cursor="cross",bg="white",
scrollregion=(0, 0, 2000, 2000),
xscrollcommand=xscrollbar.set,yscrollcommand=yscrollbar.set)
canvas.pack(side="top", fill="both", expand=1)
xscrollbar.config(command=canvas.xview)
yscrollbar.config(command=canvas.yview)

wolfram = [6,5,4,3,2,1,0] #posibilidades de suma de celdas [sumar 6,5,4,...0]

for y0 in range(periodos): # pintar


for x0 in range(1,columnas-1):
suma = tablero[x0-1]+tablero[x0]+tablero[x0+1]#triplete alred de x0
for i in range(7):
if wolfram[i] == suma: # lo comparo con wolfram
#print(i,"i")
a = i
nuevo[x0] = Rules[a]
break
if tablero[x0] == 1:
canvas.create_rectangle(2*x0,2*y0,2*(x0+1),2*(y0+1),fill="yellow")
if tablero[x0] == 2:
canvas.create_rectangle(2*x0,2*y0,2*(x0+1),2*(y0+1),fill="red")
tablero = nuevo[:]
canvas.update()
def base3(n):
e = n//3
q = n%3
if n == 0:
return '0'
elif e == 0:
return str(q)
else:
return base3(e) + str(q)
def conv():
warning9.delete('1.0', '4.0')
while True:
try:
numero = int(e000[5].get())
if numero > 2187:
warning9.insert('1.0', 'error:numero > 255')
return
break

except ValueError:
warning9.insert('1.0', 'error:dato conversor')
return
e000[6].delete(0, END)
numero = int(e000[5].get())
e000[6].insert(0,base3(numero))

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()
root.geometry("1100x300+300+75")
root.attributes('-zoomed', True)
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="convert.bin",command=conv,activebackground="#F50743",bg="#
38EB5C",relief="raised", borderwidth=2,font = "Helvetica 12 bold italic")
boton4.grid(row=30,column=1)
global a
global e000
e000 = Matriz(7) # matriz de elecciones
for i in range(len(e000)-1):
e000[i]=Entry(root)
e000[i].grid(row=20+2*i,column=0)
e000[6]=Entry(root)
e000[6].grid(row=30,column=2)
e000[0].insert(0,"1000")
e000[1].insert(0,"900")
e000[2].insert(0,"0")
e000[3].insert(0,"1")
e000[4].insert(0,"1001210")
e000[5].insert(0,"128")
e000[6].insert(0,"0")

global letreros
letreros = Matriz(6)
letreros[0]=Label(root,text="num pasos")
letreros[1]=Label(root,text="num celdas")
letreros[2]=Label(root,text="aleatorio?")
letreros[3]=Label(root,text="conf inicial")
letreros[4]=Label(root,text="reglas.wolfram")
letreros[5]=Label(root,text="conversor a binario")
for i in range(len(letreros)-1):
letreros[i].grid(row=20+2*i,column=1)
letreros[5].grid(row=30,column=4)
global warning9
warning9=Text(root,bg="white",fg="red",font = "Helvetica 14 bold
italic",height=3,width=10)
warning9.grid(row=40,column=0)

root.title()
root.mainloop()

You might also like