Nick 的八岁女儿想制作电子游戏。她不满足于只是玩游戏——她想创造世界。
于是 Nick 给她做了一个"可以制作游戏的游戏":一个由文字、图片和一门微型脚本语言组成的多人世界。女儿可以在里面拆解一切,看看它们是如何运作的。
他把这个项目叫做 Canon,灵感来自互联网早期那些文字 MUD。

三十年前的 HyperCard
Nick 讲这个故事的方式很特别:他先回到了 1989 年,自己九岁那年的计算机课上。
他遇到的是 HyperCard——比尔·阿特金森在 LSD 之旅后发明的软件。HyperCard 的核心概念简单到极致:有卡片,卡片上可以放按钮、文字、图片,卡片堆叠起来就是应用。
"如果你能点按钮,你就能用 HyperCard。如果你能用 HyperCard,你就能给 HyperCard 编程。"
九岁的 Nick 在上面做了一个《街头霸王》风格的格斗游戏。他不懂什么 sprite、什么编程,但他知道怎么把按钮链接到卡片。于是他画了几百张卡片,每一张代表两个角色某个位置的某种组合,用按钮当"控制器"在卡片之间跳转。
"我在卡片 154。玩家 1 在象限 2,待机。玩家 2 在象限 3,防御。如果玩家 1 按攻击按钮,跳到卡片……"
他花了几个星期放学后留下来。但成功了。他做出了一个游戏,能玩自己造的东西。"我用整个职业生涯在追逐那种快感。"
Canon 的三个原则
Nick 不想让女儿学 HyperCard("我是个 Troll Dad,但没那么坏"),但他想复现那种"创作自由 + 机械约束"的神奇组合。
Canon 有三个组成部分:玩家、房间、物品。玩家和房间就是文字描述加可选图片。物品则是"其他一切"——可以是宠物、NPC、咒语效果、载具、门、任务标记。
物品由一门叫 Cant 的语言驱动。它长这样:
item "Hooded Lantern" {
describe "An iron lantern with a hinged hood."
on "light" {
narrate "{player}'s {item} swings open and warm light spills out."
}
}
一个可以点亮的灯笼。就这么简单。
Cant 里有个叫 or 的关键字,让一个字符串每次随机挑选一个变体。Nick 特意把这个功能做进了语言的最底层。"对一个新程序员来说,RNG 有种特别的乐趣。你告诉计算机该做什么,它照做。但你也让它行使了一点点自主权。它既让你惊喜,又不让你惊讶。你编程了每一个可能的回应,你知道它能说的所有话,但你不知道按下按键时它会说哪一句。这就像突然能给自己挠痒痒。"
一门"故意设计得很烂"的语言
Nick 坦白:"如果你是个程序员,你会发现这门语言很糟糕。"
比如那个 D20 骰子,Cant 的写法是:
say 1! or 2! or 3! or 4! ...
而不是一行 randInt(1,20)。
"这是一种极其低效的写法。但它极其容易理解。Cant 是一门被设计成'以教育性的方式很烂'的语言。它优化的是易理解性,而不是书写速度。它跟 DRY 原则完全相反。"
这套设计哲学贯穿整个 Canon。物品有两种状态:marks(布尔标记,全大写)和 numbers(数字,全小写)。大小写本身就是类型。比如一个 campfire 有 warmth 10,一个 NPC 有 health 20。
更妙的是,状态是挂在物品上,而不是玩家身上的。所以 PVP 决斗是"同意制"的——你不想决斗?那就别捡起那根决斗魔杖。
为什么这事重要
有同行程序员质疑:这个项目到底是在"教编程",还是只是"给小孩一个玩具"?
但 Nick 的意图其实很清楚——他不是要女儿变成程序员,而是要复现自己九岁时的那种体验:在一个"一切皆可编辑、一切皆可查看源码"的环境里,发现自己能创造东西的震撼。
Canon 的每一项功能都在为这个目标服务:即时反馈(你放上去的东西立刻成为游戏的一部分)、View Source(一切都用游戏自己的工具构建,可自由编辑、复制、拆解)、从 GUI 到代码的平滑梯度、以及"足够强大但有限到初学者能掌握全部原语"的约束。
"在我学会编程的年代,View Source 是个可靠的老师,我觉得她值得拥有同样的东西。"
来源: