xxxxxxxxxx
123
let allOptions = [
{ dx: 1, dy: 0 },
{ dx: -1, dy: 0 },
{ dx: 0, dy: 1 },
{ dx: 0, dy: -1 }
];
let numberOfWalkers = 25;
let colorLow = 1;
let colorUpp = 3;
let red = 255;
let blue = 0;
let green = 0;
let allX = new Array(numberOfWalkers);
let allY = new Array(numberOfWalkers);
let grid;
let spacing = 10;
let cols, rows;
function make2DArray(cols, rows) {
let arr = new Array(cols);
for (let i = 0; i < arr.length; i++) {
arr[i] = new Array(rows);
}
return arr;
}
function startGrid(grid){
for (let i = 0; i < cols; i++) {
for (let j = 0; j < rows; j++) {
grid[i][j] = 0;
}
}
return grid
}
function downgradeGrid(grid){
for (let i = 0; i < cols; i++) {
for (let j = 0; j < rows; j++) {
grid[i][j] = grid[i][j] - colorUpp;
}
}
return grid
}
function setup() {
createCanvas(500, 500);
cols = floor(width / spacing);
rows = floor(height / spacing);
for (let walker = 0; walker < numberOfWalkers; walker++){
allX[walker] = cols / 2;
allY[walker] = rows / 2;
background(255);
grid = make2DArray(cols, rows);
grid = startGrid(grid)
grid[allX[walker]][allY[walker]] = 1;
}
}
function isValid(i, j) {
return !(i < 1 || i >= cols || j < 1 || j >= rows);
}
function best_step(x,y,validOptions){
min = Infinity
best_options = []
for (let option of validOptions){
next_x = x + option.dx;
next_y = y + option.dy;
if (min > grid[next_x][next_y]){
best_options = []
best_options.push(option)
min = grid[next_x][next_y]
} else {
if (min == grid[next_x][next_y]){
best_options.push(option)
}
}
}
return random(best_options)
}
function draw() {
for (let walker = 0; walker < numberOfWalkers; walker++){
let options = [];
for (let option of allOptions) {
let newX = allX[walker] + option.dx;
let newY = allY[walker] + option.dy;
if (isValid(newX, newY)) {
options.push(option);
}
}
let step = best_step(allX[walker],allY[walker],options);
if (grid[allX[walker]][allY[walker]] > colorLow){
strokeWeight(spacing * 0.8);
stroke(red,blue,green, 255);
} else {
strokeWeight(spacing * 0.5);
stroke(150,100);
}
allX[walker] += step.dx;
allY[walker] += step.dy;
point(allX[walker] * spacing, allY[walker] * spacing);
grid[allX[walker]][allY[walker]]++;
if (grid[allX[walker]][allY[walker]] > colorUpp){
grid = downgradeGrid(grid)
updateRandomColor()
}
}
}
function updateRandomColor() {
red = random(255);
green = random(255);
blue = random(255);
}