Le jeu de la vie de Conway

Aller en bas

Le jeu de la vie de Conway Empty Le jeu de la vie de Conway

Message  Gus le Dim 11 Sep - 10:14

Le jeu de la vie de John Horton Conway est le plus connu des automates cellulaires. Pour ceux qui ne le connaissent pas encore, voici le lien wiki qui vous expliquera de quoi il s'agit :
http://fr.wikipedia.org/wiki/Jeu_de_la_vie

J'ai donc décidé de commencer à implémenter cet automate, dont je vous fournis ici le code source.
Il s'agit d'une entité de transformation qui calcule l'état suivant de l'automate. Rien de vraiment bien compliqué Cool

gus.cellularautomaton.conway.gameoflife.transition

Code:
package gus05.entity.gus.cellularautomaton.conway.gameoflife.transition;

import gus05.framework.core.Entity;
import gus05.framework.features.Transform;

public class GameOfLifeTransition implements Entity, Transform {

    public String getName()            {return "gus.cellularautomaton.conway.gameoflife.transition";}
    public String getCreationDate()      {return "2011.09.11";}


    public Object transform(Object obj) throws Exception
    {
       boolean[][] b = (boolean[][]) obj;
       
       int x = b.length;
       if(x==0) throw new Exception("Empty size for data");
       
       int y = b[0].length;
       if(y==0) throw new Exception("Empty size for data");
       
       boolean[][] b1 = new boolean[x][y];
       for(int i=0;i<x;i++)
       for(int j=0;j<y;j++)
       b1[i][j] = findNextValue(b,i,j);
       
       return b1;
    }
   
    private boolean findNextValue(boolean[][] b, int i, int j)
    {
       int n = aliveNeighbours(b,i,j);
       if(b[i][j]) return n==2 || n==3;
       return n==3;
    }

    private int aliveNeighbours(boolean[][] b, int i, int j)
    {
       int x = b.length;
       int y = b[0].length;
       
       int i1 = i>0?i-1:x-1;
       int i2 = i<x-1?i+1:0;
       
       int j1 = j>0?j-1:y-1;
       int j2 = j<y-1?j+1:0;
       
       int n = 0;
       
       if(b[i1][j1]) n++;
       if(b[i1][j]) n++;
       if(b[i1][j2]) n++;
       
       if(b[i][j1]) n++;
       if(b[i][j2]) n++;
       
       if(b[i2][j1]) n++;
       if(b[i2][j]) n++;
       if(b[i2][j2]) n++;
       
       return n;
    }
}

Et voici une petite vidéo pour vous montrer ce qu'on obtient en pratique sur un petit exemple :

Gus
Gus
Admin

Messages : 249
Date d'inscription : 01/09/2009

Voir le profil de l'utilisateur http://www.gus05.com

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum