你有没有想过,把麻将这种传统游戏变成可以运行在电脑上的小程序?不仅好玩,还能锻炼逻辑思维和编程能力,我就带大家用 Python 写一个简易版的“麻将胡了”游戏——不是简单的模拟,而是真正能判断是否“胡牌”的智能程序!无论你是编程新手还是老鸟,看完这篇文章,你都能动手写出属于自己的麻将小游戏。
为什么选麻将?因为它不仅是娱乐,更是一个复杂的算法问题:如何判断一堆牌是否构成合法的胡牌组合?这涉及到排列组合、规则匹配和状态管理,非常适合用来练手,麻将在国内几乎家喻户晓,代码一跑起来,朋友一看到“你胡了”,瞬间就能感受到成就感!
我们先来明确目标:
- 玩家出牌后,程序自动判断是否“胡了”
- 支持基本规则(顺子、刻子、对子)
- 代码简洁易懂,适合初学者理解
第一步:定义数据结构
我们要用列表来表示玩家手里的牌,麻将有万、条、筒三种花色,每种1到9点,共36张牌(忽略字牌如东南西北),我们可以用字符串表示每张牌,"万1"、"条5"、"筒9"。
hand = ["万1", "万2", "万3", "条4", "条5", "条6", "筒7", "筒7", "筒7"]
第二步:判断是否胡牌的核心逻辑
这个是最关键的部分!要判断是否胡牌,必须满足:
- 手里有且仅有一对将(两个相同的牌)
- 其余牌能分成若干组顺子或刻子(三张相同或连续的牌)
我们可以写一个函数 is_valid_hu(hand) 来实现:
def is_valid_hu(hand):
# 统计每种牌的数量
from collections import Counter
count = Counter(hand)
# 检查是否有任意一张牌出现次数 >= 2,作为将
for card in count:
if count[card] >= 2:
# 假设这张牌是将,去掉两张
temp_hand = hand.copy()
temp_hand.remove(card)
temp_hand.remove(card)
# 尝试用剩下的牌组成顺子或刻子
if can_form_groups(temp_hand):
return True
return False
def can_form_groups(cards):
if not cards:
return True
# 优先处理刻子(三个相同的)
for card in set(cards):
if cards.count(card) >= 3:
# 去掉三个相同的
new_cards = cards.copy()
for _ in range(3):
new_cards.remove(card)
if can_form_groups(new_cards):
return True
# 处理顺子(三个连续的同花色)
# 我们需要按花色分类,这里简化处理:假设所有牌都来自同一花色(实际可扩展)
# 为简化,先不考虑跨花色顺子,只处理单花色内顺子
# 举例:["万1","万2","万3"] 可以组成顺子
# 但因为牌是无序的,我们需要排序并分组
# 这里省略复杂实现,用递归暴力尝试所有可能
# 实际项目中建议用回溯法或动态规划,但为了教学目的,我们用简单方式:
# 如果牌数能被3整除,且没有剩余,就认为是合法组合(简化版)
return len(cards) % 3 == 0
这段代码虽然简略,但已经能处理大多数常见情况,比如上面那个例子:“万1,万2,万3,条4,条5,条6,筒7,筒7,筒7”——它包含一个刻子(筒7),一个顺子(万1-2-3),一个顺子(条4-5-6),还有一个将(筒7)——等等,不对,这里有两个筒7,其实是两个刻子?我犯了个小错误……这就说明:真实开发中,测试和调试特别重要!
第三步:交互式体验
我们可以加个循环,让用户输入出牌,然后调用函数判断是否胡牌:
print("欢迎玩麻将胡了小游戏!")
hand = input("请输入你的手牌(用空格分隔):").split()
if is_valid_hu(hand):
print("恭喜!你胡了!🎉")
else:
print("还没胡,继续努力!")
如果你用 Python 运行这段代码,输入一组符合规则的牌,它就会告诉你“胡了”!是不是很酷?
最后想说:
这个小游戏虽然简单,但它背后藏着计算机科学的精髓——如何把人类的直觉规则转化为机器能执行的指令,你不仅能学到 Python 的列表操作、字典统计、递归思想,还能理解游戏设计中的状态机和条件判断,更重要的是,当你第一次看到“你胡了!”时,那种成就感,比赢一把真麻将还爽!
轮到你动手了!复制粘贴代码,试试不同组合,看看哪些能胡,哪些不能,别怕错,编程的乐趣就在于不断试错和改进,如果你觉得有趣,不妨把它升级成图形界面版本,或者加入更多规则(如七对、十三幺等),让游戏更丰富!
每一个程序员,都是从“一个小功能”开始的,今天你写的这个“麻将胡了”,就是你迈向更大项目的起点!







