sandboxels/mods/gameOfLife.js

83 lines
2.3 KiB
JavaScript

// UNFINISHED
{
let processed = 0;
let started = false;
const offsetX = 20;
const offsetY = 10;
function getAliveNeighbors(x, y) {
let amount = 0;
for (const i of [-1, 0, 1]) {
for (const j of [-1, 0, 1]) {
if (i == 0 && j == 0) continue;
if (outOfBounds(x + i, y + j)) continue;
const x1 = x + i;
const y1 = y + j;
if (pixelMap[x1][y1] && pixelMap[x1][y1].element == "alive_cell") amount++;
}
}
return amount;
}
elements.alive_cell = {
name: "Alive cell",
color: "#000000"
}
elements.dead_cell = {
name: "Dead cell",
color: "#ffffff"
}
setInterval(cellTick, (1000/tps)*2);
function cellTick() {
if (started && !paused) {
const newStates = [];
for (let i = offsetX; i < width - offsetX; i++) {
for (let j = offsetY; j < height - offsetY; j++) {
if (!pixelMap[i][j]) continue;
const {element} = pixelMap[i][j];
const neighbors = getAliveNeighbors(i, j);
if (element == "alive_cell") {
if (neighbors < 2 || neighbors > 3) {
newStates.push(["dead_cell", i, j]);
} else {
newStates.push(["alive_cell", i, j]);
}
} else if (element == "dead_cell") {
if (neighbors == 3) {
newStates.push(["alive_cell", i, j]);
} else {
newStates.push(["dead_cell", i, j]);
}
}
}
}
for (let state of newStates) {
const {element} = pixelMap[state[1]][state[2]];
if (element != state[0]) {
deletePixel(state[1], state[2]);
createPixel(state[0], state[1], state[2]);
}
}
}
}
window.addEventListener("keydown", (ev) => {
if (ev.key == "u") {
if (!started) {
videoFrame = 0;
for (let i = offsetX; i < width - offsetX; i++) {
for (let j = offsetY; j < height - offsetY; j++) {
if (pixelMap[i][j]) deletePixel(i, j);
createPixel("dead_cell", i, j);
}
}
}
started = !started;
}
})
}