Jeu de la vie

Solution du TD Jeu de la vie

Comme pour Feu de forêt, on exploite pixels.

/* définition des couleurs */
color nothing = color(200,200,200);
color life = color(50,50,250);
final float p_life = 0.3; // probabilité initiale qu'une cellule soit ON

void setup(){
  size(1000,800);

  // initialisation de la forêt
  loadPixels();
  // d'abord création aléatoire
  for (int i=0; i<height*width; i++) {
    if (random(1) <= p_life) {
      pixels[i] = life;
    } else {
      pixels[i] = nothing;
    }
  }
  updatePixels();
}

int is_alive(int line, int col) {
  /* renvoie 1 si la cellule designée
     est dans le cadre et en vie. 0 sinon. */
  if ((line < 0) || (line >= height)){
    return 0;
  }
  if ((col<0) || (col>= width)) {
    return 0;
  }
  if (pixels[line*width + col] == life){
    return 1;
  } else {
    return 0;
  }
}

void set_next_state(int line, int col, boolean[] next){
  /* on fournit une ligne et une colonne
     en utilisant la variable globale pixels
     met à jour le tableau next qui contient l'état suivant
  */
  int compte = is_alive(line-1, col-1) + is_alive(line-1, col) + is_alive(line-1, col+1)
             + is_alive(line  , col-1)                         + is_alive(line  , col+1)
             + is_alive(line+1, col-1) + is_alive(line+1, col) + is_alive(line+1, col+1);
  if ((compte == 3) || (compte ==2) && (pixels[line*width+col] == life)) {
    next[line*width+col] = true;
  } else {
    next[line*width+col] = false;
  }
}

void draw(){
  loadPixels();
  // next sert à noter les cases qu'il faudra allumer
  boolean[] next = new boolean[height*width];
  for (int line=0; line<height; line++){
    for (int col=0; col<width; col++){
      set_next_state(line, col, next);
    }
  }
  // mise à jour
  for (int line=0; line<height; line++){
    for (int col=0; col<width; col++){
      if (next[line*width + col]){
        pixels[line*width + col] = life;
      } else {
        pixels[line*width + col] = nothing;
      }
    }
  }
  updatePixels();
}

// ajout d'une intéraction avec la souris
void mousePressed() {
  /* allume une tâche random à l'endroit du clic */
  int demi = 5; // la tache va de mouseX - demi à mouseX + demi, id pour y 
  int x = mouseX;
  if (x < demi) {
    x = demi;
  } else if (x>= width-demi) {
    x = width - demi - 1;
  }
  int y = mouseY;
  if (y < demi) {
    y = demi;
  } else if (y >= height - demi) {
    y = height - demi - 1;
  }
  
  loadPixels();
  for (int i=-demi; i<= demi; i++){
    for (int j=-demi; j<= demi; j++){
      if (random(1) <= p_life) {
        pixels[(y+i)*width + x + j] = life;
      }
    }
  }
  updatePixels();
}