大家好,我是你们的自媒体作者小码哥,今天不聊热点、不蹭流量,来点硬核又有趣的——用Python写一个“麻将胡了”小游戏!没错,就是那种你小时候在老家饭桌上玩得停不下来的那种,很多人以为麻将是个玄学,但其实它背后藏着一套严谨的算法逻辑,今天我就带大家一起从零开始,写一个能判断是否“胡了”的小程序,顺便把麻将的核心规则拆解清楚。
什么是“胡了”?简单说,就是手里的13张牌可以分成4组顺子或刻子(三张一样的),再加上一对将牌(两张一样的),比如你有三个“5万”+三个“6筒”+三个“7条”+两个“8饼”,再加一个“9条”和一个“10条”,那这局就“胡了”——因为3个刻子 + 1个顺子 + 1对将。
我们先定义一个基础结构:每张牌用数字表示,一万”是1,“二万”是2……“九筒”是9,然后是“条”、“饼”、“风”、“箭”等花色,为了简化,我们先只做万、条、筒三种基本牌型,总共27种牌(每种9张)。
第一步,输入玩家的手牌,假设输入是一个长度为13的列表,[1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9],代表三张一万、一张二万、三张三万、四张四万……等等。
第二步,我们要检查所有可能的组合方式,看能不能组成合法的胡牌结构。
这时候就需要递归回溯算法了,核心思路是:
- 先找一对将牌(重复次数 ≥ 2 的数字)
- 然后从剩下的牌中尝试构建三组顺子或刻子
- 如果全部匹配成功,说明胡了!
举个例子:如果你有 [1,1,1,2,3,4,5,6,7,8,9,9,9],我们可以先挑出两对“9”,留下一个“9”,然后剩下的牌中选三个“1”组成刻子,剩下的是“2,3,4”、“5,6,7”、“8,9”——咦,最后一个不是顺子啊!所以不能胡。
但如果我们换成 [1,1,1,2,3,4,5,6,7,8,9,9,9] 中,如果把“2,3,4”当作顺子,“5,6,7”顺子,“8,9”不行?那就不行,但如果把“1,1,1”当刻子,“2,3,4”顺子,“5,6,7”顺子,“8,9,9”呢?不对,这里只有两个“9”,所以必须确保每一步都满足条件。
这个过程很像解数独,只不过规则更复杂,我们用递归函数遍历所有可能性,每次尝试一种配对方式,直到找到可行方案或者穷尽所有可能。
代码实现上,我会用字典统计每种牌的数量,然后循环尝试每种可能的将牌组合,再递归处理剩余部分,整个逻辑虽然看起来复杂,但只要分步骤处理,其实并不难理解。
我还给这个游戏加了个可视化界面——用Tkinter画出牌面,让玩家可以拖拽选择牌,系统自动判断是否胡了,这样不仅有趣,还能帮助新手快速理解麻将规则。
写完这个小游戏,我最大的收获是:原来麻将并不是玄学,而是数学游戏!它考验的是你的排列组合能力和逻辑推理能力,很多老玩家靠经验判断“能不能胡”,其实就是大脑在高速运行类似我写的这个算法。
如果你也想试试,欢迎留言告诉我你最想优化的功能——比如支持更多花色、加入“杠”和“碰”的规则,甚至做成多人联网版本!下期我还会教你如何训练AI玩麻将,让它比你还厉害 😎
别忘了点赞关注,我们一起用代码探索生活中的智慧!







