当前位置:首页 > 作者专栏 > 正文

必学教程“哈哈贵阳捉鸡麻将算法”教你胡牌神器

基础胡牌条件(通用麻将规则)

  1. 牌型组成

    • 手牌必须组成 4组顺子/刻子 + 1对将牌(共14张)。
    • 特殊牌型(如七对、龙背等)需单独判断。
  2. 顺子与刻子

    • 顺子:同花色连续三张(如万子234)。
    • 刻子:三张相同牌(如3个五筒)。
  3. 将牌

    任意一对相同的牌(如2个红中)。


贵阳捉鸡麻将特有规则

  1. "捉鸡"机制

    • "鸡牌":通常为第一张翻开的牌(如翻出五万,则五万和对应的"金鸡"牌为鸡牌)。
    • 胡牌后结算:玩家手牌或杠牌中有鸡牌可额外加分(需根据具体规则判定)。
  2. "冲锋鸡"与"责任鸡"

    • 冲锋鸡:开局打出的第一张鸡牌,分值翻倍。
    • 责任鸡:若玩家打出的鸡牌被其他玩家杠或胡,需额外赔付。
  3. 杠牌加分

    明杠、暗杠、补杠均会影响最终得分,通常按约定倍数计算。


胡牌算法核心逻辑(代码思路)

def is_win(hand_tiles):
    # 步骤1:检查是否满足14张牌
    if len(hand_tiles) != 14:
        return False
    # 步骤2:统计每种牌的数量
    tile_count = {}
    for tile in hand_tiles:
        tile_count[tile] = tile_count.get(tile, 0) + 1
    # 步骤3:尝试找将牌,然后检查剩余牌是否能组成顺子/刻子
    for tile in tile_count:
        if tile_count[tile] >= 2:  # 候选将牌
            temp_count = tile_count.copy()
            temp_count[tile] -= 2
            if check_melds(temp_count):
                return True
    return False
def check_melds(count):
    # 递归或迭代检查是否能组成4组顺子/刻子
    for tile in count:
        if count[tile] >= 3:  # 刻子
            count[tile] -= 3
            if check_melds(count):
                return True
            count[tile] += 3
        if is_sequence(tile):  # 顺子(需实现同花色连续判断)
            if count.get(tile+1, 0) > 0 and count.get(tile+2, 0) > 0:
                count[tile] -= 1
                count[tile+1] -= 1
                count[tile+2] -= 1
                if check_melds(count):
                    return True
                count[tile] += 1
                count[tile+1] += 1
                count[tile+2] += 1
    return all(v == 0 for v in count.values())  # 是否全部用完

特殊牌型处理

  1. 七对:14张牌组成7个对子(需排除四张相同牌的情况)。
  2. 龙背:特定组合(如111222333+将牌),需单独判断。

注意事项

  1. 鸡牌判定:需在胡牌后遍历手牌和杠牌,匹配当前局翻出的鸡牌标记。
  2. 杠牌优先:若玩家有杠未补,可能无法直接胡牌(根据规则调整)。
  3. 方言规则差异:贵阳不同地区可能有细微规则变化,建议开局前明确。

有话要说...