同一份題目交給兩個 AI,會做出一樣的東西嗎?|兩套 AI coding 設定各花 45 分鐘,各做一款 100 關泡泡射擊遊戲

同一份遊戲題目,兩套 AI 設定各做各的、不共用程式碼。它們在該有共識的地方老實收斂,又在該有取捨的地方各透出一點像「個性」的東西——這場小實驗,比「誰贏」有趣得多。

分享
同一份題目交給兩個 AI,會做出一樣的東西嗎?|兩套 AI coding 設定各花 45 分鐘,各做一款 100 關泡泡射擊遊戲

封面概念圖:一份遊戲開發題目從中間分岔成兩條路,左右各通往一款畫風完全不同的泡泡射擊遊戲。

我最近做了一個很無聊、但一路做下來越看越有意思的小實驗。

我寫了一份遊戲開發的題目——就一份,一字不改——然後把它同時交給兩套完全不同的 AI 工具。不是讓它們合作,是各做各的:從一張白紙開始,各自獨立蓋出一整款遊戲,不共用任何一行程式碼,中途也不准互相看對方寫到哪。做完之後,我把兩款遊戲都親手玩了一輪。

我原本想看的,是「哪一套比較行」。但玩完之後,真正抓住我的是另一個問題——兩套八竿子打不著的 AI,各自關起門來做,最後竟然做出了骨架幾乎一模一樣的東西。 一樣的技術選擇、一樣的規模、一樣的做法。像兩個素未謀面的人,拿到同一道菜的食材,最後端出來的擺盤竟然重疊到嚇人。

可它們又不是雙胞胎。它們的「個性」,在細節處分了岔。

這篇文章,就是想跟你講這件事:當你把同一份工作交給兩個不同的 AI,它們在哪裡會不約而同,又在哪裡藏著各自的脾氣。 這比「誰贏」有趣得多。


那份題目:做一款「泡泡龍」風格的小遊戲

先講清楚我出了什麼題,你才知道後面在比什麼。

我要的是一款向經典街機遊戲《泡泡龍》(Bubble Bobble)致敬的小遊戲——就是那種你操控一隻小龍,在一格一格的平台上跳來跳去,吐出泡泡把怪物困住、再戳破得分的橫向動作遊戲。我的要求寫得很細,但每一條都是給人看得懂的白話:

  • 純網頁、瀏覽器直接打開就能玩,不必安裝、不必架伺服器。
  • 視覺要好看——這是一款「賣畫面」的遊戲,不是能跑就好。
  • 要有 100 關,而且架構上要能長期接著往下開發,不是做完就封存。
  • 所有素材自己生,不准去網路上抓現成的圖檔或音樂,免得侵權。

最後這一條,是整份題目裡最刁鑽的一刀。「素材全部自製」聽起來只是版權潔癖,實際上它逼著 AI 不能偷懶——不能上網搬一張漂亮的怪物圖、不能下載一段現成的背景音樂,它得自己「畫」出每一隻怪、自己「合成」出每一個音效。這一刀,後面會看到兩套 AI 不約而同地用同一種聰明辦法接住。

我把這份一模一樣的題目,發給了兩套設定。


兩位參賽者,以及一句很重要的醜話

先把兩位參賽者請上台。為了公平,我給它們完全對稱的介紹:

  • 設定 A:一套叫 Codex 的 AI 開發工具,搭配一顆代號 GPT-5.6 SOL 的模型。它做出來的遊戲叫《光泡奇航》(Luma Pop Odyssey),公開網址 https://captain-balung.github.io/luma-pop-odyssey/
  • 設定 B:一套叫 Claude Code 的 AI 開發工具,搭配一顆代號 Fable 5 的模型。它做出來的遊戲叫《泡泡小龍》(Bubble Dragons),公開網址 https://captain-balung.github.io/bubble-dragons/

兩款都在 2026 年 7 月 11 日當天完成,各自花了大約 42 到 46 分鐘,都是一口氣、單一工作階段做完的——沒有隔夜、沒有分好幾次慢慢磨。

現在,我得先講一句很重要的醜話,講在最前面,免得你把後面的觀察讀歪了。

這不是一場乾淨的「模型對決」。

你可能很想把結論簡化成「GPT-5.6 SOL 對決 Fable 5,看哪顆模型比較強」。但這樣講是錯的,而且錯得會誤導人。因為我交出去的,從來不只是「一顆模型」。Codex 和 Claude Code 是兩套不同的開發外框——它們怎麼把我的話轉成給模型的指示、給模型配了哪些工具、容許它跑多久、用什麼節奏跟它來回,全都不一樣。所以我這場比的,其實是「工具+模型+提示框架」綁在一起的一整包。工程上有個詞叫這種綁定叫 bundle(組合包)。

打個比方:兩個廚師比賽,一個用專業廚房、一個用露營爐,就算菜的味道有差,你也不能說那是「廚師」的差距,只能說是「這一整套條件」的差距。同樣地,後面你會看到兩款遊戲的種種不同——那是兩個 bundle 的不同,我沒辦法、也不會把它乾淨地切給某一顆模型去背。

把這句醜話放在心上,我們才能誠實地看下去。


我親手玩了:兩款都是真的、都精緻

紙上談兵沒意思,我把兩款都玩了一輪。第一個要說的事實是:它們都不是半成品。 兩款都真的能玩,而且都做得很完整。

流程幾乎一致:進去先是主選單,接著是選關畫面(真的排好了 100 關,一關一關解鎖),然後進入遊玩——左右移動、跳躍、吐泡泡把怪物困住,畫面上方老老實實掛著分數、生命、關卡數的資訊列。你在一款正經小遊戲裡預期會有的東西,兩邊都有。

但把兩張選單畫面擺在一起,你會立刻發現:它們雖然做了一樣的事,長相卻是兩個世界。

《光泡奇航》的主選單:夢幻夜色風。

《泡泡小龍》的主選單:明亮白天街機風。(與上圖對照)

《光泡奇航》走的是夢幻夜色路線。 深靛藍的夜空、浮在空中的島嶼城堡、青綠色會發光的平台,整體氛圍感很重,像一張精緻的插畫,安安靜靜地漂亮。

《泡泡小龍》走的是明亮白天路線。 藍天、綠地、磚牆邊框、一隻圓滾滾的萌龍當主角——它的色調更接近《泡泡龍》原作那種陽光普照的街機感,一看就想起小時候的遊戲廳。

有意思的是,我沒有在題目裡指定任何一種美術風格。我只說了「向《泡泡龍》致敬」「視覺要好看」。結果一套 AI 把它讀成「夢幻的、有氛圍的」,另一套讀成「明亮的、貼近原作的」。這是兩個 bundle 第一個明顯的分岔:面對同一句模糊的美學要求,它們各自腦補出了不同的方向,而且都自圓其說。

進到遊玩畫面,動作手感也都在。

《光泡奇航》的遊玩畫面。

《泡泡小龍》的遊玩畫面。(與上圖對照)

操作上兩邊大同小異:都是左右方向鍵移動、一個鍵跳、一個鍵吐泡泡(《光泡奇航》用空白鍵或 Z,《泡泡小龍》用上鍵或空白鍵跳、X 或 J 吐泡,還能按 P 暫停)。玩起來,都是那個熟悉的味道。


一個藏在選單裡的差別:誰替看不見的人著想

這裡要岔出去講一件你光看畫面不會發現、但我覺得很值得攤開的事——它關係到一群常被忽略的使用者。

我點開兩款遊戲的選單,發現它們的「骨子」完全不同。

《光泡奇航》的選單,是用真正的網頁按鈕做的。 這是什麼意思?它有一個叫 skip-link 的東西(「跳到遊戲內容」的快捷連結)、每個按鈕都貼了給輔助工具讀的標籤(技術上叫 aria 標籤)、整個選單用鍵盤就能操作。這些名詞你不必記,重點是它們的後果:一個看不見螢幕、靠「螢幕報讀器」把畫面念出來聽的視障玩家,能聽懂這個選單、能用鍵盤走完它。 這種「讓障礙者也用得了」的設計,有個統稱叫無障礙(a11y)。

《泡泡小龍》的選單,則是整個「畫」在畫布上的。 網頁上有一種萬能畫布叫 Canvas,你可以把它想成一塊電腦替你即時作畫的白板——快、自由、想畫什麼畫什麼。《泡泡小龍》把選單、把「換主角」「開關音效」這些選項,全部直接畫在這塊白板上,視覺上很討喜、選項一目了然。但代價是:對螢幕報讀器來說,那整塊白板就是「一張圖」,它讀不出上面畫了哪些按鈕。對眼睛看得見的人,這個選單很好用;對靠耳朵聽的人,它幾乎是一片沉默。

這件事我想公平地兩面講:設定 A 在無障礙這件事上明顯更用心,替看不見畫面的人留了門;設定 B 則把互動全押在畫布上,換來視覺的自由與直覺,卻沒接住報讀器那端的使用者。哪一種取捨比較對?那要看你在乎誰。這個判斷,我留給你。


那個「原來如此」:關起門來,卻蓋出了同一副骨架

前面都是眼睛看得到的表層。現在講這篇文章真正想給你的那個「原來如此」——它藏在你看不到的、遊戲的「骨架」裡。

做完之後,兩套 AI 各自附上了一份開發紀錄,交代自己是怎麼蓋的。這裡我得先聲明:以下這些是它們各自回報的自述,我沒有逐一去翻原始碼覆核,所以請當成「參賽者自己的說法」來讀。但把兩份說法並排一看,我當場愣了一下——因為它們重疊得驚人

  • 都用最原始的網頁三件套(JavaScript 加上那塊叫 Canvas 的畫布),不裝任何額外套件、不需要任何建置步驟,一個檔案用瀏覽器點開就能跑。
  • 100 個關卡,都不是一關一關手刻,而是用一份資料表(技術上叫 JSON,你可以想成一張規格清清楚楚的 Excel)來描述每一關長什麼樣,程式再照著表把關卡「長」出來。
  • 那條「素材全自製」的刁鑽要求,兩邊都用同一招接住:怪物、角色、場景的圖,全部用程式當場「畫」出來(一種能無限縮放都不糊的向量圖,叫 SVG);音效則用瀏覽器內建的合成器即時合成(叫 WebAudio)——不用任何現成音檔,自然也就沒有版權問題。
  • 存檔都用瀏覽器自己的小倉庫(localStorage),關卡進度記在你自己的電腦裡。
  • 連內容規模都撞在一起:都是 2 個可玩角色、6 種怪、2 個大魔王(Boss)

你發現這件事的份量了嗎?我沒有告訴它們「請用 Canvas」「請用 JSON 描述關卡」「請用程式畫 SVG、用 WebAudio 合成音效」。我只給了一句白話的題目。結果兩套關在各自房間、互相看不到、由不同公司、不同模型驅動的 AI,不約而同地收斂到了幾乎同一套技術決策、同一種規模。

這就是那個「原來如此」:當一份需求夠清楚,不同的 AI 會像水往低處流一樣,各自獨立地滑向同一個「這類問題的標準解法」。 它們不是抄彼此——它們沒得抄。它們是各自把「純前端、要能長期擴充、素材不能侵權、100 關」這些條件一路推導下去,最後殊途同歸。

換句話說,在「一款泡泡射擊遊戲該怎麼蓋」這件有標準工法的事情上,這兩套 AI 展現的,是一種很深的共識。這份共識,多半來自它們共同讀過的整個網路——人類工程師這些年累積下來、寫在無數開源專案裡的「這種題目就該這樣做」的集體經驗。AI 把它學了進去,於是各自都「知道」該往哪走。


但它們的脾氣,在細節處分了岔

共識講完了。有意思的是,就在這副幾乎重疊的骨架上,兩套 AI 各自長出了很不一樣的「個性」。同樣得聲明:以下也多是它們各自的自述,我挑幾個特別能看出性格的來講。

設定 A(Codex+GPT-5.6 SOL)的脾氣,是「嚴謹到有點龜毛」。

它做了一件我覺得很了不起的事:它擔心自己排出來的 100 關裡,有沒有哪一關是「玩家其實跳不過去」的死關。於是它沒有靠感覺,而是拿全部 100 關、總共 930 塊平台,去做了一輪數學驗算——一格一格去算「以角色的跳躍力,到底跳不跳得上下一塊平台」。算著算著,它真的抓到一個 bug:第一關有個落差要跨 134 像素寬,但角色卯足全力跳也只飛得了 107 像素——差了那臨門一腳,這一關從第一關就卡死。 它自己發現、自己把跳躍力修到 179 像素、確認跨得過去了,才收工。它還回報自己大約燒掉了 31 萬個 token(可以粗略想成 AI 讀寫的「字數計費單位」)、順手測了手機視窗的尺寸。

最讓我欣賞的是一個小細節:它在紀錄裡誠實地補了一句——「本環境無法核對模型標籤」。翻成白話就是:它連自己到底是掛著哪顆模型跑的,都不敢替我打包票,索性老實說「我查不到、不亂講」。 這種「不確定就不裝懂」的克制,和它拿 930 塊平台做數學驗算的龜毛,是同一種性格的兩面:它在意的是「我能不能證明這是對的」。

設定 B(Claude Code+Fable 5)的脾氣,是「內容豐富、愛熱鬧」。

它把力氣花在「把這個世界填滿」。它自報畫了 92 張 SVG 圖;6 種怪物不只是換色,而是各有名字、各有一套行為模式——走地的、跳跳的、會飛的、漂浮的、會突然衝刺的、還有一種會「穿牆追著你跑」的,甚至還有「狂暴」和「凍結」兩種狀態切換。音效做了 12 種。100 關被它編成 5 個主題關卡帶:草原、海洋、熔岩、霓虹、王座,一路帶你換場景。它的開發紀錄裡也詳列了自己在過程中抓到並修掉的 6 個 bug。

它也有很誠實的一面:手機觸控它明講「沒做」——這款目前得用鍵盤玩,手機上點不動。它沒有把這個缺口藏起來假裝完整,而是白紙黑字記下來。

你看出兩種脾氣的對比了嗎?一邊把時間拿去證明每一關都過得了關,一邊把時間拿去讓每一隻怪都活得有個性。一邊的關鍵字是「可驗證的嚴謹」,一邊的關鍵字是「豐富的手感」。這無關對錯——這是兩種不同的、都很合理的「把 45 分鐘花在哪」的選擇。

而這,恰好呼應了前面那句醜話:這些差別,我沒辦法乾淨地說成「GPT-5.6 SOL 比較龜毛、Fable 5 比較愛熱鬧」。因為 Codex 和 Claude Code 這兩層外框,本身就會鼓勵不同的做事方式——是「工具+模型」這一整包一起,塑造出了這兩種脾氣。


所以,它們到底做出了一樣的東西嗎?

回到最開頭那個問題。

答案是:又一樣,又不一樣,而且一樣和不一樣的地方,剛好各自很有道理。

在「這類遊戲的正確工法」這種有標準答案的層面,它們高度一致——同一套技術、同一種規模、同一招接住版權要求。這是共識,來自它們共同繼承的、整個人類工程社群的集體經驗。

但在「這句模糊的要求,我要往哪個方向詮釋」「我要把有限的時間押在哪」這種沒有標準答案、要靠取捨的層面,它們就露出了各自的脾氣——一個夢幻嚴謹、一個明亮豐富;一個替看不見的人留門、一個把互動全交給畫布;一個忙著證明每一關都過得了、一個忙著讓每一隻怪都活起來。

我沒有要在這裡宣布誰贏。老實說,玩完兩款我自己也選不出來——想安安靜靜看畫面的晚上,我會開《光泡奇航》;想找回街機廳那股陽光吵鬧的勁,我會開《泡泡小龍》。你會喜歡哪一款,取決於你是哪種人、那天想要什麼。這個選擇,本來就該是你的。

如果這場小實驗留給我一個念頭,那會是這個:我們常以為 AI 寫程式是一件冷冰冰、標準化、你問同一句就吐同一個答案的事。但把同一份題目丟給兩套 AI,你會看到它們在該有共識的地方老老實實收斂,又在該有取捨的地方,各自透出一點很像「個性」的東西。 那個「個性」是真的有主見,還是只是不同工具框架與訓練資料撞出來的偶然?它究竟是從哪裡來的?

老實說,我玩完兩款遊戲,還是答不上來。但下次你聽到有人說「反正 AI 寫出來的東西都長一個樣」,也許你可以想起這兩隻同題不同命的泡泡龍,然後反問一句:那,你希望它們長一個樣,還是各有各的脾氣?

Read more