Last active
November 23, 2018 12:15
-
-
Save dsalaj/e59b20cfca0b81fee5ab625937273759 to your computer and use it in GitHub Desktop.
Answer to a question on stackoverflow
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
#!/usr/bin/python | |
# Answer to this: | |
# https://stackoverflow.com/questions/53442614/conways-game-of-life-in-python-3-with-matplotlib-problem-with-displaying-a-fo#53442614 | |
# call with: python3 cgl.py 10 500 1 1 | |
import os | |
import argparse | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from matplotlib import animation | |
ON = 255 | |
OFF = 0 | |
def update(frameNum, img, grid, gridsize): | |
"""Updates the grid every time it is refreshed""" | |
newgrid = grid.copy() | |
for i in range(gridsize): | |
for j in range(gridsize): | |
# this formula considers the edge/boundary conditions that appear | |
# every cell has to have 8 neighbouring cells | |
# to implement this in a grid of size n we simply fold the 4 edges to each parallel edge | |
# we'll end up with a cylinder first, then with a geometric shape called torus (google it.) | |
total = int((grid[i, (j - 1) % gridsize] + grid[i, (j + 1) % gridsize] + | |
grid[(i - 1) % gridsize, j] + grid[(i + 1) % gridsize, j] + | |
grid[(i - 1) % gridsize, (j - 1) % gridsize] + | |
grid[(i - 1) % gridsize, (j + 1) % gridsize] + | |
grid[(i + 1) % gridsize, (j - 1) % gridsize] + grid[ | |
(i + 1) % gridsize, (j + 1) % gridsize]) / 255) | |
# apply conway's basic rules of the game of life for each cell | |
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 | |
grid[:] = newgrid[:] | |
img.set_data(newgrid) | |
return img, | |
def add_glider(i, j, grid): | |
"""adds a glider with top-left cell at (i, j)""" | |
glider = np.array([[0, 0, 255], | |
[255, 0, 255], | |
[0, 255, 255]]) | |
grid[i:i+3, j:j+3] = glider | |
def main(): | |
parser = argparse.ArgumentParser(description="Conway's game of life in Python 3") | |
parser.add_argument('gridsize', type=int, help='Dimension of grid.') | |
parser.add_argument('interval', type=int, help='Interval.') | |
parser.add_argument('formationflag', type=bool, help='Predefined formation.') | |
parser.add_argument('frame', type=int, help='How many frames to animate.') | |
# get arguments from input function | |
arguments = parser.parse_args() | |
# set the arguments | |
frame = int(arguments.frame) | |
gridsize = int(arguments.gridsize) | |
interval = int(arguments.interval) | |
formation = arguments.formationflag | |
# if you want to start with a formation: | |
if formation: | |
grid = np.zeros(gridsize*gridsize).reshape(gridsize, gridsize) | |
add_glider(1, 1, grid) | |
# else display a randopm grid | |
else: | |
grid = randomgrid(gridsize) | |
fig, ax = plt.subplots() | |
# colormap: black -> alive, white -> dead | |
img = ax.imshow(grid, cmap='binary', interpolation='nearest') | |
# # this will be used to save the animation in a later version | |
ani = animation.FuncAnimation(fig, update, fargs=(img, grid, gridsize,), | |
frames=frame, | |
interval=interval, | |
save_count=50) | |
# remove x and y - axis labels, numbers and ticks | |
ax.axes.xaxis.set_ticklabels([]) | |
ax.axes.yaxis.set_ticklabels([]) | |
plt.xticks([]) | |
plt.yticks([]) | |
# plot the animated output | |
plt.show() | |
if __name__ == '__main__': | |
main() | |
print("DONE") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment