E aí pessoal!

Uma forma de aprender um pouco sobre PYTHON e também sobre essa área de computação chamada automato celular, é desenvolver o Jogo da Vida de Conway. A tela acima é gerada pela programação em PYTHON no final do post. Você precisará do interpretador PYTHON e da biblioteca PIL (Python Image Library) instalados no seu PC.

Este jogo é uma simulação gráfica de de matriz de células (em referência a biologia). Cada célula pode estar viva (verde) ou morta (preto) de acordo com 4 regras básicas:

  1. Qualquer célula viva com menos de duas células vivas vizinhas morre de solidão;
  2. Qualquer célula viva com duas ou três células vivas vizinhas vive para a próxima geração;
  3. Qualquer célula com três células vivas vizinhas, se torna uma célula viva;
  4. Qualquer célula viva com mais de três células vivas vizinhas morre de superpopulação.

O que torna o Jogo da Vida excitante é que somente com estas quatro regras básicas, surgem padrões, comportamentos característicos e bem definidos. Em qualquer programa e em qualquer linguagem irão aparecer os mesmos padrões. Alguns padrões são bem emblemáticos e destacaremos a seguir.

Os Gliders são estruturas que se modificam a cada ciclo do programa e se locomovem dentro da matriz. Poderia o Glider, como na biologia, um organismo multi-celular? Pensamentos à parte,  os gliders são reconhecidos como símbolo da cultura hacker.

Os Blinkers (3 células juntas) são um oscilador padrão. Neste caso, eles tem 2 ciclos, mas podem ter 20, 30, 40 ou até mais antes de se estabilizarem. Os Blinkers podem viver indefinidamente.

Os GUNS são formas estáveis de vida que criam os Gliders constantemente. Eles oscilam como os Blinkers, mas em cada ciclo, eles criam um Glider. Eles são um tipo de padrão complexo que evolui a partir das 4 regras básicas.

Agora que entendemos seus princípios básicos, vamos entender a programação em PYTHON que simula o jogo. Este exemplo é limitado e o objetivo é demonstrar os conceitos básicos. O código pode se implementado com muito mais. Caso tenha uma sugestão, poste aqui neste blog.

O código comentado do Jogo da Vida de Conway:

from Tkinter import *
import random
import time

cell = [[0 for row in range(-1,61)] for col in range(-1,81)]
vivo = [[0 for row in range(-1,61)] for col in range(-1,81)]
temp = [[0 for row in range(-1,61)] for col in range(-1,81)]

def frame():
processa()
desenha()
root.after(100, frame)

def carrega():
for y in range(-1,61):
for x in range(-1,81):
vivo[x][y] = 0
temp[x][y] = 0
cell[x][y] = canvas.create_oval((x*10, y*10, x*10+10, y*10+10),outline="gray",fill="black")

# GLIDER em 10,10
vivo[11][10] = 1
vivo[12][11] = 1
vivo[10][12] = 1
vivo[11][12] = 1
vivo[12][12] = 1

# GLIDER em 30,30
vivo[31][30] = 1
vivo[32][31] = 1
vivo[30][32] = 1
vivo[31][32] = 1
vivo[32][32] = 1

def processa():
for y in range(0,60):
for x in range(0,80):
vivos = vizinhos_vivos(x,y)
# Regra 1 - Any live cell with fewer than two live neighbours dies, as if caused by under-population.
if vivo[x][y] == 1 and vivos < 2: temp[x][y] = 0
# Regra 2 - Any live cell with two or three live neighbours lives on to the next generation.
if vivo[x][y] == 1 and (vivos == 2 or vivos == 3): temp[x][y] = 1
# Regra 3 - Any live cell with more than three live neighbours dies, as if by overcrowding.
if vivo[x][y] == 1 and vivos > 3: temp[x][y] = 0
# Regra 4 - Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.
if vivo[x][y] == 0 and vivos == 3: temp[x][y] = 1
for y in range(0,60):
for x in range(0,80):
vivo[x][y] = temp[x][y]

def vizinhos_vivos(a,b):
vivos = 0
if vivo[a-1][b+1] == 1: vivos = vivos + 1
if vivo[a][b+1] == 1: vivos = vivos + 1
if vivo[a+1][b+1] == 1: vivos = vivos + 1
if vivo[a-1][b] == 1: vivos = vivos + 1
if vivo[a+1][b] == 1: vivos = vivos + 1
if vivo[a-1][b-1] == 1: vivos = vivos + 1
if vivo[a][b-1] == 1: vivos = vivos + 1
if vivo[a+1][b-1] == 1: vivos = vivos + 1
return vivos

def desenha():
for y in range(60):
for x in range(80):
if vivo[x][y]==0:
canvas.itemconfig(cell[x][y], fill="black")
if vivo[x][y]==1:
canvas.itemconfig(cell[x][y], fill="green")

root = Tk()
root.title("Conway's Game of Life")
canvas = Canvas(root, width=800, height=600, highlightthickness=0, bd=0, bg='black')
canvas.pack()
carrega()
frame()
root.mainloop()

E é isso!! Esperamos que tenha gostado! Caso tenha dúvidas, poste aqui neste blog! Se tiver sugestões para tutoriais, clique aqui! Caso queira ver nossos outros tutoriais e projetos desenvolvidos pela equipe LdG e por outros garagistas, clique aqui e aqui! Até a próxima!

Referências:

http://www.bitstorm.org/gameoflife/

http://en.wikipedia.org/wiki/Conway's_Game_of_Life

Exibições: 6317

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço