Jogo da Vida

Exemplo de uso de Tabela de Decisões para o Kata Jogo da Vida realizado em 12 de agosto de 2009 na Reunião #28 do Dojo Rio
1. Definição

You start with a two dimensional grid of cells, where each cell is either alive or dead. In this version of the problem, the grid is finite, and no life can exist off the edges. When calcuating the next generation of the grid, follow these rules:

  1. Any live cell with fewer than two live neighbours dies, as if caused by underpopulation.
  2. Any live cell with more than three live neighbours dies, as if by overcrowding.
  3. Any live cell with two or three live neighbours lives on to the next generation.
  4. Any dead cell with exactly three live neighbours becomes a live cell.

You should write a program that can accept an arbitrary grid of cells, and will output a similar grid showing the next generation.

2. Definição (tradução)

Você começa com uma matriz bidimensional de células, onde cada célula está viva ou morta. Nesta versão do problema, a matriz é finita, e não pode existir vida fora das bordas. Quando calcular a próxima geração da matriz, siga estas regras:

  1. Qualquer célula viva com menos de dois vizinhos vivos morre, como em uma redução de população.
  2. Qualquer célula viva com mais de três vizinhos vivos morre, como em um excesso de população.
  3. Qualquer célula viva com dois ou três vizinhos vivo se mantém viva para a próxima geração.
  4. Qualquer célula morta com exatamente três vizinhos vivos se torna uma célula viva.

Escrever um programa que aceite uma matriz arbitrária de células, e tenha como saída uma matriz semelhante mostrando a próxima geração.

3. Definição usando Tabela de Decisões Repetir para cada linha e coluna:
Está vivo?
| Tem menos de 2 vizinhos?
| | Tem mais de 3 vizinhos?
| | | Tem 2 vizinhos?
| | | | Tem 3 vizinhos?
1 1 - - - * célula = 0 -- morre
1 - 1 - - * célula = 0 -- morre
1 - - 1 - * célula = 1 -- fica vivo
1 - - - 1 * célula = 1 -- fica vivo
0 - - - 1 * célula = 1 -- nasce
4. Simplificando a Tabela de Decisões Repetir para cada linha e coluna:
Está vivo?
| Tem 2 vizinhos?
| | Tem 3 vizinhos?
1 1 - 
- - 1 * célula = 1 -- fica vivo
5. Outra visão da forma simplificada Repetir para cada linha e coluna:
célula = vizinho(grid(linha, coluna)) == 3 OU (grid(linha, coluna) E vizinho(grid(linha, coluna)) == 2)
6. Esticando a prosa O componente "gerar" transforma a matriz "grid" na matriz "next"
gerar (grid(linhas, colunas)) => next(linhas, colunas):
Repetir para cada linha e coluna:
Está vivo?
| Tem menos de 2 vizinhos?
| | Tem mais de 3 vizinhos?
| | | Tem 2 vizinhos?
| | | | Tem 3 vizinhos?
1 1 - - - * célula = 0 -- morre
1 - 1 - - * célula = 0 -- morre
1 - - 1 - * célula = 1 -- fica vivo
1 - - - 1 * célula = 1 -- fica vivo
0 - - - 1 * célula = 1 -- nasce
---- regras impossíveis
- 1 1 -  -
- 1 - 1  -
- 1 - - 1
- - 1 1 -
- - 1 - 1
- - - 1 1
- 0 0 0 0 * ?!
---- regras que faltam
0 1 0 0 0 * célula = 0 -- fica igual
0 0 1 0 0 * célula = 0 -- fica igual
0 0 0 1 0 * célula = 0 -- fica igual
7. Dicas para testes Condições::
  • responde certo:
    • está vivo?
    • qtd de vizinhos
ações
  • morre certo?
  • nasce certo?
Tabela de Decisões (semântica)
  • está completa? (contempla todas regras)
  • existem regras incompatíveis?