Jeu de la vie de Conways en Python

C'est mon premier article où je veux vous parler du plus célèbre automate cellulaire "Game of Life", et aussi l'écrire en Python en utilisant des graphiques Pygame.





Conways Game of life (en russe `` Game of life '') est un automate cellulaire inventé par John Conway en 1970.





Les règles sont très simples, l'ensemble du jeu se déroule dans un espace 2D (plan) sur lequel il peut y avoir 2 types de cellules "Live" - ​​0 et "Empty" -1. Les règles de base d'une cellule sont Birth3 Survive23, ce qui signifie qu'une cellule est née avec trois voisins et survit avec deux ou trois, sinon elle meurt.





La détermination du nombre de voisins a lieu dans le quartier de Moore.





Un peu d'histoire de base de Wikipedia.





John Conway s'est intéressé à un problème proposé dans les années 1940 par le célèbre mathématicien John von Neumann, qui tentait de créer une machine hypothétique capable de se reproduire. John von Neumann a réussi à créer un modèle mathématique d'une telle machine avec des règles très complexes. Conway a essayé de simplifier les idées proposées par Neumann, et à la fin il a réussi à créer les règles qui sont devenues les règles du jeu de la vie.





(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. Créer un compteur variable





  3. Nous parcourons chaque élément du système





  4. Si le voisin de la cellule est "vivant", augmentez le compteur.





  5. Nombre de retours









# 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
      
      







Et donc, maintenant, faisons la logique de base.





    #    
    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
      
      



Code complet
# 
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
      
      







Vérification du code
Vérification du code

Tout a fonctionné, la vitesse ne frustre pas non plus.





Dans les prochains articles nous essaierons d'implémenter des modifications du jeu "Life".












All Articles