首页/麻将胡了/构建牌堆

构建牌堆

用Python写一个“麻将胡了”游戏,教你用编程玩转传统娱乐!

你有没有想过,把小时候在老家打麻将的快乐,搬到电脑屏幕上?不是靠运气,而是靠你的代码!我就带大家用Python写一个简单的“麻将胡了”小游戏——它不仅能让你重温童年记忆,还能锻炼逻辑思维、提升编程能力,无论你是编程新手,还是想尝试趣味项目的老手,这篇文章都能带你一步步实现这个看似复杂实则有趣的项目。

为什么选“麻将胡了”?
麻将是中国最具代表性的传统游戏之一,讲究策略、计算和心理博弈,但现实中,找人凑局不容易,而且规则繁杂,如果我们能用代码模拟出一套完整的麻将逻辑,不仅方便随时玩,还能扩展成多人在线版本(比如微信小程序或网页版),简直是一举多得!

准备工作:Python基础+几个小库
你需要安装Python 3.8以上版本,并确保已安装numpy用于数组处理,以及random用于洗牌和发牌,如果还没装,直接运行:

pip install numpy

核心逻辑拆解:

  1. 牌类设计:麻将有万、筒、条三种花色,每种1-9点数,共27张;再加上东南西北中发白,共8张字牌,总共34张,我们可以用列表存储所有牌,再随机打乱。
  2. 发牌与手牌管理:每人摸13张牌,最后补一张形成14张,我们要检查是否“胡牌”——这可是关键!
  3. 胡牌判定规则:标准规则是“四组一对”,即4个顺子或刻子 + 1对将牌,123万、456筒、77条、888条、红中(一对)就是胡牌。

代码实现(简化版):
我先给你一个可运行的最小原型:

import random
import numpy as np
tiles = [i for i in range(1, 10)] * 4  # 万、筒、条各36张
tiles += [10, 11, 12, 13] * 4  # 字牌:东、南、西、北(数字表示)
tiles += [14, 15, 16, 17] * 4  # 中、发、白、红中(实际用数字代表)
def deal_hand():
    random.shuffle(tiles)
    return tiles[:14]
def is_valid_set(group):
    """判断是否为顺子或刻子"""
    if len(group) == 3:
        if group[0] == group[1] == group[2]:  # 刻子
            return True
        elif group[0] + 1 == group[1] and group[1] + 1 == group[2]:  # 顺子
            return True
    return False
def check_win(hand):
    """检测是否胡牌:需满足4组+1对"""
    from collections import Counter
    count = Counter(hand)
    # 找到所有可能的组合
    pairs = [k for k, v in count.items() if v >= 2]
    if not pairs:
        return False
    for pair in pairs:
        temp_hand = hand.copy()
        temp_hand.remove(pair)
        temp_hand.remove(pair)
        # 尝试分组
        groups = []
        while temp_hand:
            tile = temp_hand.pop(0)
            found = False
            for i, g in enumerate(groups):
                if len(g) < 3 and (g[-1] + 1 == tile or g[-1] == tile):
                    groups[i].append(tile)
                    found = True
                    break
            if not found:
                groups.append([tile])
        if len(groups) == 4 and all(is_valid_set(g) for g in groups):
            return True
    return False
# 模拟一局
hand = deal_hand()
print("你的手牌:", sorted(hand))
if check_win(hand):
    print("恭喜!你胡了!")
else:
    print("没胡,继续努力!")

这段代码虽然简略,但已经实现了基本功能:发牌、胡牌判断,你可以把它运行起来,看看是不是每次都能胡?其实不然,因为规则太复杂,这里只是初步版本,真正的麻将算法需要更复杂的递归回溯(比如用DFS遍历所有可能组合),但这已经足够作为入门项目!

为什么值得做?

  1. 学习价值高:你会学到数据结构(列表、字典)、函数封装、递归思想。
  2. 成就感强:看着自己写的程序能自动识别胡牌,比真打麻将还爽!
  3. 扩展性强:加个GUI界面(Tkinter)、做成网页(Flask)、甚至接入AI预测最优打法,都是下一步方向!


编程不仅是工具,更是创造力的延伸,通过写一个“麻将胡了”游戏,我们不仅能理解传统游戏的底层逻辑,还能把文化传承变成代码世界的一部分,下次聚会时,别光聊麻将,试试用你的程序来一场“代码对决”吧!

如果你觉得有趣,欢迎留言告诉我你想加什么功能——比如支持多人联机、AI对手,或者加入语音提示!我们一起把传统玩出新花样!

构建牌堆

本文转载自互联网,如有侵权,联系删除

麻将胡了官方网站