過年打牌總是在繳學費?市面上的麻將 App 有免費次數限制但根本不夠用。這篇文章介紹我如何透過 AI Vibe Coding,基於開源專案改造出一款完全免費、無限練習的台灣十六張麻將單機遊戲。
list文章目錄expand_more
list文章目錄
這篇文章將介紹我如何透過 AI Vibe Coding,基於開源專案改造出majiang-taiwan,一款完全免費、無限暢玩的台灣十六張麻將單機練習遊戲。
過年限定的麻將新手 與 被綁架的練習#
身為一個平常不打麻將的人,我只有在過年過節才會跟家人朋友上牌桌。
但因為實在太少打,每次上桌基本上都是在「繳學費」。看牌慢、打牌慢、不知道可以聽哪些牌,甚至連最後胡牌了,台數怎麼算都搞不清楚,只能任人宰割 (((o (゚▽゚) o)))。
平常要湊牌搭很麻煩。於是,我轉向了手機上的麻將應用程式。
然而,市面上的麻將 App 都有兩個致命的痛點:
- 每日次數限制 :每天只有少量的免費破產補助金,輸光了就只能明天請早,無法達到「高頻率密集練習」的效果。
- 強烈的課金導向 :系統透過各種機制誘導你儲值課金或看滿滿的廣告。
我想要的只是一個純粹的「單機練習庫」:沒有每日限制、沒有儲值壓力、沒有廣告。
既然找不到,我就自己搞一個出來。
Vibe Coding:站在開源的肩膀上魔改#
為了避免從零開始造輪子的痛苦,我在 GitHub 上尋找合適的基底。
最終鎖定了 Pomax/mahjong,這是一個以純前端(HTML/CSS/JS)打造的開源麻將專案,優點是架構極簡、沒有臃腫的框架。
但他有一個根本性的問題:它是基於十三張麻將(日本/國標)的邏輯寫的。這與台灣麻將完全是兩個世界(我也有玩過雀魂日麻,0 台不能胡牌超麻煩的)。
為此,我透過 AI 進行了深度的核心改造,這也是這款遊戲與原版最大的不同:
1. 從 13 張到「台灣 16 張」的底層重構#
這是最大的技術痛點。原專案是 4 面子 + 1 雀頭(14 張胡牌),但在台灣,我們打的是 16 張牌(5 面子 + 1 雀頭,17 張胡牌)。
這不只是 UI 多出一組牌的問題,整個 AI 對手理牌、聽牌判定、以及胡牌演算法的遞迴檢查,都需要為了額外的一個「面子」全面重寫。
2. 實作台灣專屬的「底 + 台」計分系統#
十三張的計分方式也跟我們熟悉的台灣規則不一樣。透過 Vibe Coding,我讓專案學會了完整的台灣台數表:
- 基本盤 :門清、自摸、平胡、碰碰胡、混一色、清一色等。
- 台灣特色 :莊家連莊與拉莊(連一拉一)、一炮多響(放炮者全賠)。
- 大牌與特殊牌型 :大小三元、大小四喜、天胡、地胡、字一色,甚至補花、正花、槓上開花、海底撈月等規則也一併實作。
3. 全在地化的沉浸體驗#
為了讓練習更有感,我把介面全面繁體中文化,並加入了在地化的 中文字音提示 (使用了 ElevenLabs,還蠻好玩的)。 也加入了 「結算台數拆解明細」 的功能:新手最怕不知道台數哪來的,現在胡牌後,畫面會一條一條列出你贏了哪些台數,它是新手最完美的教學畫布。
majiang-taiwan:你的萬能單機牌桌#
經過改造,majiang-taiwan 正式誕生。它的核心理念,與我之前寫的 記憶卡歸檔程式 和 AI 語音家教 一樣: 簡單、純粹、Local-first。
- 零安裝、零依賴 :純 HTML / CSS / JS 打造,不需要 npm build,完全無框架。只要點開
index.html或者直接開啟 GitHub Pages 連結,瀏覽器就是你的牌桌。 - 無限練習 :這是一款徹底的單機遊戲。內建 3 個 AI 對手陪你練牌,你可以一天打 100 圈,永遠不用擔心金幣耗盡。
- 自訂彈性 :你可以自由調整底注、每台金額,甚至是選擇打東風戰還是全場。
拿回「純粹娛樂」的權利#
就像我在 VoiceVault 專案中強調「資料主權」,在打麻將這件事上, 我們該拿回的是「純粹娛樂與練習」的權利 。
科技的進步與開源社群的力量,讓我們不再需要被博弈遊戲的商業模式(買幣、看廣告)綁架。只要善用 AI Vibe Coding,完全可以根據自己的痛點,在短短幾天內重塑一個適合自己的工具或遊戲。
練習的時間是你自己的。別讓它們變成商業軟體用來榨取你錢包的籌碼。
如何開始?#
這款台灣麻將完全開源且免費,你可以直接在瀏覽器上遊玩,或是把它 Clone 到你的電腦裡。
- 線上直接玩 : majiang-taiwan (GitHub Pages)
- GitHub Repo: chymmike/majiang-taiwan
- 基礎用法 :
# 如果你想在本機端執行,只需兩步 git clone https://github.com/chymmike/majiang-taiwan.git cd majiang-taiwan open index.html


