
《茶葉蛋彈彈》是 PiuPiu Games 的一鍵無盡彈跳遊戲:羊毛氈巴哥犬「茶葉蛋」自動往前滾、越滾越快,玩家只能做一件事——按住壓扁蓄力,放開彈跳,跨過消波塊、紅塑膠椅、立牌和曬衣架。規則簡單到一句話講完,但它的難度曲線是我們改最多次的一款。這篇手記記錄那次「所有人都卡在 1 公里」的問題是怎麼查出來、怎麼修的,以及後來加上的浮空技和小吃擺位。
剛上線時,我們收到的回饋非常一致:「前面很順,到 1 公里左右就突然過不去。」一開始我們以為是玩家還不熟練,多玩幾次就會突破。但排行榜上的距離幾乎全部擠在 1 公里以內,連最常玩的人也一樣。
當所有人卡在同一個位置,通常不是技術問題,而是設計出了問題。我們決定不再憑感覺調,改寫一個模擬器:讓程式照著遊戲裡一模一樣的物理、障礙生成規則去跑,並且做兩種「玩家」——一種是反應完美、每次都在最佳時機起跳的機器人,另一種是時間會抖動、偶爾失手的擬人機器人。
結果很清楚:連完美機器人都活不過 1 公里,中位數只有 754 公尺。這代表那裡不是「很難」,而是「不可能」。
原本的設計是這樣的:茶葉蛋的速度一路加快,大約 436 公尺時到達速度上限;之後要繼續提高難度,就把障礙之間的距離(以像素計)越縮越小。
問題在於,跳過最大的曬衣架需要把蓄力壓滿,而壓滿需要 0.55 秒。速度封頂之後再縮距離,到了 920 公尺左右,兩個障礙之間最窄只剩 0.44 秒——連壓滿蓄力的時間都不夠。不管玩家多厲害,物理上就是跳不過去。這就是那道「數學牆」。
修法是把障礙間距的單位從「像素」改成「秒」:間距=秒數 × 當下的速度。開局時兩個障礙之間有 2.2 秒,之後每公尺縮短一點點,到大約 960 公尺時觸底,最少也保留 0.95 秒。這樣不管滾得多快,玩家永遠有足夠的時間完成一次滿蓄力。
我們另外加了兩條規則:
重調後,擬人機器人的中位數從 754 公尺提高到約 1.7 公里,最強的一局跑到大約 6 公里。我們自己在真實遊戲裡跑了三局,分別是 1.6、3.5、3.7 公里,跟模擬結果吻合。
這次的教訓後來變成整個平台的原則:所有無盡加速類遊戲,障礙間距一律用「秒 × 當前速度」設計,不用固定像素。電波衝浪和雲霄跳跳之後調難度時,都照這條規則檢查。
牆拆掉之後,換來了相反的回饋:「過了 1.5 公里就一直很平,沒有變難。」原因是速度封頂、間距也觸底之後,難度就完全靜止了。對高手來說,後面是一段很長、很無聊的重複。
我們在模擬器裡比較了幾組後期曲線,最後選了一組三管齊下的調法:
這組調法的目標是「只改後段,不動前段」。模擬結果:一般玩家的中位數從 1,707 公尺變成 1,656 公尺,幾乎沒變;高手前 10% 的距離則從 12.2 公里降到 5.3 公里,原本有機器人可以撐滿 10 分鐘,調整後一個都沒有。近乎完美的機器人中位數是 4.6 公里,而且死亡位置分散,沒有再出現某個固定的死牆。
模擬器好不好用,關鍵在那個擬人機器人像不像人。我們沒有讓它亂按,而是照攻略裡的「預壓」心法來玩:落地就先壓住,看準下一個障礙需要多少蓄力,在理想的起跳點放開。但放開的時間會帶一點隨機誤差,而且這個誤差是用「秒」來算的——滾得越快,同樣的手抖就會差出越遠的距離,這正是真人在後期會遇到的狀況。另外它有大約 2.5% 的機率出現一次「大失誤」,誤差放大四倍,模擬真人偶爾分心的那一下;它也只看得到畫面範圍內的障礙,不會預知畫面外的東西。
誤差要設多大,我們用第一輪的結果來定錨:先把「一般玩家」那組的誤差調到中位數剛好落在 1.7 公里,跟拆牆後的模擬與實測對齊;再用更小的誤差代表高手。每一局最多跑 10 分鐘,撐滿就算存活。之後每次調參數,都拿同一把尺量,結果才能互相比較。
處理「太簡單」時,我們沒有一次把三個旋鈕全轉上去,而是在模擬器裡一層一層疊,每多一個變因就重跑一次,看它改變了誰的成績:
| 方案 | 內容 | 結果 |
|---|---|---|
| C1 | 只加第二段加速:1 公里後再加速,封頂每秒 52 公尺 | 未採用 |
| C2 | C1,再把連環雙障礙的最高機率提高到 35% | 未採用 |
| C3 | C2,再把間距最低秒數壓到 0.82 秒 | 採用(現行) |
| C4 | 溫和版:封頂每秒 50 公尺、連環 30%、最低間距 0.87 秒 | 未採用 |
這樣排的好處是每一個變因的效果都看得見,不會三件事混在一起、事後說不清是哪一個讓遊戲變難。最後上線的 C3,就是上面那組「一般玩家幾乎不變、高手被壓下來、沒有固定死牆」的結果。
浮空技的門檻也照同樣的方式挑。四組候選(V1~V4)變的是:門檻每 1 公里還是每 800 公尺加一次、最高加到 40 串/9 根還是 48 串/10 根、誘餌串和跳越弧線的出現比例是 22%/25% 還是 15%/18%,以及一般小吃要不要排得更稀疏。上線的是 V4:每 800 公尺加一次、封頂 48 串/10 根、誘餌 15%、弧線 18%、一般小吃變稀疏。選它的依據同樣是模擬數字:新手第一次觸發浮空仍落在大約 460 公尺,而後段的無敵時間佔比能壓到約 18%,不會把剛調好的後期難度又稀釋掉(下一段細說)。
一鍵遊戲的風險是單調:玩家唯一的決定是「什麼時候放開」。玩家提議加一點技能變化,於是有了浮空技——同一局吃滿一定數量的魚丸串或肉骨頭,茶葉蛋會吃飽飽浮起來 4 秒,無敵飛過所有障礙。
幾個細節是為了公平:
但浮空技一加上去,模擬器馬上發現新問題:玩家有 24~28% 的時間處於無敵狀態,前面辛苦調好的後期難度被稀釋掉了。所以我們讓觸發門檻隨距離提高:從 20 串魚丸或 5 根肉骨頭起跳,每 800 公尺多 6 串、多 1 根,最高到 48 串和 10 根。這樣在前段,浮空是新手第一次大約 460 公尺就能用到的小獎勵;到了後段,它變成要刻意經營的救命符,無敵時間的佔比降到約 18%。
浮空技讓小吃變得有價值,我們就順勢讓「吃」成為一個決定。原本魚丸串只是平平地擺在路上,滾過去就吃到。現在有三種特別的擺法:
為了讓這些擺位有意義,一般小吃的出現頻率我們調低了一些,把數量移到這些「需要做選擇」的位置上。每一組擺放比例同樣先在模擬器裡跑過,確認浮空的觸發頻率和無敵時間都在預期範圍內才上線。
剛上線時,四種障礙是三角錐、紅塑膠椅、立牌和攤車,全部由程式畫出來;收集物是魚丸串和金茶葉蛋。羊毛氈風格的美術陸續到位後,我們把障礙換成更有台灣味的消波塊、曬衣架和測速照相警告牌,金茶葉蛋也換成了肉骨頭。
換圖時我們守一條規則:碰撞範圍要跟著圖形比例改,不能讓玩家看到的形狀和實際會撞到的範圍對不上。所以每換一張圖,碰撞框就重新量一次(單位是遊戲內尺寸,茶葉蛋直徑 32):
| 位置 | 上線時 | 現在 | 變化 |
|---|---|---|---|
| 矮障礙 | 三角錐 16 × 20 | 消波塊 22 × 20 | 變寬,配合扁平的外型 |
| 中障礙 | 紅塑膠椅 26 × 28 | 紅塑膠椅 28 × 27 | 貼合新圖微調 |
| 高障礙 | 立牌 18 × 46 | 測速照相牌 16 × 48 | 更瘦更高 |
| 大障礙 | 攤車 66 × 32 | 曬衣架 54 × 59 | 從又寬又矮,變成又高又寬 |
變化最大的是大障礙。攤車是一條寬而矮的長方形,考的是跳得夠遠;曬衣架將近高了一倍,考的變成高度加遠度。換的時候我們重新驗算了物理,確認它仍守住原本的定位:輕點跳不過,壓滿可以輕鬆過。細長的魚丸串在畫面上的顯示也放大了一些,讓玩家在高速下一眼認得出來。
另外,茶葉蛋的碰撞判定比畫出來的身體小一圈,大約只算八成大小,擦邊的情況會判你過。對一款一撞就結束的遊戲,寬一點的判定比較不會讓人覺得「明明沒碰到」。
還有一個問題是真人玩才發現的。大跳落地時,茶葉蛋會可愛地小彈一下,結果玩家在空中先壓住準備下一跳,落地時這個按壓卻被吞掉了,必須放開重按。後期速度快,這一下延遲就足以撞牆。
修正後,遊戲會記住「手指是不是壓著」:空中就先壓著,落地時直接進入蓄力;小回彈只在沒壓著的時候才出現,變成純裝飾。這也讓攻略裡最重要的那條心法「預壓,不要現壓」真正可行。
另外我們也處理了手機上的效能:背景改成先畫好再重複使用,並限制高解析螢幕的放大倍率,手機上的畫面更新率從每秒 18 張提高到 59 張。對一款靠時機決勝負的遊戲來說,畫面流暢就是公平的一部分。
壓滿蓄力只有 0.55 秒,眼睛要盯著前方的障礙,很難同時分神看蓄力狀態。所以蓄力時會有一個持續音,音高隨蓄力往上爬,壓滿時另有一聲提示——熟練之後,用耳朵就能判斷壓了幾成。這跟拆數學牆其實是同一件事的兩面:一個保證時間夠用,一個讓玩家知道自己用了多少時間。後來我們又在茶葉蛋身邊加了蓄力環,壓滿會亮起金光,讓關掉聲音玩的人也看得到。
也有幾件事,我們刻意讓它跟難度完全脫鉤:
茶葉蛋彈彈教會我們的事情是:玩家說「好難」的時候,要先分清楚是「難」還是「不可能」。難可以靠練習突破,不可能只會讓人放棄。現在我們調任何無盡遊戲的難度,第一步都是先讓完美機器人跑一遍,確認它沒有撞上任何一道牆,再讓擬人機器人告訴我們一般玩家大概會停在哪裡。
讀完幕後,實際滾一局
免下載、免安裝,手機與電腦瀏覽器直接玩
▶立即免費玩茶葉蛋彈彈