# version 0.3 from Tkinter import * class Life: def __init__(self,nx,ny): self.m = [0]*((nx+2)*(ny+2)) self.mm = self.m[:] self.nx = nx self.ny = ny self.rowlen = nx+2 self.rule0 = [0,0,0,1,0,0,0,0,0] self.rule1 = [0,0,1,1,0,0,0,0,0] self.root = Tk() self.root.title("Life") self.CELLSIZE = 17 self.BLOCKSIZE = 18 self.cv = Canvas(self.root,width=self.BLOCKSIZE*self.nx+9, height=self.BLOCKSIZE*self.ny+9, background="#009000") self.cv.pack() button = Button(self.root,text="next",command=self.makestep) button.pack(side=BOTTOM) self.cells = [0]*((self.nx+2)*(self.ny+2)) for y in range(1,self.ny+1): self.cv.update() for x in range(1,self.nx+1): self.cells[y*self.rowlen+x] = self.cv.create_rectangle( (x-1)*self.BLOCKSIZE+6, (y-1)*self.BLOCKSIZE+6, (x-1)*self.BLOCKSIZE+6+self.CELLSIZE+1, (y-1)*self.BLOCKSIZE+6+self.CELLSIZE+1, fill = "#ffffff",outline="#009000") self.cv.update() self.cv.bind("<1>",self.cellclick) self.cv.focus_set() self.cv.bind("s",self.m_save) self.cv.bind("l",self.m_load) ## make 1 step def makestep(self): self.evolve() ## self.draw() ## flip cell on mouse click def cellclick(self,event): x = 1+(event.x-6)/self.BLOCKSIZE y = 1+(event.y-6)/self.BLOCKSIZE if (x<1 or y<1 or x>self.nx or y>self.ny): self.clearall() self.cv.update() else: self.flipcell(x,y) self.cv.update() ## save/load world to RAM def m_save(self,ev): self.m1 = self.m[:] def m_load(self,ev): self.m = self.m1[:] self.draw() ## Feld anzeigen def show(self): for y in range(1,self.ny+1): yy = self.rowlen*y s = "" for x in range(1,self.nx+1): ## s += "%-5d"%(self.m[yy+x]) ## s += str(self.m[yy+x]) if self.m[yy+x]==1: s += "O" else: s += "." print s def draw(self): for y in range(1,self.ny+1): for x in range(1,self.nx+1): if self.m[y*self.rowlen+x]==1: self.setcell(x,y) else: self.clearcell(x,y) def setcell(self,x,y): self.m[y*self.rowlen+x] = 1 self.cv.itemconfigure(self.cells[y*self.rowlen+x],fill="#000000") # self.cv.update() def clearcell(self,x,y): self.m[y*self.rowlen+x] = 0 self.cv.itemconfigure(self.cells[y*self.rowlen+x],fill="#ffffff") # self.cv.update() def flipcell(self,x,y): if self.m[y*self.rowlen+x] == 1: self.clearcell(x,y) else: self.setcell(x,y) def clearall(self): for y in range(1,self.ny+1): yy = y*self.rowlen for x in range(1,self.nx+1): if self.m[yy+x]!=0: self.clearcell(x,y) self.cv.update() def evolve(self): def i(x,y): return y*self.rowlen+x for y in range(1,self.ny+1): self.m[i(self.nx+1,y)]=self.m[i(1,y)] self.m[i(0,y)]=self.m[i(self.nx,y)] for x in range(1,self.nx+1): self.m[i(x,self.ny+1)]=self.m[i(x,1)] self.m[i(x,0)]=self.m[i(x,self.ny)] self.m[i(0,0)] = self.m[i(self.nx,self.ny)] self.m[i(0,self.ny+1)] = self.m[i(self.nx,1)] self.m[i(self.nx+1,0)] = self.m[i(1,self.ny)] self.m[i(self.nx+1,self.ny+1)] = self.m[i(1,1)] for y in range(1,self.ny+1): yy = y*self.rowlen for x in range(1,self.nx+1): pos = yy+x sum = self.m[pos-self.rowlen-1] \ + self.m[pos-self.rowlen ] \ + self.m[pos-self.rowlen+1] \ + self.m[pos-1] \ + self.m[pos+1] \ + self.m[pos+self.rowlen-1] \ + self.m[pos+self.rowlen ] \ + self.m[pos+self.rowlen+1] if self.m[yy+x]==0: self.mm[yy+x]= self.rule0[sum] else: self.mm[yy+x]= self.rule1[sum] ## draw changed cells for y in range(1,self.ny+1): yy = y*self.rowlen for x in range(1,self.nx+1): z = self.mm[yy+x] if z != self.m[yy+x]: if z==1: self.setcell(x,y) else: self.clearcell(x,y) ## update field self.m = self.mm[:] def glider(self): yy = (self.ny+2)/2 xx = (self.nx+2)/2 self.setcell(xx-1,yy) self.setcell(xx,yy) self.setcell(xx+1,yy) self.setcell(xx+1,yy-1) self.setcell(xx,yy-2) def mainloop(self): self.root.mainloop() def t(): m = Life(25,25) m.glider() m.mainloop() t()