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();
}