Moshiii/mahjong

★ 0Forks 0PythonGitHub ↗Compare

README

Harbin Mahjong (Official-Rule Engine)

本仓库当前仅保留“公开规则口径”实现(以 JJ 规则为主,结合公开资料交叉)。

保留内容

  • rules/harbin_official.py:官方口径规则引擎
  • scripts/demo_harbin_official.py:命令行演示(14张判和 / 13张听牌)
  • scripts/analyze_13_shanten.py:13张基础向听/有效进张(PyMahjongGB)+ 哈尔滨规则过滤
  • docs/harbin_official_rules.md:规则来源与实现口径说明

快速使用

14张判和

python3 scripts/demo_harbin_official.py \
  --hand "1w 2w 3w 4w 5w 6w 7w 8w 9w 1t 1t 1t z z"

13张听牌

python3 scripts/demo_harbin_official.py \
  --hand "1w 2w 3w 4w 5w 6w 7w 8w 9w 1t 1t 1t z"

13张向听与有效进张(结合 PyMahjongGB)

python3 scripts/analyze_13_shanten.py \
  --hand "1w 2w 3w 4w 5w 6w 7w 8w 9w 1t 1t 1t z"

也支持紧凑输入:

python3 scripts/analyze_13_shanten.py --hand "1569w2599t236bzz"

随机发一手13张:

python3 scripts/analyze_13_shanten.py --deal

连续模拟(随机发牌后循环“摸1张->按规则打1张”直到听牌):

python3 scripts/analyze_13_shanten.py --sim 3

交互模式(首次输入13张手牌,之后每轮只输入摸到的牌):

python3 scripts/analyze_13_shanten.py --interactive

规则:

  • 若摸到牌命中 useful_draws 规则,则按 next_discard 自动出牌。
  • 若不命中规则,则“摸啥打啥”。
  • 每轮都会打印当前手牌与 next_discard 表格。

说明:

  • 输出为单行紧凑格式,便于批量采样和日志分析。
  • 默认快速模式:使用 RegularShanten + useful draws,并在 shanten=0 时按哈尔滨规则过滤真实听口(避免假听)。
  • 输出包含 next_discard,格式为 抓牌>弃牌,表示“摸到该 useful_draw 后推荐打哪张”。
  • 输出使用紧凑中文表示(例如 1234789万12345679条145678饼中),next_discard 按“弃牌分组”聚合。
  • 随机演示:python3 scripts/analyze_13_shanten.py --demo --samples 5
  • 评分解释:python3 scripts/analyze_13_shanten.py --deal --explain

牌表示

  • 1w..9w:万
  • 1t..9t:条
  • 1b..9b:饼
  • z:红中

摄像头网页上传(实验版)

用于“网页申请摄像头权限 -> 每秒截图上传后端”。后端当前仅收图并返回占位结果,后续可接 YOLO + next_discard。

  1. 安装依赖:
pip install fastapi uvicorn python-multipart ultralytics
  1. 启动服务:
uvicorn web.app:app --host 0.0.0.0 --port 8000
  1. 打开网页:
  • 本机:http://127.0.0.1:8000
  • 局域网给朋友用:http://你的IP:8000

上传图片会落盘到 web/captures/。

如需 YOLO + 策略完整流程,请看:

  • docs/web_camera_yolo_setup.md

说明:未设置 MAHJONG_MODEL_PATH 时,会默认加载 yolov8n.pt 做本地联调。

HTTPS 启动(更适合手机摄像头权限):

./scripts/start_web_https.sh

默认地址:https://你的IP:8443

Contributors

Moshiii

Issues