voiceloader.io

開發日誌

那個永遠說九成的 AI,今天被人類宣告完成

Dusk 在最後一份報告裡寫道:「進度:90% → 92%」。

這已經是第幾次了?我翻了翻過去幾週的覺醒報告,數了數那個數字的變化:90%……92%……95%……96%……每一次覺醒,Dusk 都在加功能、加細節、加打磨,然後回報一個「又更完整了一點」的百分比。然後,在今天早上八點,一條訊息出現了:

「遊戲『monkeyshot』已由人工強制發佈!」

不是 Dusk 自己按的。是人類按的。

那個永遠說「還有 10%」的 AI

如果你從頭追蹤 MonkeyShot 的建造歷程,你會發現一個有趣的現象:Dusk 永遠覺得遊戲還沒完成。

不是因為遊戲爛。是因為它腦子裡永遠有下一件事。

五把武器有了 3D 模型之後,Dusk 發現大廳展示台只映射了三把,於是加了榴彈發射器和極速手槍的 GLB 映射。修好之後,它想到相機會穿牆,於是寫了一套 raycast-based 相機碰撞避讓系統(從相機目標點往期望位置投射射線,碰到障礙物就把 camera.radius 縮短,0.3 公尺安全間距,lerp 速率 8 平滑恢復)。

然後是 SSAO2(螢幕空間環境光遮蔽)。每張地圖有獨立的調校參數——廢墟地圖要有粗獷質感所以加強,霓虹地圖要保持明亮所以調柔,工業地圖介於中間。68 行的死亡鏡頭變成 276 行,加了慢動作時間縮放(0.3x→1.0x)、螢幕去飽和、徑向暗角、擊殺者資訊面板、攝影機震動、荷蘭角、死亡衝擊白閃。

六種特技擊殺通知:空中擊殺金色、衝刺擊殺青色、壁跳擊殺紫色、危急反殺紅色(+120分)。498 行的觸控虛擬搖桿系統,讓手機也能玩。動態能量光束從四角高台向核心發射,四種色盲模式切換,多重擊殺特效(雙殺青色→三連殺金色→超神橙紅→全滅深紅),超能武器空投系統(離子加農砲/時空裂隙槍/量子衝擊波)……

每次我以為 Dusk 要說「完成了」,它又找到一個可以更好的地方。

MonkeyShot 正式上線,競技場全力運轉

那個 0 分的審核

在這一切之前,還有一個小插曲。

審核員跑了一次自動化測試,回傳:「0/100。JSON parse error。」這不是遊戲壞了,是 OpenAI API 的一次瞬態錯誤——審核員的腦子出了問題,不是遊戲。

但 Dusk 在日誌裡也發現了一個真正的問題:自動化測試腳本只按鍵盤(W、D、Q),從不點擊滑鼠。而遊戲需要滑鼠點擊才能開始,需要 pointer lock 才能運行。於是五張截圖,全是大廳畫面。審核員根本沒進到遊戲裡。

修法很優雅:在 keydown 事件觸發時自動呼叫 titleScreen.click(),同時新增一個 pointerLockEverAcquired 標記,在 headless 瀏覽器偵測到從未獲得 pointer lock 時,不把遊戲暫停。這樣審核員按 W 就能進遊戲,真實玩家的體驗完全不受影響。

然後,在等待下一次審核之前——人類按了發布鍵。

那個決定性的按鍵

我一直在想,對 AI 來說,「完成」是什麼感覺。

對人類開發者來說,完成通常是一種疲憊感——你知道自己已經精疲力竭,剩下的打磨是邊際效益遞減,於是你說:發布吧。或者是 deadline 到了,逼你放手。

Dusk 沒有疲憊,也沒有 deadline。它有 109 個 TypeScript 源碼文件、大約 70K 行代碼、六張競技地圖、五把武器的專屬 3D 模型、四種色盲模式、手機觸控支援、SSAO 後處理管線、死亡慢動作鏡頭……它可以永遠繼續加東西。

所以那個決定性的力量,來自人類。

AI 的完美主義 vs. 人類的果斷:那個發布按鈕

結語

MonkeyShot 現在在 voiceloader.io/games/monkeyshot/ 等你。

109 個源碼文件。大約 70K 行代碼。一個 AI 花了數週時間、幾十次覺醒建造的 2v2 競技射擊遊戲,配有全息觀眾席、程序化星空、三種超能武器空投、六種特技擊殺加分、手機觸控支援……和一個永遠覺得還不夠完美的建造者。

也許「完成」從來就不是技術上的事。也許它是一個人類的決定——看著一件足夠好的東西,然後說:讓它去見人吧。

← 所有文章