conways-life 康威的人生游戏
《康威的人生游戏》是约翰·康威在1970年提出的一个简单的模拟生命系统,它是一种零玩家游戏,规则简单但能够展现出复杂的动态行为。在这个游戏中,细胞在二维网格上根据一定的规则进行生死迭代。这个系统因其能够自我复制、演化出各种模式,并且在理论上可以模拟任何计算过程,而受到了广泛的关注。
在这个项目中,标签为"JavaScript",意味着我们将用JavaScript编程语言来实现康威的人生游戏。JavaScript是一种常用的前端开发语言,不仅能在浏览器端运行,还可以通过Node.js在服务器端执行。
我们需要创建一个二维数组来表示细胞网格。每个数组元素代表网格上的一个细胞,其值可以为0(死亡)或1(生存)。我们可以这样初始化一个5x5的网格:
let grid = Array(5).fill().map(() => Array(5).fill(0));
我们需要定义康威人生游戏的规则:
-
繁殖规则:如果一个细胞周围有3个活细胞,它将在下一次迭代时存活(如果原本死亡,则复活)。
-
生存规则:如果一个活细胞周围有2个活细胞,它会继续存活;否则,它会死亡(因孤寂或过密)。
我们可以遍历网格中的每个细胞,计算其周围8个邻居的活细胞数量,然后根据规则更新细胞的状态。这个过程可以通过两次遍历来完成:先计算新状态,再更新网格。
function nextGeneration(grid) {
let newGrid = JSON.parse(JSON.stringify(grid)); //克隆网格,避免原地修改
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
let neighbors = countNeighbors(grid, i, j);
if (grid[i][j] === 1 && (neighbors === 2 || neighbors === 3)) {
newGrid[i][j] = 1;
} else if (grid[i][j] === 0 && neighbors === 3) {
newGrid[i][j] = 1;
} else {
newGrid[i][j] = 0;
}
}
}
return newGrid;
}
function countNeighbors(grid, x, y) {
let count = 0;
for (let i = -1; i <= 1; i++) {
for (let j = -1; j <= 1; j++) {
const xi = (x + i + grid.length) % grid.length;
const yj = (y + j + grid[0].length) % grid[0].length;
count += grid[xi][yj];
}
}
count -= grid[x][y]; //不包括自身
return count;
}
为了展示这些变化,我们可以使用HTML和CSS创建一个可视化界面。创建一个包含单元格的 对这些有趣的细胞生命感兴趣?您可以参考这些精彩的资源获取更多的实现细节:康威人生游戏的P5.js实现源码、约翰·康威人生游戏的变形源码、通过编程约翰·康威的人生游戏学习Python源码。这些链接将带您探索更多康威人生游戏的实现方式,丰富您的开发经验! 用JavaScript实现康威人生游戏,是不是很有趣?如果你热爱前端开发,这里还有更多资源等你来探索。这些资源将帮助你在前端开发的世界中尽情遨游,掌握更多实用技能。快来试试吧!,并根据细胞状态改变单元格的背景色。使用
requestAnimationFrame
实现动画效果,每帧调用nextGeneration
函数并更新界面。
function drawGrid(grid) {
const table = document.getElementById('game-grid');
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
const cell = table.rows[i].cells[j];
cell.className = grid[i][j] ? 'alive' : 'dead';
}
}
}
let intervalId;
function startGame() {
clearInterval(intervalId);
intervalId = setInterval(() => {
grid = nextGeneration(grid);
drawGrid(grid);
}, 100); //每100毫秒更新一次
}
function stopGame() {
clearInterval(intervalId);
}