let animationSpeed = 0.05;
createCanvas(windowWidth, windowHeight);
function generateCritters() {
for (let i = 0; i < numCritters; i++) {
let critter = createCritter();
critterColors.push(color(random(255), random(255), random(255)));
function createCritter() {
for (let i = 0; i < gridSize / 2; i++) {
for (let j = 0; j < gridSize; j++) {
grid[i][j] = random() > 0.5;
for (let i = gridSize / 2; i < gridSize; i++) {
for (let j = 0; j < gridSize; j++) {
grid[i][j] = grid[gridSize - 1 - i][j];
function updateCritters() {
for (let critter of critters) {
for (let i = 0; i < gridSize / 2; i++) {
for (let j = 0; j < gridSize; j++) {
if (random() < animationSpeed) {
critter[i][j] = !critter[i][j];
critter[gridSize - 1 - i][j] = critter[i][j];
function displayCritters() {
let cols = floor(width / (gridSize * critterSize));
let rows = floor(height / (gridSize * critterSize));
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
let index = i * cols + j;
if (index < critters.length) {
let x = j * gridSize * critterSize;
let y = i * gridSize * critterSize;
displayCritter(critters[index], critterColors[index], x, y);
function displayCritter(critter, bgColor, x, y) {
rect(x, y, gridSize * critterSize, gridSize * critterSize);
for (let i = 0; i < gridSize; i++) {
for (let j = 0; j < gridSize; j++) {
rect(x + i * critterSize, y + j * critterSize, critterSize, critterSize);
function windowResized() {
resizeCanvas(windowWidth, windowHeight);