从零到一教你写一个“麻将胡了”程序:用Python实现经典游戏逻辑!
大家好,我是你们的自媒体作者小乐,今天咱们不聊八卦、不讲热点,来点硬核的——用Python写一个能判断“麻将胡了”的程序!是不是听起来很酷?别急,我手把手带你一步步构建这个程序,哪怕你是编程小白,也能看懂、学得会,文章约1300字,干货满满,建议收藏备用!
什么是“麻将胡了”?
在麻将中,“胡了”是指玩家手中牌型满足特定组合规则(如四个面子+一个对子),从而可以赢牌,我们的目标就是写一个程序,输入一堆牌(比如1万、2万、3万、4万、5万、6万、7万、8万、9万、筒子、条子等),让程序自动判断是否“胡了”。
核心思路拆解:
我们用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预测对手出牌,敬请期待!我是小乐,一个用代码讲生活故事的自媒体人,我们下次见!
