El juego de la vida - Ejemplo en python

In [1]:
import matplotlib.image as image
import numpy as np
from PIL import Image

import copy

def pintar(img,x0,x1,y0,y1,color):
    for x in range(int(x0),int(x1)):
        for y in range(int(y0),int(y1)):
            img[x][y] = np.array(color)

def getVecinos(jv,i,j):
    ans = 0
    if 0 <= i-1 and 0 <= j-1 and jv[i-1][j-1]:
        ans += 1
    if 0 <= i-1 and jv[i-1][j]:
        ans += 1
    if 0 <= i-1 and j+1 < jv.shape[1] and jv[i-1][j+1]:
        ans += 1
        
    if 0 <= j-1 and jv[i][j-1]:
        ans += 1
    if j+1 < jv.shape[1] and jv[i][j+1]:
        ans += 1
        
    if i+1 < jv.shape[0] and 0 <= j-1 and jv[i+1][j-1]:
        ans += 1
    if i+1 < jv.shape[0] and jv[i+1][j]:
        ans += 1
    if i+1 < jv.shape[0] and j+1 < jv.shape[1] and jv[i+1][j+1]:
        ans += 1
    
    return ans

def juegoDeLaVida(n,longitud,tiempo):
    img = np.ones((n*longitud,n*longitud,3))
    jv = np.zeros((n,n))
    imagenes = []
    imagenes.append(Image.fromarray(np.uint8(np.ones((n*longitud,n*longitud,3))*255)))
    np.random.seed(1234567)
    for i in range(n):
        for j in range(n):
            if np.random.randint(100) < 23:
                jv[i][j] = 1
    for _ in range(tiempo):
        jvt = copy.deepcopy(jv)
        for i in range(n):
            for j in range(n):
                color = [0,0,0]
                v = getVecinos(jvt,i,j)
                if jvt[i][j] == 0: #muerta
                    if v == 3:
                        jv[i][j] = 1
                else:
                    if v == 2 or v == 3:
                        jv[i][j] = 1
                    else:
                        jv[i][j] = 0
                if jv[i][j]:
                    color = [1,1,1]
                pintar(img,(i)*longitud,(i+1)*longitud,(j)*longitud,(j+1)*longitud,color)
        imagenes.append(Image.fromarray(np.uint8(img*255)))
    imagenes[0].save('gif.gif',
               save_all=True,
               append_images=imagenes[1:],
               optimize=False,
               duration=500,
               loop=0)
    return 1
juegoDeLaVida(12,10,10)
Out[1]:
1

Reglas del juego:

  • Una célula muerta con exactamente 3 células vecinas vivas "nace".
  • Una célula viva con 2 o 3 células vecinas vivas sigue viva, en otro caso muere.