I am trying to rework the cellular automaton code so that instead of filling each cell with 0 or 255, filling it instead with a randomly generated symbol from an array. I have gotten thus far (see below,) but where I have put the line text(symbols[int(random(symbols.length))]); is giving me the error code of "The method text(char,float,float) in the type PApplet is not applicable for the arguments (char)". Any help or suggestions would be great.
CA ca;
PFont f;
char[] symbols = {
'▓', '▒', '░'
};
void setup() {
size(640, 360, P2D);
f = createFont("FreeSans", 20, true);
textFont(f, 1);
frameRate(30);
background(0);
int[] ruleset = {0,1,0,1,1,0,1,0};
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();
}
// Set the rules of the CA
void setRules(int[] r) {
rules = r;
}
void randomize() {
for (int i = 0; i < 8; i++) {
rules[i] = int(random(2));
}
}
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];
int me = cells[i];
int right = cells[i+1];
nextgen[i] = executeRules(left,me,right);
}
for (int i = 1; i < cells.length-1; i++) {
cells[i] = nextgen[i];
}
generation++;
}
void render() {
for (int i = 0; i < cells.length; i++) {
if (cells[i] == 1) {
text(symbols[int(random(symbols.length))]);
} else {
fill(0);
}
noStroke();
rect(i*scl,generation*scl, scl,scl);
}
}
int executeRules (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]; }
I am trying to write a program that picks a symbol from a set randomly and prints in out onto the display, then repeats the process while moving the new symbol over about 20 pixels (eventually hopping to the next line after the horizontal line has filled with symbols and stopping at the end of the display -- keeping all on the screen.) I have gotten thus far (see below) in my program, but am having some major issues:
The symbols seem to be running through the list and not randomly generating.
The symbols are printing one on top of the previous.