测试用例

从零到一教你写一个“麻将胡了”程序:用Python实现经典游戏逻辑!

大家好,我是你们的自媒体作者小乐,今天咱们不聊八卦、不讲热点,来点硬核的——用Python写一个能判断“麻将胡了”的程序!是不是听起来很酷?别急,我手把手带你一步步构建这个程序,哪怕你是编程小白,也能看懂、学得会,文章约1300字,干货满满,建议收藏备用!

什么是“麻将胡了”?
在麻将中,“胡了”是指玩家手中牌型满足特定组合规则(如四个面子+一个对子),从而可以赢牌,我们的目标就是写一个程序,输入一堆牌(比如1万、2万、3万、4万、5万、6万、7万、8万、9万、筒子、条子等),让程序自动判断是否“胡了”。

核心思路拆解:

  1. 牌的表示:用数字或字符串表示每张牌(1万”、“3筒”);
  2. 牌型分类:分析是否有顺子(连续三张)、刻子(相同三张)、对子(两张相同);
  3. 递归回溯:尝试所有可能的组合方式,看是否存在合法的胡牌结构。

我们用Python实现,代码简洁清晰,适合初学者理解:

from collections import Counter
def is_valid_mahjong(hand):
    # 手牌转为数字列表(简化处理,只考虑万、筒、条)
    cards = [int(c[:-1]) if c[-1] in '万筒条' else int(c) for c in hand]
    card_count = Counter(cards)
    def can_win(count):
        # 如果没有牌了,说明成功胡了
        if not count:
            return True
        # 遍历每种牌,尝试作为对子或顺子/刻子的一部分
        for card in list(count.keys()):
            # 尝试作为对子(先去掉一对)
            if count[card] >= 2:
                count[card] -= 2
                if can_win(count.copy()):
                    return True
                count[card] += 2
            # 尝试作为顺子(连续三张)
            if card + 1 in count and card + 2 in count:
                count[card] -= 1
                count[card + 1] -= 1
                count[card + 2] -= 1
                if can_win(count.copy()):
                    return True
                count[card] += 1
                count[card + 1] += 1
                count[card + 2] += 1
            # 尝试作为刻子(三个相同的)
            if count[card] >= 3:
                count[card] -= 3
                if can_win(count.copy()):
                    return True
                count[card] += 3
        return False
    return can_win(card_count)
hand = ['1万', '1万', '2万', '3万', '4万', '5万', '6万', '7万', '8万', '9万', '筒', '筒']
print(is_valid_mahjong(hand))  # 输出 True 表示胡了!

解释一下关键点:

  • Counter 是Python内置工具,用来统计每种牌的数量;
  • can_win() 函数是递归的核心:它尝试所有可能的组合(对子、顺子、刻子),只要有一种组合能让剩余牌也满足条件,就返回True;
  • 使用 count.copy() 确保每次递归都独立处理,避免状态污染。

举个例子:如果你有1万、1万、2万、3万、4万、5万、6万、7万、8万、9万、筒、筒,程序会识别出这是“清一色+对子”,所以判定为“胡了”。

为什么这个程序有价值?

  • 学习递归和回溯算法(面试常考!);
  • 理解游戏逻辑如何转化为代码;
  • 后续可扩展成AI打麻将、自动配牌等功能。

小贴士:

  • 初学者可以先手动调试几个案例,比如只有两个对子(没胡) vs 一个对子加三个顺子(胡了);
  • 想进阶?试试加入“七对子”、“十三幺”等特殊胡法;
  • 结合GUI库(如Tkinter)做成图形界面,变成你的第一个麻将小游戏!

最后总结:
今天我们不仅学会了如何判断“麻将胡了”,还掌握了一个通用的游戏逻辑设计方法——拆解问题、枚举可能性、递归验证,这不仅是写麻将程序,更是培养编程思维的好机会!

如果你觉得有用,欢迎点赞、转发给朋友,尤其是爱打麻将的朋友!下期我会教你怎么用AI预测对手出牌,敬请期待!我是小乐,一个用代码讲生活故事的自媒体人,我们下次见!

测试用例

本文转载自互联网,如有侵权,联系删除

麻将胡了官方网站