从零开始教你写一个麻将胡了程序,用Python实现经典玩法逻辑!

asd987456 2025-12-31 麻将胡了PG 2 0

你有没有想过,为什么在打麻将时,别人一摸牌就知道能不能胡?这背后其实藏着一套复杂的判断逻辑,今天我就带大家用Python来实现一个简单的“麻将胡了”判断程序,不仅适合编程初学者练手,还能帮你理解游戏规则背后的算法思维。

先说清楚目标:我们要写一个程序,输入一组麻将牌(比如123456789条、万、筒),程序能自动判断这组牌是否满足“胡”的条件——即是否可以组成四组顺子或刻子 + 一组将牌(对子)。

第一步:定义数据结构
我们用列表表示牌面,[1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11] 表示两对1(筒)、一对10(条)、一对11(条),以及一条顺子(1-2-3)、一条顺子(4-5-6)、一条顺子(7-8-9),注意:为了简化,这里假设只有数字牌(1-9),不考虑字牌和花牌。

第二步:统计每种牌的数量
我们用字典记录每种牌出现的次数,count = {1: 2, 2: 1, ..., 10: 2},这个步骤是后续判断的基础。

第三步:核心逻辑——枚举所有可能的将牌
胡牌必须有一对将牌,所以我们先遍历所有可能的将牌组合(即两个相同的牌),比如从 count 中取出任意一种数量 ≥2 的牌作为将牌,然后从剩下的牌中判断是否能分成四组合法的组合(顺子或刻子)。

第四步:递归判断剩余牌能否组成四组
这是最复杂也最有趣的部分,我们写一个函数 can_form_groups(cards),它接收一个牌列表,返回True/False,方法是:

  • 如果没有牌了,说明成功分完,返回True;
  • 否则,尝试每种可能的顺子(如1-2-3)或刻子(如1-1-1);
  • 每次选一个组合,从当前牌中减去对应数量,递归调用;
  • 如果某次递归成功,就说明整个方案可行。

举个例子:假设输入是 [1,1,1,2,2,2,3,3,3],显然这是一个三组刻子,但缺少将牌,所以不能胡,但如果加上一对[4,4],变成 [1,1,1,2,2,2,3,3,3,4,4],就可以胡了——三组刻子+一对将牌。

第五步:完整代码实现
下面是一个精简版代码框架(实际可扩展为图形界面):

from collections import Counter
def is_valid_hand(hand):
    count = Counter(hand)
    for tile in count:
        if count[tile] >= 2:
            # 尝试以 tile 为将牌
            temp_count = count.copy()
            temp_count[tile] -= 2
            if can_form_groups(temp_count):
                return True
    return False
def can_form_groups(count):
    if not any(count.values()):
        return True
    for tile in list(count.keys()):
        if count[tile] == 0:
            continue
        # 尝试形成刻子
        if count[tile] >= 3:
            new_count = count.copy()
            new_count[tile] -= 3
            if can_form_groups(new_count):
                return True
        # 尝试形成顺子(需要连续三个数)
        if tile <= 7 and count[tile+1] > 0 and count[tile+2] > 0:
            new_count = count.copy()
            new_count[tile] -= 1
            new_count[tile+1] -= 1
            new_count[tile+2] -= 1
            if can_form_groups(new_count):
                return True
    return False

这个程序虽然简单,但逻辑清晰,适合学习回溯算法和递归思想,你可以试着把输入改成 [1,1,2,3,4,5,6,7,8,9,10,10,11,11],你会发现它能正确识别出胡牌!

最后提醒:真实麻将规则更复杂(如七对、十三幺等),但掌握基础逻辑后,你就能轻松拓展功能,甚至开发自己的麻将AI!赶紧试试吧,让代码替你判断“胡没胡”!

从零开始教你写一个麻将胡了程序,用Python实现经典玩法逻辑!