/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.xJeLMZ$yxgf/rev.2
*
* authors:
* (Unnamed author)
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
// This sketch builds on a prior work, "Untitled Sketch", created by [unnamed author]
// http://sketchpad.cc/sp/pad/view/ro.Iv9U4Ao4IoJ/rev.255
CA ca;
void setup() {
size(200,200);
//frameRate(30);
background(255);
int[] ruleset = {0,0,0,0,0,0,0,1};
ca = new CA(ruleset);
}
void draw() {
ca.render();
ca.generate();
if (ca.finished()) {
background(0);
ca.randomize();
ca.restart();
}
}
void mousePressed() {
background(0);
ca.randomize();
ca.restart();
}
class CA {
int[] cells;
int generation;
int scl;
int[] rules;
CA(int[] r) {
rules = r;
scl = 1;
cells = new int[width/scl];
restart();
}
CA() {
scl = 1;
cells = new int[width/scl];
randomize();
restart();
}
int applyRules (int a, int b, int c) {
if (a == 1 && b == 1 && c == 1) return rules[0];
if (a == 1 && b == 1 && c == 0) return rules[1];
if (a == 1 && b == 0 && c == 1) return rules[2];
if (a == 1 && b == 0 && c == 0) return rules[3];
if (a == 0 && b == 1 && c == 1) return rules[4];
if (a == 0 && b == 1 && c == 0) return rules[5];
if (a == 0 && b == 0 && c == 1) return rules[6];
if (a == 0 && b == 0 && c == 0) return rules[7];
return 0;
}
void setRules(int[] r) {
rules = r;
}
void randomize() {
for (int i = 0; i < 8; i++) {
rules[i] = int(random(3));
}
}
void restart() {
for (int i = 0; i < cells.length; i++) {
cells[i] = 0;
}
cells[cells.length/2] = 1;
generation = 0;
}
void generate() {
int[] nextgen = new int[cells.length];
for (int i = 1; i < cells.length-1; i++) {
int left = cells[i-1]; // vizinho esquerda
int me = cells[i]; // estado corrente
int right = cells[i+1]; // vizinha direita
nextgen[i] = this.applyRules(left,me,right); // computa proxima geracao
}
cells = nextgen;
generation++;
}
void render() {
for (int i = 0; i < cells.length; i++) {
if (cells[i] == 1) {
fill(255);
} else if (cells[i] == 2) {
fill(0,255,0);
} else {
fill(0);
}
noStroke();
rect(i*scl,generation*scl, scl,scl);
}
}
boolean finished() {
if (generation > height/scl) {
return true;
} else {
return false;
}
}
}