「All Pain, No Gain」這場比賽辦得很成功,大家玩得很開心。但比賽結束後,那種當場 PK、立刻分勝負的刺激就沒了——因為它需要主辦、需要排賽程、需要一群人到齊。
PK 對戰模式把這份刺激變成隨時都能開的房間。兩三個朋友相約去岩館,當天就能開一場淘汰賽,App 全自動幫你排賽程、計時、記分、判晉級。不用主辦、不用紙筆、不用吵架,爬完當場就知道誰是今天的王。
⚡️
零門檻開賽
一個人開房間,揪到 2 人就能打。不用官方活動。
🔥
當場見真章
限時、不暫停、單場淘汰,每一場都是硬碰硬。
🎥
接上既有錄影
每場攀登自動關聯影片,分數有爭議就調出來看。
🔁
玩得快又夠
6 人約三輪打完,每個人至少都爬到兩場。
以「週六下午,6 個朋友在千手抱石」為例,走一遍從開房到分出冠軍的全程。
/ 房主 Bryan /
1
首頁 → 對戰模式
開一間房
Bryan 點「開房間」,選岩館「千手抱石」,房間出現一組 4 碼代碼與 QR Code。
2
房間 · 設定
設定本場規則
共用計時設 6 分鐘,計分模式選「需控制才得分」。第一版單機——開房的 Bryan 就是裁判,用他這支手機操作。
3
房間 · 路線
標定本場路線
挑出 8 條路線(橘、粉紅、黃…),每條拍張照,用標點工具在照片上依動線點出把手 1、2、3…,設定完攀分數。標好就成為這條線的計分依據。
/ 夥伴們 /
4
加入房間
掃碼進場
另外 5 人掃 QR 或輸入代碼進房,各自確認顯示名稱。湊滿 6 人,房主按「開始」。
5
對戰表
自動排賽程
App 隨機配對,產生對戰表:第一輪 3 場 PK,並指派各場路線。所有人看到自己第幾場、對手是誰。
/ 比賽進行 /
6
PK 計時 · 共用 6 分鐘
抽籤、輪流開爬
App 播放抽籤動畫隨機決定先攻——跑馬燈在兩人名字間輪轉、漸慢,最後停在先攻者,像遊戲一樣。按「開始」啟動 6 分鐘共用倒數,中途不暫停。A 先上,爬到一半掉下來,裁判記下他控制到的最高點,換 B。兩人一人一次來回交替,攀登全程同步錄影。
7
PK 計時 · 倒數中
拚到最後一秒
時間快到,A 目前領先(第 5 點=6 分)。B 最後一次嘗試衝上去——完攀了!直接獲勝。時間到,雙方最高分鎖定。
8
單場結算
當場判勝負
畫面顯示 B 勝、晉級;A 淘汰。兩人的攀登影片都附在這場記錄裡,有疑義可回放。
/ 收尾 /
9
對戰表 · 晉級
一輪輪打上去
3 場打完,3 位勝者晉級;3 位敗者進敗部復活賽(共用 6 分鐘比一個出來)湊成 4 強。接著準決賽、季軍戰、總決賽,每輪換新路線。
10
冠軍結算
分出今天的王
總決賽結束,App 顯示冠軍與最終名次、每場精華影片,可一鍵分享戰報到社群。整場約 40 分鐘。
以你在路線上到達的最高點計分,分數隨把手點往上遞增:
| 進度 | 分數 |
| 未建立起攀 | 0 分 |
| 起攀建立完成 | 2 分 |
| 控制到起攀後第 1 個點 | 3 分 |
| 控制到下一個點 | 4 分 |
| 每多控制一個點 | +1 分 |
| 完攀(Top) | 該路線最高分 |
- 需穩定控制才得分——手要確實抓穩下一個點才算數,甩到、碰一下不算。
- 時間內嘗試次數不限,取所有嘗試中的最高分。
- 把手點順序依路線動線編號,由房主在標定路線時用標點工具設定。
- 每場 PK 指定一條路線,兩位選手共用同一個計時。
- 共用時間預設 6 分鐘(房間可設 5–6 分鐘)。
- 輪流、一人一次嘗試:上去爬,一掉下來(或完攀)就換對手,如此來回交替,直到時間用完。
- 計時不暫停——換手、休息、觀察路線,整段都在跑。
- 時間到的當下,各自達到的最高分就是該場成績。分數高者勝;若一方完攀、另一方未完攀,完攀者直接獲勝。
跟正式比賽一樣:兩人共享一塊時間、一人一次輪流挑戰。每場開賽由 App 抽籤動畫隨機決定先攻,爬越高越好、但掉下來就換人——何時拚、何時穩,是這場的策略。
兩兩 PK,勝者晉級、敗者淘汰,不跨場累計積分。每場換一條新路線——後爬的人看得到前面的 beta,重複用線不公平;6 人賽共 8 場,正好對應岩館備好的 8 條路線。最後有季軍戰與總決賽。
6 人賽程(建議)
第一輪 · 3 場
A vs B
C vs D
E vs F
3 位勝者直接晉級 4 強。
↓
敗部復活賽 · 1 場
3 位敗者同場較量
三人共用 6 分鐘輪流挑戰同一條路線,比出 1 位最高分復活,湊成 4 強。
↓
準決賽 · 2 場
4 強(3 勝者 + 1 復活)→ 2 場 PK
↓
季軍戰 + 總決賽
準決賽兩位敗者 → 搶第三名
準決賽兩位勝者 → 爭冠軍
有了敗部復活賽,每個人都至少爬到兩場:第一輪勝者進 4 強再打,第一輪敗者全部進敗部復活賽再拚一次。整場約三輪、節奏明快。
其他人數
| 人數 | 賽制 |
| 4 人 | 準決賽 2 場 → 季軍戰 + 決賽 |
| 8 人 | 八強 4 場 → 四強 2 場 → 季軍戰 + 決賽 |
| 奇數 | 第一輪抽籤一人輪空(bye)直接晉級 |
核心三個畫面,串起整個對戰體驗:
對戰房間千手抱石
房號 7F2K · 6 人
⏱ 共用 6 分鐘
🧗 8 條路線已標定
👥 Bryan · Amy · Ken …
▶︎ 開始比賽
PK 計時第 1 場
Amy 上場中 · 橘線
02:14
Amy 6 分 · Ken 4 分
+ 記錄到達點
⤵︎ 掉下來 · 換人
對戰表晉級狀態
準決賽
Amy 6 ✓ vs Ken 4
Bryan Top ✓ vs Joe 5
下一場:季軍戰
🏆 冠軍戰待定
沿用 App 既有的錄影與影片庫:PK 計時畫面就是錄影畫面的延伸,每場攀登自動存進影片庫並標上對戰標籤。
沿用既有的 Firebase / Firestore 架構,與現有比賽模式平行。房間資料獨立於官方賽事,建議掛在新的 collection:
pkRooms/{roomCode}
hostUid: string
gymName: string # 沿用 GymManager
status: "lobby" | "active" | "done"
settings/
sharedTime: 360 # 秒,兩人共用
scoreMode: "control" # 預設需控制;"touch" 為寬鬆選項
turnRule: "fallToSwap" # 掉下來換人,一人一次
refereeUid: string # 第一版=房主,單機操作
players/{uid}
displayName: string # Max 20, 沿用驗證規則
status: "in" | "eliminated"
placement: int?
routes/{routeId}
color, photoURL, topScore
holds: [{ order, label, x, y }] # x,y=照片上標點座標
matches/{matchId}
round: "r1" | "revival" | "semi" | "third" | "final"
routeId, players: [uid] # 復活賽 3 人,故用陣列
firstAttacker: uid # App 抽籤結果
scores: { uid: int }, winnerUid
videos: { uid: videoId? } # 關聯影片庫
- 計分演算法跨平台一致,比照
ScoreCalculator.kt ↔ LeaderboardEntry.swift 的作法抽共用邏輯。
- 所有讀改寫(記分、晉級)走
runTransaction,與現有規範一致。
- 即時同步:房間 / 對戰表用 Firestore listener,多人同畫面即時更新晉級狀態。
- 影片關聯:PK 攀登沿用既有錄影與 R2 上傳流程,
matches.videos 指向影片庫。
- 標點工具:在路線照片上以座標
(x, y) 標記每個把手點並排序,計分時對照「目前到第幾點」;第一版即需要,是裁判記分的基礎。
MVP單機 · 房主即裁判(目前要做的):一支手機當主機,開房者就是裁判——開房、設規則、用標點工具標路線、自動排賽程、每場開賽抽籤動畫決定先攻、共用計時、裁判點按記分、判勝負與晉級。先驗證玩法好不好玩。
P1多人連線:QR / 房號加入、Firestore 即時同步對戰表,各自手機看自己的場次與全場進度。
P2影片整合:PK 攀登自動錄影並關聯,單場可回放、冠軍頁產生精華戰報、一鍵分享。
P3進階賽制:自訂賽制、歷史戰績與個人對戰勝率、好友排行榜。
經團隊討論拍板,以下規則為第一版實作依據:
- 計分判定 — 需穩定控制才得分 已定手確實抓穩下一個點才算數,甩到、碰一下不算。寬鬆的「觸碰即得分」保留為日後可選模式。
- 平手判定 — 先比嘗試次數,仍平手才加賽 已定同分時嘗試次數較少者勝;若連嘗試次數都相同,加賽一場 sudden death,先達同高度者勝。
- 點位標定 — 房主決定,提供標點工具 已定路線與把手點順序由房主標定;App 需提供好用的「照片標點工具」,在路線照上點選、排序每個把手。
- 裁判與記分 — 第一版單機,開房者即裁判 已定先做單機版:開房的人就是裁判,由他這支手機操作計時與記分。多人連線各自記分留待後續版本。
- 先攻順序 — App 抽籤動畫隨機決定 已定共用計時下先後攻有差別,每場開賽由 App 播放抽籤動畫隨機決定先攻(取代猜拳),增加遊戲感。
- 第一輪敗者 — 敗部復活賽 已定第一輪 3 位敗者進敗部復活賽再拚一個晉級名額(見第 5 節),不另設安慰賽。