A simple Python matplotlib implementation of Conway’s Game of Life
I was recently reading about Conway’s Game of Life – a cellular automaton discovered by British mathematician John Conway in 1970. Using 4 simple rules, his system creates complex patterns as it evolves over time. You can read more about this here.
I took a crack at implementing this in Python, using matplotlib to plot the system as it evolves. Note that there are much better optimized ways of doing this, and a lot of mind-bogglng research has been done in this area. But still, I found it fun to implement this, and it’s fascinating to stare at the screen as patterns like gliders and blinkers evolve and disappear.
Here is the Python code:
################################################################################ # conway.py # # Author: electronut.in # # Description: # # A simple Python/matplotlib implementation of Conway's Game of Life. ################################################################################ import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation N = 100 ON = 255 OFF = 0 vals = [ON, OFF] # populate grid with random on/off - more off than on grid = np.random.choice(vals, N*N, p=[0.2, 0.8]).reshape(N, N) def update(data): global grid # copy grid since we require 8 neighbors for calculation # and we go line by line newGrid = grid.copy() for i in range(N): for j in range(N): # compute 8-neghbor sum # using toroidal boundary conditions - x and y wrap around # so that the simulaton takes place on a toroidal surface. total = (grid[i, (j-1)%N] + grid[i, (j+1)%N] + grid[(i-1)%N, j] + grid[(i+1)%N, j] + grid[(i-1)%N, (j-1)%N] + grid[(i-1)%N, (j+1)%N] + grid[(i+1)%N, (j-1)%N] + grid[(i+1)%N, (j+1)%N])/255 # apply Conway's rules if grid[i, j] == ON: if (total < 2) or (total > 3): newGrid[i, j] = OFF else: if total == 3: newGrid[i, j] = ON # update data mat.set_data(newGrid) grid = newGrid return [mat] # set up animation fig, ax = plt.subplots() mat = ax.matshow(grid) ani = animation.FuncAnimation(fig, update, interval=50, save_count=50) plt.show()