
隨著匹克球在台灣越來越熱門,許多球館與玩家都希望能有簡單好用的計分系統,用來管理友誼賽、教練課程或正式比賽。計分系統看起來小,但要設計得好,其實需要同時了解匹克球規則、比賽流程與後端資料架構。
這篇文章整理出完整的思考流程,包含規則拆解、功能需求、UI、後端資料表與 API 方式,讓球館或開發者了解一套計分系統應該怎麼做。
目錄
計分系統的目的
一套計分系統必須解決三件事:
1. 正確紀錄比賽
- 分數
- 發球方
- 換邊
- 失誤與贏球球數
2. 減少場上爭議
- 每球紀錄(Rally Log)
- 上一球結果
- 失誤類型
3. 方便教練與球館管理
- 數據統計
- PDF 比賽報告
- 即時比賽看板
匹克球如何計分
了解規則是系統邏輯的基礎。
基本規則
- 先得 11 分,領先 2 分
- 雙打採三碼制(Server Number)
- 發球方失誤 → 交換發球權(Side Out)
- 分數奇偶影響左右站位(Switch Court)
計分邏輯拆解(給開發者)
| 事件 | 說明 |
|---|---|
| score_point | 得分方 +1 |
| side_out | 發球權交換 |
| rotate_server | 同隊 1 號 → 2 號 |
| switch_court | 換邊 |
| rally_end | 一個回合結束 |
計分系統功能示意
基本功能
- 分數增加/減少
- 發球方箭頭
- Server Number(1 / 2)
- Undo 一鍵撤銷
- 比賽結束提醒
進階功能
- 每球紀錄(Rally Log)
- 非受迫性/受迫性失誤
- 發球得分統計
- PDF 比賽報告
- 球館大螢幕同步顯示
系統設計:前端畫面流程
1. 建立比賽頁面
- 選擇單打/雙打
- 選擇比分(11/15/21)
- 輸入隊伍名稱
2. 主畫面(UI 設計重點)
- 兩側隊伍名稱
- 大字體分數
- 發球方箭頭
- Server Number 標示
- Undo 按鈕
- Rally Log 按鈕
3. 每球紀錄(Rally Log)
[
{ "rally": 1, "winner": "Team A", "type": "forced-error" },
{ "rally": 2, "winner": "Team B", "type": "unforced-error" }
]
系統設計:後端資料架構
以下以 PostgreSQL / Supabase 風格示範。
games(比賽資料)
| 欄位 | 說明 |
|---|---|
| id | 主鍵 |
| team_a | 隊伍 A 名稱 |
| team_b | 隊伍 B 名稱 |
| points_a | 分數 A |
| points_b | 分數 B |
| server_team | A 或 B |
| server_number | 1 或 2 |
| status | ongoing / finished |
| created_at | 時間戳記 |
rallies(回合紀錄)
| 欄位 | 說明 |
|---|---|
| id | 主鍵 |
| game_id | 所屬比賽 ID |
| rally_number | 第幾球 |
| winner | A / B |
| error_type | forced / unforced |
| server_team | 發球隊伍 |
| server_number | 1 / 2 |
| created_at | 時間戳記 |
API 設計示例
建立比賽
POST /api/games
{
"teamA": "John & Alex",
"teamB": "Mike & Sam",
"rule": 11
}
紀錄得分
POST /api/games/:id/score
{
"winner": "A"
}
紀錄每球回合
POST /api/games/:id/rally
{
"rallyNumber": 12,
"winner": "B",
"errorType": "unforced"
}
取得比賽現況
GET /api/games/:id
實作技術選擇
🟢 Web App(推薦)
- Next.js / Nuxt
- 手機即可使用
- 不用上架 App Store
適合:球館、教練、活動主辦
🔵 行動 App
- React Native / Flutter
- 有通知、離線模式
適合:要做完整品牌與訂閱制的公司
🟣 後端 API
- Go / Echo
- PostgreSQL / Supabase
- JWT
適合:球館已有自己的前端想串 API



