home about projects profile
互動與遊戲 2026 系統與網站開發 互動與遊戲
English  Mahjong
// SYS 官方專案 現場展覽

English Mahjong

Draw. Discard. Spell. Win.

by bacon

// project_overview

以麻將回合制機制為骨架、英文詞彙拼組為核心的即時多人連線遊戲。玩家抽取字母牌並輪流出牌,搶先將手上 17 張字母牌全部拼成英文單字者獲勝。支援單人對 AI、多人連線,以及表演模式。後端採用 Flask + Socket.IO 實現 WebSocket 即時同步,電腦對手以遞迴回溯演算法搭配詞頻排序進行胡牌判斷,共分四段難度。

// tech_stack
Python Flask Socket.IO JavaScript Eventlet
// keywords
# mahjong # multiplayer # real-time # word game # socket.io # AI # english vocabulary # flask # websocket
幫這個專案投票!
// project_details

🀄 English Mahjong(英文字母麻將)

以麻將的回合制機制為骨架、英文詞彙拼組為核心的多人即時連線遊戲。玩家抽取並打出字母牌,搶先將手牌全部組合成合法英文單字者獲勝。


目錄


專案簡介

English Mahjong 以英文 26 個字母取代傳統麻將牌。字母張數依照英語實際字元出現頻率分配(如 E ×17、T ×12、A ×11),每位玩家每局發得 16 張牌,輪流進行摸牌與出牌,目標是將手上所有牌拼成一組合法的英文字典詞彙。

支援三種遊戲模式:

  • 單人模式 — 一名玩家對抗三隻電腦模擬對手
  • 多人模式 — 最多四名玩家共用一個房間
  • 表演模式 (Performance) — 四名電腦對手同台對決,全自動出牌與胡牌,適合社展現場大螢幕投影展示

牌組設計與字母頻率

字母數量依英語字元使用頻率分配,確保遊戲的可玩性:

頻率等級 字母與數量
高頻(≥ 8 張) E ×17、T ×12、A ×11、O ×10、N ×9、I ×9、H ×8、R ×8、S ×8
中頻(2–6 張) D ×6、L ×5、U ×4、C ×4、F ×3、G ×3、W ×3、Y ×3、M ×3、B ×2、P ×2
低頻(1 張) J、K、Q、V、X、Z
NOTE

越常見的字母越容易抽到,但也更容易被對手利用。罕見字母(如 Q、Z)雖然難用,卻能拼出高難度的長單字!


功能特色

  • 🎮 即時多人連線:基於 Socket.IO WebSocket 技術,實現毫秒級多人即時連線同步
  • 🤖 四段難度電腦對手:Beginner 至 Ultimate 難度,使用字典隨機抽樣演算法模擬真實詞彙量
  • 🈁 吃牌(CHI)與胡牌(HU)機制:無縫融合傳統麻將規則與 30 萬筆英文單字字典驗證
  • 🔒 資訊安全隱藏:對手手牌與吃牌選項均在後端安全驗證,徹底杜絕客戶端作弊
  • 🧩 手牌拖拉排序:整合 Pointer Events API 提供流暢且自由的手牌拖曳排列體驗
  • 🎨 動態音效與勝利特效:整合 Web Audio API 即時合成音效,並在胡牌時觸發 canvas-confetti 慶祝動畫

系統架構

系統架構圖

後端

元件 技術
Web 框架 Flask
即時通訊 Flask-SocketIO(WebSocket)
非同步事件循環 Eventlet
執行環境 Python 3.10+

前端

元件 技術
遊戲邏輯與畫面渲染 Vanilla JavaScript(game.js
即時事件 Socket.IO Client 4.x
勝利動畫 canvas-confetti
字型 Google Fonts(Inter、Orbitron、Outfit)

核心處理流程(Process)

為確保即時多人對戰遊戲的流暢度與公平性,系統將核心邏輯集中於後端,並透過 WebSocket 連線同步至前端。以下是系統的核心決策與資料處理流程:

核心處理流程圖


遊戲玩法

遊戲以 26 個英文字母取代傳統麻將,每位玩家開局持有 16 張牌,輪流摸牌與出牌,最先拼完手牌者獲勝。

  1. [摸牌與出牌]:自動摸牌,雙擊打出

    • 回合開始時自動摸一張牌,雙擊手牌確認打出,防止誤觸。
    • 支援滑鼠與觸控拖曳手牌,自由調整排序。
  2. [吃牌 CHI]:截取上家,組合單字

    • 當上家出牌時,若能與手牌組成合法單字即可宣告吃牌。
    • 吃牌所組成的英文單字將會移入副露區(公開展示)。
  3. [胡牌 HU]:全手牌合法,宣告獲勝

    • 手牌(含副露單字)必須能夠恰好組合成合法的英文字典詞彙,且不能多餘。
    • 可在任何時機按下胡牌按鈕宣告 HU,由伺服器進行字典驗證。

電腦對手系統

難度等級

難度 詞彙量(佔總字庫比例) 胡牌觸發機率 吃牌策略
Beginner 1% 5% 偏好短單字
Intermediate 5% 15% 隨機選擇
Advanced 10% 35% 偏好長單字
Ultimate 20% 75% 偏好長單字

核心演算法:遞迴詞彙分割

電腦對手的胡牌判斷使用遞迴回溯法(Recursive Backtracking)搭配記憶化(Memoisation)

  1. 取手牌第一個字母。
  2. 透過預建的字元/長度雙重索引,查詢所有包含該字母的候選單字。
  3. 依難度對候選詞進行詞彙量過濾(從字庫隨機抽樣)。
  4. 若手牌字母足夠組成某候選詞,扣除使用的字母後遞迴處理剩餘手牌。
  5. 基底情況:所有字母耗盡 → 胡牌成立;否則回溯嘗試下一候選詞。

線上遊玩

本專案已部署至雲端,無需本機安裝即可直接遊玩:

👉 立即遊玩 English Mahjong


專案結構

majan/
├── server.py                  # 後端核心:Flask、SocketIO、遊戲引擎、電腦對手
├── requirements.txt           # Python 依賴套件清單
├── build.py                   # 建置工具腳本
├── filter_proper_nouns.py     # 字典前處理:過濾專有名詞
├── solve.py                   # 獨立胡牌求解器(測試用)
├── test_hu.py                 # 胡牌邏輯單元測試
│
├── templates/
│   └── index.html             # Jinja2 HTML 進入點
│
└── static/
    ├── css/
    │   └── style.css          # 全域樣式(深色主題、動畫效果)
    ├── js/
    │   └── game.js            # 客戶端遊戲邏輯與 Socket.IO 整合
    ├── words.json             # 英文字典(約 30 萬筆詞彙)
    └── word_frequencies.json  # 詞頻排序清單(供電腦對手難度設定使用)

// Comments

載入留言…
// similar_projects

字靈師

// NO_SUBTITLE

互動與遊戲