#!/usr/bin/env python # coding: utf-8 # # ipycanvas: John Conway's Game Of Life # Some of the following code is adapted from # https://jakevdp.github.io/blog/2013/08/07/conways-game-of-life/ # In[ ]: get_ipython().run_line_magic('pip', 'install -q ipycanvas') # In[ ]: import asyncio import numpy as np from ipycanvas import RoughCanvas, hold_canvas # In[ ]: def life_step(x): """Game of life step""" nbrs_count = sum( np.roll(np.roll(x, i, 0), j, 1) for i in (-1, 0, 1) for j in (-1, 0, 1) if (i != 0 or j != 0) ) return (nbrs_count == 3) | (x & (nbrs_count == 2)) # In[ ]: def draw(x, canvas, color="black"): with hold_canvas(canvas): canvas.clear() canvas.fill_style = "#FFF0C9" canvas.stroke_style = "white" canvas.fill_rect(0, 0, canvas.width, canvas.height) canvas.fill_style = color canvas.stroke_style = color living_cells = np.where(x) rects_x = living_cells[0] * n_pixels rects_y = living_cells[1] * n_pixels canvas.fill_rects(rects_x, rects_y, n_pixels) canvas.stroke_rects(rects_x, rects_y, n_pixels) # In[ ]: # fmt: off glider_gun =\ [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] # fmt: on x = np.zeros((50, 70), dtype=bool) x[1:10, 1:37] = glider_gun # In[ ]: n_pixels = 15 canvas = RoughCanvas(width=x.shape[0] * n_pixels, height=x.shape[1] * n_pixels) canvas.fill_style = "#FFF0C9" canvas.stroke_style = "white" canvas.fill_rect(0, 0, canvas.width, canvas.height) canvas # In[ ]: draw(x, canvas, "#5770B3") # In[ ]: for _ in range(1_000): x = life_step(x) draw(x, canvas, "#5770B3") await asyncio.sleep(0.1) # In[ ]: