Skip to content

calc_cli 使用文档

概述

calc_cli 是本项目中用于国标麻将(GB Mahjong)算番和向听数计算的核心命令行工具。它集成了听牌分析(Shanten Calculator)和番数计算(Fan Calculator)功能。无论是分析一手牌的进张情况,还是计算和牌后的具体番型和分数,都可以通过此工具完成。

基本用法

./calc_cli [选项] <手牌字符串>

参数说明

参数 缩写 类型 说明
--help -h Flag 显示帮助信息和手牌格式说明。
--verbose -v Flag 启用详细日志输出,用于调试计算过程。
--example - Flag 显示几个典型的手牌字符串示例。
handtiles - String (必填) 位置参数。需要计算的手牌编码字符串。

手牌输入格式 (Handtiles String)

calc_cli 使用一套特定的字符串格式来描述麻将手牌、副露(吃碰杠)以及比赛时的状态信息。

格式结构为:[手牌/副露] | [状态标志] | [花牌]

1. 基础牌张表示

麻将牌使用数字或字母加上特定的后缀来表示。

类别 标记 示例 说明
数牌 m 123m 万子 (Man),数字 1-9。
数牌 s 456s 索子 (Sou),数字 1-9。
数牌 p 789p 筒子 (Pin),数字 1-9。
字牌 ESWN EEESS 东风 (East)、西风 (West)、南风 (South)、北风 (North)。
字牌 CFB/P CCFFPP 中 (Chung / Center)、发 (Fa)、白 (Bai/Pai)。

2. 副露 (Melds)

副露使用方括号 [] 包裹,格式为 [牌型, 供牌来源]。牌型如 345m (吃), 333s (碰), CCCC (杠)。供牌来源用数字表示:

代码 来源 说明 示例
1 上家 吃/碰/获赠 [123m,1] (吃上家)
2 对家 碰/杠 [WWWW,2] (大明杠对家)
3 下家 碰/杠 [333s,3] (碰下家)

3. 状态信息 (Situation)

这是可选部分,用 | 分隔。通常由 5-6 个字符组成 (如 EE1000),每个位置代表一种状态:

位置 含义 取值说明
1 圈风 E (东), S (南), W (西), N (北)
2 门风 E (东), S (南), W (西), N (北)
3 自摸 1 (是), 0 (否)
4 绝张 1 (是), 0 (否)
5 海底/河底 1 (是), 0 (否)
6 抢杠和 1 (是), 0 (否)

4. 花牌 & 综合示例

花牌直接使用字符序列表示(如 abcdefgh 对应春夏秋冬梅兰竹菊)。

示例 含义
[123m,1][123p,1]123m12p44s3p|EE1000|c 吃 123m (上家),吃 123p (上家),立牌 123m 12p 44s,和牌张 3p。状态为东圈东风,自摸和牌,花牌为秋。

输出说明

1. 向听数分析 (Shanten Analysis)

如果输入的手牌未和牌,工具会输出详细的向听数分析。

输出项 说明
各牌型向听数 计算一般高、七对子、十三幺、全不靠、组合龙等所有牌型的最小向听数。
进张建议 详细列出“打哪张牌,可以待哪张牌”,包括有效进张数。
好型率 若为一向听,会额外分析进张后的好型(两面、三面等)概率。

示例片段:

一般型:  1 向听
打 1s 待 4s 7s
打 2m 待 4m

2. 番数计算 (Fan Calculation)

如果输入的是合法和牌,工具会输出番数计算结果。

输出项 说明
总番数 手牌合计番数。
番种详情 列出所有贡献分数的番种及其对应的番数。
组合解析 针对复杂番种(如三色同顺)的详细组合构成说明。

示例片段:

Total Fan: 88
Fan Details:
  1. 十三幺 (88 fan)


示例命令

场景 命令示例
计算简单和牌 ./calc_cli "[123m,1][123p,1]123m12p44s3p"
含花牌与状态 ./calc_cli "11123456789999m\|EE1000\|cbaghdfe"
分析向听数 ./calc_cli "123789s123789p33m"
详细调试模式 ./calc_cli "123789s123789p33m" -v

单元测试与验证

calc 模块包含完善的单元测试。建议在修改算法后运行测试进行回归验证。

测试文件 覆盖内容
test/unit/fan_calculator_test.cpp 各种番种计算、边界条件测试。
test/unit/shanten_test.cpp 向听数计算、听牌分析、进张数计算。
test/unit/starting_hand_test.cpp 起手配牌捕获逻辑测试。
test/unit/player_stats_test.cpp 起手向听分布统计、玩家数据统计集成测试。

运行命令:

# 在 build 目录下
./test/unit/fan_calculator_test
# 或
ctest -R fan_calculator_test