四年一擲

擲骰子走完大學四年——時間有限,成長不會自動發生。

  • 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 閉環」——擲骰、選課、學期、結局這條主幹。機會卡、挑戰卡、公共能力升級、圖書館補課等更有戲劇性的玩法,留到下一階段再一塊塊接上。我們更想先把「會玩、好懂、規則可信」這件事做紮實,再往上加料。