Jogo da vida de Conways em Python

Este é meu primeiro post onde quero falar sobre o mais famoso autômato celular "Jogo da vida", e também escrevê-lo em Python usando gráficos Pygame.





O jogo da vida de Conways (em russo, 'Jogo da vida') é um autômato celular inventado por John Conway em 1970.





As regras são muito simples, todo o jogo se passa no espaço 2D (plano) no qual pode haver 2 tipos de células "Viva" - 0 e "Vazio" -1. As regras básicas para a vida de uma célula são Birth3 Survive23, o que significa que uma célula nasce com três vizinhos e sobrevive com dois ou três, caso contrário ela morre.





A determinação do número de vizinhos ocorre no bairro de Moore.





Um pouco de história de fundo da Wikipedia.





John Conway se interessou por um problema proposto na década de 1940 pelo famoso matemático John von Neumann, que estava tentando criar uma máquina hipotética que pudesse se reproduzir. John von Neumann conseguiu criar um modelo matemático dessa máquina com regras muito complexas. Conway tentou simplificar as ideias propostas por Neumann, e no final conseguiu criar as regras que se tornaram as regras do jogo "Vida".





(1970 ) Scientific American, « » (Martin Gardner)





, , Python/Pygame





Python, .





pygame "pip install pygame" "pip3 install pygame" ( "pip " , PATH Python)





,





# 
import pygame as p
from pygame.locals import *

#   RGB
BLACK = (0 , 0 , 0)
WHITE = (255 , 255 , 255)
#  
root = p.display.set_mode((1000 , 500))
#  
while 1:
    #    
    root.fill(WHITE)
    
    #  
    for i in range(0 , root.get_height() // 20):
        p.draw.line(root , BLACK , (0 , i * 20) , (root.get_width() , i * 20))
    for j in range(0 , root.get_width() // 20):
        p.draw.line(root , BLACK , (j * 20 , 0) , (j * 20 , root.get_height()))
    #        " "
    for i in p.event.get():
        if i.type==	QUIT:
          quit()
    p.display.update()
      
      



-





-
  1. system





  2. Crie uma contagem de contador variável





  3. Nós examinamos cada elemento do sistema





  4. Se o vizinho da célula estiver "ativo", aumente o contador.





  5. Contagem de retorno









# 2      
cells=[ [0 for j in range(root.get_width()//20)] for i in range(root.get_height()//20)]
cells2=cells
#   - 
def near(pos: list , system=[[-1 , -1] , [-1 , 0] , [-1 , 1] , [0 , -1] , [0 , 1] , [1 , -1] , [1 , 0] , [1 , 1]]):
    count = 0
    for i in system:
        if cells[(pos[0] + i[0]) % len(cells)][(pos[1] + i[1]) % len(cells[0])]:
            count += 1
    return count
      
      







E então, agora vamos fazer a lógica básica.





    #    
    for i in range(len(cells)):
        for j in range(len(cells[0])):
            #   
            if cells[i][j]:
                #     2  3 
                if near([i , j]) not in (2 , 3):
                    cells2[i][j] = 0
                    continue
                #   
                cells2[i][j] = 1
                continue
            #       3     
            if near([i , j]) == 3:
                cells2[i][j] = 1
                continue
            #       
            cells2[i][j] = 0
    cells = cells2
      
      



Código completo
# 
import time

import pygame as p
import random
from pygame.locals import *

#   RGB
BLACK = (0 , 0 , 0)
WHITE = (255 , 255 , 255)
#  
root = p.display.set_mode((1000 , 500))
# 2      
cells = [[random.choice([0 , 1]) for j in range(root.get_width() // 20)] for i in range(root.get_height() // 20)]


#   - 
def near(pos: list , system=[[-1 , -1] , [-1 , 0] , [-1 , 1] , [0 , -1] , [0 , 1] , [1 , -1] , [1 , 0] , [1 , 1]]):
    count = 0
    for i in system:
        if cells[(pos[0] + i[0]) % len(cells)][(pos[1] + i[1]) % len(cells[0])]:
            count += 1
    return count


#  
while 1:
    #    
    root.fill(WHITE)

    #  
    for i in range(0 , root.get_height() // 20):
        p.draw.line(root , BLACK , (0 , i * 20) , (root.get_width() , i * 20))
    for j in range(0 , root.get_width() // 20):
        p.draw.line(root , BLACK , (j * 20 , 0) , (j * 20 , root.get_height()))
   #        " "
    for i in p.event.get():
        if i.type == QUIT:
            quit()
    #    

    for i in range(0 , len(cells)):
        for j in range(0 , len(cells[i])):
            print(cells[i][j],i,j)
            p.draw.rect(root , (255 * cells[i][j] % 256 , 0 , 0) , [i * 20 , j * 20 , 20 , 20])
    #  
    p.display.update()
    cells2 = [[0 for j in range(len(cells[0]))] for i in range(len(cells))]
    for i in range(len(cells)):
        for j in range(len(cells[0])):
            if cells[i][j]:
                if near([i , j]) not in (2 , 3):
                    cells2[i][j] = 0
                    continue
                cells2[i][j] = 1
                continue
            if near([i , j]) == 3:
                cells2[i][j] = 1
                continue
            cells2[i][j] = 0
    cells = cells2
      
      







Verificação de código
Verificação de código

Tudo deu certo, a velocidade também não atrapalha.





Nos próximos artigos tentaremos implementar modificações no jogo "Life".












All Articles