从代码到牌桌,如何用Python实现麻将胡了游戏?手把手教你打造属于自己的桌面麻将!

edc65478933 2026-01-12 麻将胡了 3 0

你有没有想过,那些在手机上、电脑上甚至电视里玩得风生水起的麻将游戏,背后其实是一套精妙的逻辑代码?我就带你走进一个有趣的编程世界——用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字)

从代码到牌桌,如何用Python实现麻将胡了游戏?手把手教你打造属于自己的桌面麻将!