In English — I described a penguin in a red scarf running under the northern lights. Claude Code built it as a pseudo-3D endless runner with zero assets — every pixel and every note generated at runtime — and wrote 51 automated checks to grade its own work. All green. Then I played it for three minutes: it was brutally unfair, and the penguin spun in place like a broken top. What followed was the best part of the project: the AI built a robot that plays the game with human reaction speed to prove the difficulty was mathematically broken (median survival: 3.1 seconds), found three root causes, and turned my complaints into a fairness test suite. The bug my three minutes of play caught? Its 51 tests had only ever tested a fresh run — never "play again after dying."
一句話開場 | It started with one sentence
我不會寫程式。我會的是描述我想要的東西。
這次我想要的是:一隻圍紅圍巾的企鵝,在極光下的冰原上無限奔跑——不是橫向捲軸,是那種老街機的「往畫面深處跑」的追逐視角。然後我加了一條看起來很無理的限制:不准用任何圖片、音效檔、字型、框架。每一個像素都要用程式畫出來,每一個音符都要即時合成。
幾個小時後它給了我一個遊戲:極光是四條會呼吸的緞帶、冰面上有極光的倒影、企鵝會眨眼會回頭看鏡頭,配樂隨著跑速疊加聲部。它還附了 51 項自動化測試的成績單,全部綠燈,然後部署上線。
看起來完美。然後我按下了 PLAY。
「太難了」不是感覺,是三個數學錯誤 | "Too hard" was three math bugs
我的回報很簡單:「很容易撞到冰山,也跳不過,很快就掛了,難度太高。」
它沒有直接去調難度參數。它做了一件我沒想過的事:寫了一個機器人來玩自己的遊戲——決策永遠正確,但刻意加上 0.3 秒的人類反應延遲。結果一翻兩瞪眼:
一個每次都做出正確決定的機器人,中位數只能活 66 公尺、3.1 秒。
這不是「難」,是壞掉了。接著它去量測生成器,挖出三個根因:
- 關卡會互相重疊。 生成器只記得「間隔多遠放下一組」,忘了「這一組自己有多長」,導致 14.9% 的關卡直接生成在上一組裡面——冰山長在安全通道的正中央。模擬四十場裡有七個位置是數學上無解的:三條車道全被擋住,而且需要的操作各不相同。
- 速度曲線前段暴衝。 250 公尺就達到最高速的七成,玩家還沒學會操作,車速已經頂天。
- 思考時間低於人類極限。 障礙物之間的反應窗中位數只有 0.49 秒——人類光是「看到」就需要 0.25 秒。
修完之後同一隻機器人再跑:16 場全部跑滿 1500 公尺。「難度」這件事從一種感覺,變成了一組可以測量、可以驗證、改壞了會亮紅燈的數字。這是整個專案我最喜歡的一刻。

轉圈的企鵝 | The spinning penguin
第二個回報更奇怪:「為什麼一開始企鵝會一直轉圈?」
原因找到的時候我笑出來。企鵝死掉時會進入「被擊中」狀態開始旋轉;重新開始時,程式把位置、速度、旋轉量全部歸零——唯獨忘了把「狀態」本身改回來。所以死過一次之後,每一場都從「被擊中」狀態開始,旋轉量從零重新累積,企鵝就以每分鐘 53 轉原地打轉,直到你按下跳躍才停。
它的 51 項測試為什麼沒抓到?因為每一項測試都只測「全新的一局」,沒有一項測過「死掉之後再玩一次」。我三分鐘的真實遊玩,勝過它整套自動化測試——不是因為我厲害,而是因為我做了它沒想到要做的事:像個真正的玩家一樣連續玩。
這個 bug 現在變成了它的回歸測試之一。AI 犯的錯不可怕,可怕的是同一個錯犯兩次——而它確實沒有再犯。
從背後看得到表情的企鵝 | A face you can see from behind
追逐視角有個先天矛盾:鏡頭永遠看著主角的背影,但角色的靈魂在臉上。
它的解法讓我印象很深:企鵝的臉和白肚子不是平面貼圖,而是「貼在橢球體上的貼花」,由一個轉頭角度控制。所以企鵝是真的會轉頭——跑的時候左右掃視冰面(我們看到側臉、一隻眼睛、完整的表情),撿到金魚時回頭對鏡頭笑,快撞上時皺眉。連衣櫃裡的「帝王企鵝」皮膚,金色耳斑都特意放在後腦勺——因為那才是追逐鏡頭看得到的地方。

輸了也在前進 | Losing is progress now
第一版上線後我把三件事一次許願完:完整攻略、開發故事(就是這篇)、還有九個進階功能。第二版的核心是把「魚」從分數變成貨幣:
- 死掉時整場收集的魚全數存進銀行——輸也是進度
- 銀行的魚拿來買圍巾、羽色、粒子拖尾(全部程序化配色,依然零素材)
- 或者在死亡瞬間花 40 條魚原地復活——死亡從「整場歸零」變成「一個決定」
- 每天全世界玩家跑同一條賽道(賽道由日期的種子決定,驗證過在我電腦和線上跑出的障礙序列逐字節相同)
- 天氣會變:極光夜、暴風雪、月光靜夜、極光風暴輪替。我最喜歡的細節是公平性寫在資料層:暴風雪降低能見度,就必須付出「障礙間距放寬 15%」的補償,改渲染程式繞不過這條規則

宣傳片的配樂是遊戲自己寫的 | The trailer's music is the game's own
最後我想要一支能放上社群的宣傳影片。錄影工具抓不到聲音,一般的做法是配一段罐頭音樂——但這個專案的原則是零外部素材,宣傳片憑什麼例外?
所以它把遊戲的合成器配方(同樣的和弦進行、同樣的樂器、同樣的程序化混響)用離線音訊引擎重新渲染成一段 84 秒、隨影片推進逐漸疊加聲部的配樂,再合進影片。連宣傳片的音樂都是遊戲自己的程式生成的。
你可以玩玩看 | Go play it
- 🎬 宣傳影片:YouTube——配樂就是上面說的那段程式生成音樂
- 🎮 遊戲本體:game-polar-aurora.tingyudeco.com(手機電腦都能玩,可安裝、離線可玩)
- 📖 完全攻略:操作、圖鑑與進階技巧——圖鑑裡的插圖是遊戲程式碼即時畫的,永遠不會過時
- 💾 原始碼:GitHub,約八千行,含完整的除錯歷程 commit
如果你也在用 AI 做東西,這個專案教我的一課是:AI 的測試會告訴你「機器做的事都對」,只有真人的手會告訴你「玩起來不對」。 兩者都不能少——而最好的狀態,是你玩出來的每一個「不對」,最後都變成它的自動化測試。




