Dec-09-2016, 04:05 PM
Hi Mekire,
Im not sure I get the idea about “single responsibility principle” ..
I have to admit that I have problems understanding programming Python Classes / modules.
This program I wrote linearly with one line at a time, while thinking what next ;)
My first challenge thus will be rewriting “no code in my global namespace other than constants.”
(give me some time/hints!).
The challenge with the mouse is much easier I think (looked at other examples with tkinter+mouse).
p.s. I did get the small bug out (random generated squares would be on top of own creation and therefore hold two squares while you could see only one).
The correct program below (lines 43, 45).. with thousand apologies for lack of logic functions.
( its my first program since the ZX81 ;o )
Im not sure I get the idea about “single responsibility principle” ..
I have to admit that I have problems understanding programming Python Classes / modules.
This program I wrote linearly with one line at a time, while thinking what next ;)
My first challenge thus will be rewriting “no code in my global namespace other than constants.”
(give me some time/hints!).
The challenge with the mouse is much easier I think (looked at other examples with tkinter+mouse).
p.s. I did get the small bug out (random generated squares would be on top of own creation and therefore hold two squares while you could see only one).
The correct program below (lines 43, 45).. with thousand apologies for lack of logic functions.
( its my first program since the ZX81 ;o )
import time ; import random from tkinter import * window = Tk() window.title("Conway's Game of Life") canvas = Canvas(window, width=1200, height=900,bd=0, highlightthickness=0);canvas.pack() text_ = Text(window, height=3, width=30); text_.pack() text_.insert(END, "To MOVE use arrow keys. Press x to seed. r for random seeds. f to finish") ##################### VARIABLES ############################ keypressed = ""; SQident = 1; doublelist=[] Neigh=([-50,-50,-50,-50],[0,-50,0,-50],[+50,-50,+50,-50],[-50,0,-50,0],[+50,0,+50,0],[-50,+50,-50,+50],[0,+50,0,+50],[+50,+50,+50,+50]) moves={"Up":(0, -50),"Down":(0,50), "Left":(-50,0), "Right":(50,0)} sq = canvas.create_rectangle(50, 50, 100, 100, fill="grey") ##################### create field ########################## def movesquare(event): # detect movement keys x,y=moves[event.keysym] canvas.move(SQident,x,y) def otherkey(event): #detect other keys pressed global SQident; global keypressed keypressed = event.keysym if keypressed == "x": # make new square if (canvas.coords(SQident)) not in doublelist: # prevent creating twice sq=canvas.create_rectangle((canvas.coords(SQident)), fill="grey") #new square created doublelist.append([canvas.coords(SQident)]) SQident +=1 #new square identifier bindings = {"<KeyPress-Up>" : movesquare, "<KeyPress-Down>": movesquare, "<KeyPress-Left>": movesquare, "<KeyPress-Right>": movesquare, "x": otherkey, "f": otherkey, "r": otherkey} for binding in bindings: canvas.bind_all(binding, bindings[binding]) while 1: window.update();window.update_idletasks() if keypressed == "f": #finshed canvas.delete(SQident) break if keypressed == "r": #add random canvas.delete(SQident) for y in range(10): x1=(random.randint(0,13)+random.randint(0,13))*50 # between 0 and 24 * 50 = 0 - 1200 is width y1=(random.randint(0,9)+random.randint(0,9))*50 # between 0 and 18 * 50 = 0 - 900 is height x2=x1+50; y2=y1+50 if ([x1,y1,x2,y2]) not in doublelist: # DEBUGGED sq = canvas.create_rectangle(x1, y1, x2, y2, fill="grey") doublelist.append([x1,y1,x2,y2]) # DEBUGGED for x in range(0,3): ra=random.randint(0,7) x1ne=(Neigh[ra][0]);y1ne=(Neigh[ra][1]);x2ne=(Neigh[ra][2]);y2ne=(Neigh[ra][3]) if ([x1+x1ne,y1+y1ne,x2+x2ne,y2+y2ne]) not in doublelist: sq = canvas.create_rectangle((x1+x1ne,y1+y1ne,x2+x2ne,y2+y2ne), fill="pink") doublelist.append([x1+x1ne,y1+y1ne,x2+x2ne,y2+y2ne]) break ############################## start animation ############################# numberofgenerations=0; color=0 colsel=["Light Pink","Pale Violet Red","Deep Pink","Medium Violet Red","Orchid","Medium Orchid","Medium Purple","Dark Violet","Blue Violet","Purple"] while numberofgenerations < 1000: window.update();window.update_idletasks() livelist = canvas.find_all() #list of al objectIDs on canvas createlist=[];killlist=[] # createlist stores coordinates; killlist stores objectIDs. if color == 10: color = 1 for live in livelist: # look in livelist for object identifier at position x and retrieve its coordinates x1=(canvas.coords(live)[0]); y1=(canvas.coords(live)[1]); x2=(canvas.coords(live)[2]); y2=(canvas.coords(live)[3]) CN=(len(canvas.find_overlapping(x1,y1,x2,y2))-1) # count Neighbours CN if (CN < 2) or (CN > 3): #dead too few/many neighbours killlist.append (canvas.find_enclosed(x1-10,y1-10,x2+10,y2+10)) for Ne in Neigh: Coo=([x1+Ne[0],y1+Ne[1],x2+Ne[2],y2+Ne[3]]) # surrounding coordinates Overl=len(canvas.find_overlapping(x1+Ne[0],y1+Ne[1],x2+Ne[2],y2+Ne[3])) # Number of objects surrounding Encl=len(canvas.find_enclosed(x1+Ne[0]-10,y1+Ne[1]-10,x2+Ne[2]+10,y2+Ne[3]+10)) # enclosed coordinates:0 is empty; 1 is present if Encl == 0: # enclosed is 0 thus is field is empty. Possible new life if Overl == 3: # has 3 (overlapping) neighbours thus new life if Coo not in createlist: # prevent creating twice createlist.append (Coo) for create in createlist: #Start creating sq=canvas.create_rectangle(create, fill=(colsel[color])) for kill in killlist: #Start killling canvas.delete(kill) #Slow down: for TI in range(0,2): time.sleep(0.1) numberofgenerations +=1;color +=1 mainloop()