xxxxxxxxxx
var w, h;
var cellSize = 30;
var cells = [];
var states = 5;
var colors = ['#C9FBFF', '#C2FCF7','#B49FCC','#57737A','#040F0F'];
var predatorMin = 3;
var randomPredatorMinimum = 3;
var prevTime = 0, interval = 10;
var iterationCount = 0;
function setup() {
createCanvas(displayWidth, displayHeight);
w = ceil(width/cellSize);
h = ceil(height/cellSize);
print("w:" + w);
print("h:" + h);
for(var x=0; x<w; x++) {
cells[x] = [];
for(var y=0; y<h; y++) {
cells[x][y] = int(random(states));
}
}
noStroke();
}
function draw() {
for(y=0;y<h;y++) {
for(x=0;x<w;x++) {
fill(colors[cells[x][y]]);
rect(x*cellSize,y*cellSize,cellSize,cellSize);
}
}
if (millis() - prevTime > interval) {
step();
prevTime = millis();
// print("iteration:" + iterationCount);
}
fill('#ed1234');
textSize(24);
text(int(frameRate()),20,100);
}
function step() {
var cellsBuffer = cells;
for(y=0;y<h;y++) {
for(x=0;x<w;x++) {
var predatorNum = floor(states/2);
var predators = [];
var predatorStates = [];
var gesamtPredators = 0;
for (var k=0; k<predatorNum; k++) {
predatorStates[k] = (cells[x][y] + 1 + k) % states;
predators[k] = countNeighbours(x,y,predatorStates[k]);
gesamtPredators += predators[k];
}
if (gesamtPredators >= predatorMin + int(random(randomPredatorMinimum))) {
var r = int(random(gesamtPredators));
k = -1;
while(r >= 0) {
k++;
r -= predators[k];
}
cellsBuffer[x][y] = predatorStates[k];
}
}
}
cells = cellsBuffer;
iterationCount++;
}
function countNeighbours(x, y, s) {
var c = 0;
for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
if (i!=1 || j!=1) {
if (getCellState(x+j-1,y+i-1) == s) {
c++;
}
}
}
}
return c;
}
function getCellState(x,y) {
return cells[(x+w)%w][(y+h)%h];
}