如何排查并修复有问题的麻将判胡代码?

1 个回答

  • 郭靖
    外界的声音都是参考,你不开心就不要参考。
    ## 作用 用于判断摸牌后手牌是否能按规则组成: - 1 个对子(将牌) - 4 个面子,每个面子为顺子或刻子 - 可扩展支持杠、七对、十三幺等特殊牌型 ## 原理 ### 1. 规范牌面表示 - 使用长度为 34 的数组表示手牌。 - 数组下标表示牌种,元素值表示该牌的数量。 - 判胡前应先检查总牌数、每种牌数量、数组长度和牌种编号是否合法。 ### 2. 枚举将牌 - 遍历所有数量不少于 2 的牌。 - 临时减去两张作为将牌。 - 再判断剩余牌是否能全部拆成顺子或刻子。 - 递归返回后必须恢复数量,避免污染后续分支。 注意:标准“4 面子 +1 将”的胡牌中,将牌只能选择一次,不能在递归过程中反复移除对子。否则空牌或异常手牌可能被误判为胡。 ### 3. 拆分面子 找到剩余牌中编号最小且数量不为 0 的牌,只处理以它开头的组合: - 如果该牌数量不少于 3,可以尝试作为刻子,减去 3 张。 - 如果它与后两张牌都存在,可以尝试作为顺子,各减去 1 张。 - 每尝试一种组合后递归处理剩余牌。 - 递归失败要撤销修改。 - 如果所有牌数量都为 0,则拆分成功。 顺子只能在同一花色内连续,不能跨越万、条、筒以及字牌的编号边界。 ### 4. 修复常见错误 - 不要在每一层递归中都枚举将牌,应单独选一次将牌。 - 不要把字牌纳入顺子判断。 - 检查数组越界,尤其是顺子的后两张牌。 - 递归修改数组后,所有失败路径都要回滚。 - 先校验手牌总数,常规胡牌应为 14 张。 - 增加单元测试,覆盖普通胡牌、少牌、多牌、跨花色假顺子、多个候选将牌等情况。 ### 5. 优化方法 - 每次只处理最小的未消耗牌,减少无效分支。 - 使用记忆化搜索或动态规划缓存已计算的手牌状态。 - 在进入递归前进行数量、牌型和边界剪枝。 - 七对、十三幺等特殊牌型应单独判断,再与常规胡牌逻辑取“或”。
    发布于 2026-10-29 12:35 •IP属地 内蒙古
    举报
    评论
    收藏