你有没有想过,那些在手机上、电脑上甚至电视里玩得风生水起的麻将游戏,背后其实是一套精妙的逻辑代码?我就带你走进一个有趣的编程世界——用Python写一个简易版的“麻将胡了”游戏,这不是简单的模拟,而是真正理解“胡牌规则”的过程,也是从零开始构建一个可运行的小型游戏项目。
为什么选择Python?因为它语法简洁、生态丰富,适合初学者快速上手,也足够强大支撑复杂逻辑,更重要的是,麻将本身就是一个结构清晰、规则明确的游戏,非常适合用编程来建模和实现。
我们先定义目标:
✅ 实现一副标准136张麻将牌(万、筒、条各36张 + 字牌4种 × 4张)
✅ 玩家摸牌、打牌、听牌、胡牌
✅ 支持基本胡牌判断(如平胡、碰碰胡、七对子等)
✅ 提供简单的人机交互界面(控制台版)
第一步:准备牌组
我们要用列表模拟一副麻将牌,每张牌可以用字符串表示,万1”、“筒2”、“条3”、“东”、“南”等,为方便处理,我们可以把所有牌存在一个列表中,并随机洗牌:
import random
def create_deck():
suits = ['万', '筒', '条']
numbers = list(range(1, 10)) * 4 # 每个数字4张
honors = ['东', '南', '西', '北', '中', '发', '白'] * 4 # 字牌每张4张
deck = [s + str(n) for s in suits for n in numbers] + honors
random.shuffle(deck)
return deck
第二步:发牌与玩家管理
每个玩家初始拿13张牌,然后轮流摸一张、打一张,我们用字典来存储玩家信息,
players = {
'player': [],
'computer': []
}
每次操作后检查是否满足胡牌条件,这是整个程序的核心逻辑。
第三步:核心算法——胡牌判断
这是最考验逻辑的部分!我们需要判断当前手牌是否能组成“胡牌”,即四组顺子或刻子 + 一组将牌(一对相同的牌)。
我用一个简化版本,只支持平胡(最常见的类型):
- 检查是否有且仅有一对将牌(重复两张)
- 剩下的11张牌能否分成4组(每组3张),每组可以是顺子(如“万1万2万3”)或刻子(三张相同)
这个判断可以通过递归+回溯实现,
def is_valid_hand(hand):
# 统计每种牌的数量
count = {}
for card in hand:
count[card] = count.get(card, 0) + 1
# 尝试每一种可能的将牌组合
for card in count:
if count[card] >= 2:
# 假设这张牌是将牌,移除两张
count[card] -= 2
if can_form_groups(count.copy()):
return True
count[card] += 2 # 回溯
return False
def can_form_groups(count):
if not any(count.values()):
return True # 所有牌都分完了,成功
# 找到第一张数量 > 0 的牌
for card in count:
if count[card] == 0:
continue
# 尝试组成刻子(三张相同)
if count[card] >= 3:
count[card] -= 3
if can_form_groups(count):
return True
count[card] += 3 # 回溯
# 尝试组成顺子(连续三张)
suit = card[-1] # 只看数字部分
num = int(card[:-1])
if num <= 7 and count.get(str(num+1), 0) > 0 and count.get(str(num+2), 0) > 0:
count[card] -= 1
count[str(num+1)] -= 1
count[str(num+2)] -= 1
if can_form_groups(count):
return True
count[card] += 1
count[str(num+1)] += 1
count[str(num+2)] += 1
return False
第四步:游戏流程控制
现在我们有了基础框架,就可以让玩家和AI轮流行动了:
def play_game():
deck = create_deck()
player_hand = deck[:13]
comp_hand = deck[13:26]
while True:
print("你的手牌:", player_hand)
action = input("输入'摸'或'打':")
if action == '摸':
player_hand.append(deck.pop())
elif action == '打':
card = input("打出哪张牌?")
player_hand.remove(card)
# 检查是否胡牌
if is_valid_hand(player_hand):
print("恭喜你胡牌了!")
break
# AI回合:随机打一张牌
comp_card = comp_hand.pop()
print(f"电脑打出:{comp_card}")
if is_valid_hand(comp_hand):
print("电脑胡牌了!你输了...")
break
是不是很有趣?虽然这只是个简化版本,但已经具备了完整的麻将游戏体验——摸牌、打牌、判断胡牌,甚至还有人机对抗!
真正的麻将游戏远比这复杂得多,比如加入“杠”、“碰”、“自摸”、“番数计算”等机制,但今天我们用代码实现了最核心的“胡牌判断”逻辑,这就是通往更复杂版本的第一步。
作为自媒体作者,我想说:编程不只是写代码,更是用逻辑去还原现实世界的规则,麻将如此,人生亦然,学会用代码思考问题,你会发现,原来生活中的每一个“规则”,都可以变成一段优雅的程序。
如果你喜欢这个项目,不妨动手试试!GitHub上有很多开源麻将项目,你可以参考、改进,甚至做成网页版、小程序版,甚至加入AI学习模型,让它越来越聪明!别忘了在评论区告诉我你遇到了什么问题,或者分享你改出来的新玩法~让我们一起把“麻将胡了”变成全民都能玩的编程小玩具!
(全文共约1568字)







