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.

El Juego de la Vida en Python

In [2]:
import matplotlib.image as image
import numpy as np

def juegoDeLaVida():
    print('Hi')
juegoDeLaVida()
Hi

El juego de la vida fue diseñado por el matemático John Horton Conway en 1970.

A lo largo de las publicaciones ire desarrollando el juego de la vida, ya que me parece un ejercio muy bueno para poder aplicar muchas técnicas de programación, también tengo en mente poder generar algunos patrones que luego los generaremos o exportaremos en un gif(usando PIL o usando matplotlib, eso lo veré en su momento).

Espero que les gusten estas series de entradas que ire posteando.

Dibujar Cuadrados en un Gif con Python

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

color = [0,0,0]
filas, columnas = 200, 200

n = 8
nI = filas/n
nJ = columnas/n

img = np.zeros((filas, columnas, 3))

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)

imagenes = []

for i in range(4):
    if i%2 == 1:
        tColor = [0,0,0]
    else:
        tColor = [1,1,1]
    pintar(img,(i+1)*nI,(n-1-i)*nI,(i+1)*nI,(n-1-i)*nI,tColor)
    imagenes.append(Image.fromarray(np.uint8(img*255)))

im = Image.fromarray(np.uint8(img*255))
imagenes[0].save('gif.gif',
               save_all=True,
               append_images=imagenes[1:],
               optimize=False,
               duration=500,
               loop=0)
im
Out[16]: