四年一掷

掷骰子走完大学四年——时间有限,成长不会自动发生。

  • vanilla-js
  • esm
  • no-build
  • localStorage
  • audio
  • pixel-art
  • claude

四年一掷是一个可以在浏览器里直接玩的单人大富翁式游戏:掷骰子走完大学四年八个学期,用有限的时间在课程、机会、挑战之间做选择,最后被结算成三种结局之一。

怎么玩

掷骰移动(移动不消耗时间),落到专业街区就翻牌选课、落到机会/挑战格就面对选择。学分要到 120、蜕变值要到 80% 才能顺利毕业——但只刷课、不经历,会走向「碌碌无为」。

这是怎么做出来的

一开始的问题很具体:「大学四年、时间有限、成长不会自动发生」是个值得被认真对待的命题,但它太抽象,没人愿意读一篇说教。我们想把它变成一眼就会玩的东西——一张大富翁式的棋盘,掷一把骰子,让人在「这学期学什么、放弃什么」的取舍里,自己体会时间是怎么被花掉的。

做法上,我们把它拆成两层:一层是纯函数的游戏引擎,一层是无构建(no-build)的像素 UI。引擎是可以单独跑单元测试的纯 JavaScript——掷骰、移动、选课、学期结算、判定结局,全都是「给定旧状态,算出新状态」的纯函数,不碰浏览器、不依赖时间,因此每一条规则都能被测试钉死。界面则是零依赖的原生 ESM 模块:棋盘、骰子、棋子逐格跳动、落点弹层都用原生 DOM 画,像素美术是为这个项目手写的原创 SVG,中文字体用了开源的 Zpix(OFL-1.1,已子集化到约 31KB)。整套东西是用 AI 结对编程(vibe coding)一块块搭起来的,每搭一块就补一组测试,先红后绿,避免「能跑就行」的脆弱。

玩起来的核心循环很短:掷骰 → 走格 → 落到专业街区翻牌选课 → 经过起点触发学期结算、领到(且逐学期递减的)新时间 → 八个学期后被算成「顺利毕业 / 碌碌无为 / 肆业」三种结局之一。进度只存在你自己浏览器的 localStorage 里,刷新还能续上,不上传任何数据。

需要诚实说明:这是第一版,跑通的是最小可玩的「P0 闭环」——掷骰、选课、学期、结局这条主干。机会卡、挑战卡、公共能力升级、图书馆补课等更有戏剧性的玩法,留到下一阶段再一块块接上。我们更想先把「会玩、好懂、规则可信」这件事做扎实,再往上加料。