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()
-
-
system
Créer un compteur variable
Nous parcourons chaque élément du système
Si le voisin de la cellule est "vivant", augmentez le compteur.
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
Tout a fonctionné, la vitesse ne frustre pas non plus.
Dans les prochains articles nous essaierons d'implémenter des modifications du jeu "Life".