fix: 鸡胡 FanValue=0 导致武汉麻将赢家得0分

根因: IdentifyFans 生成的无字/平胡/断幺九等标记番型(base_fan=0)
→ fans.Count>0 → 鸡胡不添加 → FanValue只有0值番型 → baseFan=0

修复(2处):
1. ScoreEngine.FanValue + PhaseMachine.GetFanValue: 鸡胡硬编码 fallback=1
2. IdentifyFans allZeroValue: 当所有番型都是0值(不在_fanConfig且不在硬编码列表)
   时强制添加鸡胡。0值判断依据: 在_fanConfig中base_fan≤0,
   或不在9个硬编码fallback番型中(清一色/混一色/对对胡/碰碰和/暗七对/七对/带幺九/十三幺/鸡胡)

验证: 武汉麻将赢家分数从0变成非零(3/6/9分), 58 tests pass, 5 variants 0 errors
This commit is contained in:
xiaoou
2026-07-04 21:24:46 +08:00
parent 248af7642d
commit a94e68fee2
3 changed files with 13 additions and 2 deletions

View File

@ -749,8 +749,17 @@ public class MeldsSolver
fans.Add("地胡");
}
// 鸡胡: base-level fan when no other structural fan matches
if (fans.Count == 0)
// 鸡胡: base-level fan when no other fan with positive value exists.
// A fan has positive value if it's in _fanConfig with base_fan>0,
// or in the hardcoded fallback list (清一色/混一色/对对胡/碰碰和/暗七对/七对/带幺九/十三幺/鸡胡).
bool allZeroValue = fans.Count > 0 && fans.All(f =>
{
if (_fanConfig.TryGetValue(f, out var fc)) return fc.BaseFan <= 0;
// No DSL config → check if hardcoded fallback gives a value
return f is not ("清一色" or "混一色" or "对对胡" or "碰碰和"
or "暗七对" or "七对" or "带幺九" or "十三幺" or "鸡胡");
});
if (fans.Count == 0 || allZeroValue)
fans.Add("鸡胡");
// Filter: only keep fans that exist in DSL config or are well-known

View File

@ -180,6 +180,7 @@ public class MahjongPhaseMachine
{
"清一色" => 24, "混一色" => 6, "对对胡" => 2, "碰碰和" => 6,
"暗七对" => 8, "七对" => 8, "带幺九" => 2, "十三幺" => 88,
"鸡胡" => 1,
_ => 0
};
}

View File

@ -173,6 +173,7 @@ public class MahjongScoreEngine
"七对" => 8,
"带幺九" => 2,
"十三幺" => 88,
"鸡胡" => 1,
_ => 0
};
}