Python Forum
conway's game of life
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
conway's game of life
#18
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 )


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()
Reply


Messages In This Thread
conway's game of life - by hanscvanleeuwen - Nov-25-2016, 07:51 PM
RE: conway's game of life - by Skaperen - Nov-26-2016, 08:25 AM
RE: conway's game of life - by hanscvanleeuwen - Nov-26-2016, 09:33 AM
RE: conway's game of life - by hanscvanleeuwen - Nov-26-2016, 12:24 PM
RE: conway's game of life - by Skaperen - Nov-27-2016, 01:45 AM
RE: conway's game of life - by Mekire - Nov-28-2016, 04:30 AM
RE: conway's game of life - by hanscvanleeuwen - Nov-28-2016, 07:55 AM
RE: conway's game of life - by heiner55 - Nov-29-2016, 02:41 PM
RE: conway's game of life - by hanscvanleeuwen - Nov-30-2016, 01:45 PM
RE: conway's game of life - by hanscvanleeuwen - Dec-07-2016, 02:02 PM
RE: conway's game of life - by Ofnuts - Dec-08-2016, 09:56 PM
RE: conway's game of life - by Mekire - Dec-09-2016, 03:35 AM
RE: conway's game of life - by hanscvanleeuwen - Dec-09-2016, 10:13 AM
RE: conway's game of life - by Mekire - Dec-09-2016, 11:03 AM
RE: conway's game of life - by hanscvanleeuwen - Dec-09-2016, 11:25 AM
RE: conway's game of life - by hanscvanleeuwen - Dec-09-2016, 01:51 PM
RE: conway's game of life - by Mekire - Dec-09-2016, 02:10 PM
RE: conway's game of life - by hanscvanleeuwen - Dec-09-2016, 04:05 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  While loop/half-life Miraclefruit 6 8,581 Mar-06-2017, 05:24 PM
Last Post: nilamo
  conway's game of life / Single Responsibility Principle hanscvanleeuwen 13 11,319 Dec-17-2016, 08:30 AM
Last Post: hanscvanleeuwen
  Game of life using IDLE Informatics109 4 5,183 Oct-29-2016, 01:39 PM
Last Post: ichabod801

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020