手工元胞自动机
I’m happy to translate the article for you, but I need the actual text of the article (the content you’d like translated). Could you please paste the article’s text here? Once you provide it, I’ll translate it into Simplified Chinese while preserving the formatting, markdown, and code blocks as requested.
Source: …
介绍
本教程将带你一步步创建 & 部署你的第一个 计算沙盒——一个你可以定义模拟规则并探索结果的环境。它设计为在导师的指导下共同完成。
这正好与“随意编码”相反:要利用这些模拟来思考 & 学习世界,你必须了解它们的全部工作原理。这也是我们所有操作都 手动完成 的原因。我们将覆盖你所需的最基本设置,以便:
- 在自己的电脑上运行。
- 与合作者共享,使他们能够编辑并在此基础上进行构建。
灵感
- Permacomputing
- Derek Sivers 的 “tech independence” 哲学
- 另见:
- Casey Muratori 的 “Handmade Hero” 系列
- Explorable Explanations
- 如同 Parable of Polygons,关于社会学的模拟
- Cameras & Lenses,关于相机、光线和视觉的模拟
- 互联网艺术实验者:
- Nolan – eieio.games
- Neal – neal.fun
- 参见 Nolan 的通讯
- 简单研究原型示例(几行代码和单个 HTML 文件):
系列概览
- (本文) 如何在本地的普通 HTML 文件中运行代码,并使用 CodePen 将其部署到互联网上。
- 在 GitHub Pages 上部署免费静态网站或应用,例如:
- Ithaca Social Circle
- 一个基于 Obsidian 的数字花园(Obsidian‑based digital garden)
- 非常基础的后端:
- 使用 Google Sheets 作为免费后端。
- 使用 remoteStorage 的 “自带服务器” 模式。
- 免费的 Cloudflare 对象存储。
- 使用 OAuth(Twitter/Google 登录)进行基础用户管理。
- 基础计算机图形可视化(渲染原始像素,使用 PixiJS 或 ThreeJS)。
- 基础数据分析(Jupyter Notebook 与 Google Colab):
- 浏览开源代码库、分叉、编辑以及贡献 Pull Request 的技巧。
在本课中,你将把一个细胞自动机模拟设置为本地的单个 HTML 文件,然后将其复制粘贴到 CodePen,以便在互联网上分享。

1. 安装 VS Studio Code
我们将把它作为 IDE 来编辑代码。网页浏览器负责 运行 代码。
VS Code 可以编辑任何编程语言——可以在编辑器外运行代码,或通过安装插件让它为你运行。
2. 创建 HTML 文件
HTML 文件只是一个扩展名为 .html 的文本文件。在 HTML 中我们会嵌入想要运行的 JavaScript。
- 使用 VS Code 在计算机任意位置创建一个名为
vanilla.html的文件。 - 将以下代码粘贴进去:
<!DOCTYPE html>
<html>
<head>
<title>Vanilla JS</title>
</head>
<body>
Hello!
<script>
// This is how you embed JavaScript inside of HTML
console.log("Hello world!");
</script>
</body>
</html>
注意: 本系列不会涉及 JavaScript 语法的基础内容。假设你已有补充资料或已经掌握这些内容。推荐阅读 Eloquent JavaScript 以及 Codecademy JavaScript interactive lessons。
- 在浏览器中打开
vanilla.html运行代码。 - 打开浏览器控制台(通常是
F12→ Console),确认已输出Hello world!。
挑战
你能让网页显示当前时间吗?
- 在 JavaScript 中获取当前时间。
- 使用
document.querySelector()选中 “ 元素并将其内容替换为本地时间。 - 使用
setInterval自动更新显示。
解决方案:
提示: 你可以把浏览器控制台当作 REPL 使用!通过
window.myVar = myVar将变量暴露到全局,然后在应用中实时编辑它。
3. 将代码部署到互联网上
这是让你的代码在数百万设备上运行的最快方式。它是“无限”可扩展的,因为代码运行在用户的电脑上,而不是在中心服务器上。CodePen 使托管静态 HTML/JS 的成本非常低(免费)。
- 前往 CodePen.io 并创建一个新 Pen。
- 将
vanilla.html的全部内容复制到 HTML 面板(<script>标签会自动进入 JS 面板)。 - 保存 Pen 并在想让其他人看到时启用 Public(公开)设置。
- 将 URL 分享给协作者,或将 Pen 嵌入博客文章中。
现在,你拥有了一个实时、可分享的模拟版本,任何人都可以在浏览器中打开——无需服务器!
接下来可以做什么?
- 添加一个简单的后端(Google Sheets、remoteStorage 或 Cloudflare)。
- 实现 OAuth 登录(Twitter/Google)。
- 探索图形库(PixiJS、ThreeJS)。
- 使用 Jupyter/Colab 进行数据分析。
祝你玩得开心! 🚀
部署你的代码
你可以将代码托管在任何静态托管服务上,因为它只提供文件(带宽,而非 CPU)。
- 创建一个 CodePen 账户 – 访问该站点并注册。
- 新建一个 “pen”。
- 将你的代码粘贴到编辑器的 HTML 区域。
- 点击 Save(右上角)。
- 要分享,点击右下角(与 Share / Export / Embed 同一行)的 share icon(一个向外的箭头框)。
共享链接的形式如下:(示例已省略)
你可以继续在 CodePen 中编辑,或在本地使用 VS Code 编辑。
4. 动画矩形
我们将绘制一个看起来来回移动的矩形。实际上,我们在每帧清除画布并在新位置重新绘制矩形。
用以下模板替换您当前的代码:
<!DOCTYPE html>
<html>
<head>
<title>Vanilla JS</title>
<style>
html, body {
margin: 0;
overflow: hidden;
}
</style>
</head>
<body>
<canvas></canvas>
<script>
// Full‑screen canvas
const canvas = document.querySelector("canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const ctx = canvas.getContext("2d");
let positionX = 25;
function loop() {
// Clear the screen
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Draw a rectangle: x, y, width, height
ctx.fillRect(positionX, 25, 20, 20);
// Move the rectangle for the next frame
positionX += 1;
// Schedule the next frame
requestAnimationFrame(loop);
}
// Start the animation
loop();
</script>
</body>
</html>
- 进入全屏模式 – 在预览中点击全屏按钮。
- 退出全屏模式 – 再次点击同一个按钮。
挑战
- 让方块移动得更快。
- 让方块从右边缘开始向左移动。
- 让方块来回移动。
对于第三个挑战,将 X 位置设为计数变量的正弦。sin() 返回 [-1, 1] 区间的值;将其缩放到所需范围。
解决方案示例: (实现省略)
5. 细胞自动机网格
我们将从一个像素网格开始,每个像素被随机分配一种颜色。这将作为康威 生命游戏 等细胞自动机模拟的基础。
将当前代码替换为以下内容:
<!DOCTYPE html>
<html>
<head>
<title>Vanilla JS</title>
<style>
html, body {
margin: 0;
overflow: hidden;
}
</style>
</head>
<body>
<canvas></canvas>
<script>
const canvas = document.querySelector("canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const ctx = canvas.getContext("2d");
const grid = {};
const gridSize = 5; // Try changing this value
initGrid();
function loop() {
requestAnimationFrame(loop);
updateGrid();
drawGrid();
}
loop();
function initGrid() {
// Fill the grid with initial random colours
for (let x = 0; x
}
// Additional functions (updateGrid, drawGrid, etc.) would go here
</script>
</body>
</html>
- 进入全屏模式 – 在预览中点击全屏按钮。
- 退出全屏模式 – 再次点击同一个按钮。
挑战
- 将
grid暴露给浏览器控制台,以便实时编辑它。
提示:window.grid = grid;
然后,在控制台中可以运行一行代码,例如Object.keys(grid).forEach(k => grid[k] = 0);。 - 通过更新
updateGrid让颜色每帧变化。 - 将每个像素的颜色设为其左侧邻居的颜色(处理左边缘的边界以避免错误)。
随意尝试更改 gridSize、颜色计算方式以及邻居规则,创造有趣的细胞自动机行为!