《康威的人生游戏》是约翰·康威(John Horton Conway)在1970年提出的一个简单的模拟生命系统,它是一种零玩家游戏,规则简单但能够展现出复杂的动态行为。在这个游戏中,细胞在二维网格上根据一定的规则进行生死迭代。这个系统因其能够自我复制、演化出各种模式,并且在理论上可以模拟任何计算过程,而受到了广泛的关注。

在这个项目中,标签为"JavaScript",意味着我们将用JavaScript编程语言来实现康威的人生游戏。JavaScript是一种常用的前端开发语言,不仅能在浏览器端运行,还可以通过Node.js在服务器端执行。下面将详细介绍如何使用JavaScript来实现康威的人生游戏。我们需要创建一个二维数组来表示细胞网格。每个数组元素代表网格上的一个细胞,其值可以为0(死亡)或1(生存)。我们可以这样初始化一个5x5的网格:


let grid = Array(5).fill().map(() => Array(5).fill(0));

我们需要定义康威人生游戏的规则:

  1. 繁殖规则:如果一个细胞周围有3个活细胞,它将在下一次迭代时存活(如果原本死亡,则复活)。

  2. 生存规则:如果一个活细胞周围有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创建一个可视化界面。创建一个包含单元格的

,并根据细胞状态改变单元格的背景色。使用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);

}

文件列表

conways-life-master.zip (预估有个4文件)
conways-life-master
css
style.css 0B
index.html 205B
js
script.js 20B
README.md 49B

用户评论

暂无评论

暂无评论