-- Demo : Jogo da Vida -- Entrada -- Autômatos Celular: -- 1. Uma matriz -- 2. Uma vizinhança -- 3. Conjunto de estados discretos -- 4. Conjunto de regras de transição -- 5. Tempo de simulação discreto -- Passo 1. Criar matriz game = CellularSpace { xdim = 50, -- dimensao horizontal ydim = 50 -- dimensao vertical } -- Passo 2. Criar vizinhança de cada célula createMooreNeighborhood (game); -- Passo 3. Definir conjunto de estados VIVA = 1 MORTA = 0 -- math.random() gera um numero aleatorio entre 0 e 1 -- queremos gerar uma proporcao dada de celulas vivas function is_alive (percentagem) if math.random() < percentagem then return VIVA else return MORTA end end PERCENT = 0.2 -- preencher o espaço celular com celulas vivas ou mortas -- PERCENT de celulas estarao vivas forEachCell (game, function(cell) cell.state = is_alive (PERCENT) end) game:synchronize() -- Passo 4. Regras de transiçao -- Passo 4.1 - Funcao auxiliar que calcula o numero de vizinhos function howManyNeighAreAlive (cell) neigh_alive = 0 forEachNeighbor(cell, function (cell, neigh) if (cell ~= neigh) then if neigh.past.state == VIVA then neigh_alive = neigh_alive + 1 end end end ) return neigh_alive end -- -- Passo 4.2 Implemente regras de transição transRules = function (cell) neigh_alive = howManyNeighAreAlive (cell) if (cell.past.state == VIVA) then -- Célula viva com menos de dois vizinhos vivos morre de solidao if (neigh_alive < 2) then cell.state = MORTA end -- Célula viva com mais de três vizinhos vivos morre de chateação. if (neigh_alive > 3) then cell.state = MORTA end -- Célula viva com duas ou três vizinhos vivos continua feliz. if (neigh_alive == 2 or neigh_alive == 3) then cell.state = VIVA end else -- Célula morta com exatamente três vizinhos vivos ressucita if (neigh_alive == 3) then cell.state = VIVA else cell.state = MORTA end end end -- PASSO 5. Fazer uma simulação com tempo discreto -- PASSO 5.1 Criar um observer com legenda para visualizar o jogo leg = Legend{ type = TYPES.NUMBER, groupingMode = GROUPING.UNIQUEVALUE, slices = 2, maximum = 1, minimum = 0, colorBar1 = { {BLUE, MORTA}, {YELLOW, VIVA} } } game:createObserver(OBSERVERS.MAP,{"state"},{leg}) -- PASSO 5.2 Realizar a simulação for t = 1, 200, 1 do forEachCell (game, transRules) -- implementa regras de transição game:synchronize() -- sincroniza ao fim de cada passo game:notifyObservers(t) -- gera visualização end print ("acabou") io.read()