Conway’s Game of Life, cellular automaton operates on a two-dimensional grid of cells, where each cell can be in one of two states:
Alive (1)
Dead (0)
Here are the rules:
A live cell with fewer than 2 live neighbors dies (underpopulation).
A live cell with 2 or 3 live neighbors stays alive (survival).
A live cell with more than 3 live neighbors dies (overpopulation).
A dead cell with exactly 3 live neighbors becomes alive (reproduction).
The grid should be updated only after evaluating the whole grid first.
const rows = 3
const cols = 3
const grid = [
[0, 1, 0],
[0, 1, 0],
[0, 1, 0]
]
const nextGrid = Array.from({ length: rows }, () => Array(cols).fill(0))
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
const neighbors = countNeighbors(grid, i, j, rows, cols)
console.log("count neigbor is", neighbors)
const cell = grid[i][j]
if (cell === 1) {
if (neighbors < 2) {
// die
nextGrid[i][j] = 0
} else if (neighbors === 2 || neighbors === 3) {
// live
nextGrid[i][j] = 1
} else if (neighbors > 3) {
// die
nextGrid[i][j] = 0
}
} else {
if (neighbors === 3) {
nextGrid[i][j] = 1
}
}
}
}
console.log("grid is", grid)
console.log("nextGrid is", nextGrid)
function countNeighbors(grid, row, col, rows, cols) {
const rowAbove = row - 1
const rowBelow = row + 1
const colLeft = col - 1
const colRight = col + 1
const neighbors = [
[rowAbove, colLeft],
[rowAbove, col],
[rowAbove, colRight],
[row, colLeft],
[row, colRight],
[rowBelow, colLeft],
[rowBelow, col],
[rowBelow, colRight]
]
let count = 0
for (let neighbor of neighbors) {
const [r, c] = neighbor
if (r >= 0 && r <= rows - 1 && c >= 0 && c <= cols - 1) {
if (grid[r][c]) count++
}
return count
}
Output is
grid is [ [ 0, 1, 0 ], [ 0, 1, 0 ], [ 0, 1, 0 ] ] nextGrid is [ [ 0, 0, 0 ], [ 1, 1, 1 ], [ 0, 0, 0 ] ]