棋牌游戏算法——麻将系列总结

2023-05-16

麻将介绍

麻将的基本规则都是一样的,我就不累赘了。

        我从事棋牌工作五年了,开发过无数的麻将玩法,如柳州麻将,转转麻将,红中麻将,来宾麻将,广东麻将,清远麻将,长沙麻将,北海麻将,基本上两广的麻将都写过(狗头),所以对麻将开发有一定的理解。

        我自己也开发了一款棋牌APP游戏,里面涵盖了很多麻将的玩法,欢迎私信我学习交流。

       我们先把不同规则的麻将进行一个简单的归类,众所周知,全国各地每个地方的麻将叫法都不一样(注意:这里只是说叫法,打法可能相同),带风的,带花的,带癞子(精)的,只能自摸的,带番的,中码的,特殊牌型的,什么样的规则都有,但是核心算法却是百变不离其中。

按照惯例,先展示一部分麻将的界面,其中界面来源棋牌APP。

红中麻将:

柳州麻将:

 转转麻将:

广东推倒胡:

从上面的几个麻将界面可以看出,按花色分类,可以分成 万子、条子、筒子、风字、癞子五大类,基本上每一类都是独立的,那么只要手牌满足每一类都能成牌,那就是可以胡了,按照这个逻辑,下面开始介绍麻将经典的胡牌算法。

麻将胡牌算法

        麻将的核心算法,主要就是胡牌算法了,主流的胡牌算法有两种方式,一种是回溯法(性能低),另一种是查表法下面我依次对这两种算法进行介绍。

回溯法:

        所谓回溯,就是按照符合规则的牌型对所有手牌依次进行组合,首先将花色进行分类,按照刻字,顺子,将,这样可组合的方式对每一种花色进行组合(癞子可以作为任意牌添加进去),每次组合成功,将组合从手牌移除,重新进行回溯,如果有一次回溯失败,这样代表此组合不成立,换一种组合重新回溯,直到所有牌被移除或者所有组合都失败为结束。

        回溯法的优点是比较好理解,逻辑上比较简单,但是缺点也很明显,效率太低!特别是有癞子的时候,回溯的次数非常非常多,这里也可以采用多路回溯法,但性能依然不跟查表法媲美。回溯法的另一个优点是可以在回溯的过程中计算番型,但这会大大提高代码的复杂性,因为本身番型是属于业务逻辑,不是胡牌算法本身通用的。

查表法:

        所谓查表,顾名思义,就是想知道能不能胡牌,只需要把手牌放进去查一下表,就知道了。那么问题来了,什么样的表呢。说白了,就是将所有可能形成组合穷举出来,放到Map里,打个比方。假设我现在手牌是清一色,那么有多少种组合呢,11122233344455  12345678911234 22334455667788 .......等等等N种,所以这个表的数据非常非常大,大概在几百万条,会占据一定的内存空间(但其实不到100M)、构造这张表的难度非常大,要考虑各种可能,从1张牌到14张牌,从杠子到对子,还要支持癞子。

        查表法的优点就是在于其性能极其高,每一种花色只需要一次hash查找就能得出结果,但是其缺点呢除了上面所说的占空间外,对于一些特殊的牌型或者特殊的组合,查表法是无济于事的,比如“七小对”,“十三幺”,这个时候还是不得不使用回溯法来进行计算。同时,查表法也不支持番型判定的。

代码实例:

回溯法可以参考我字牌系列总结篇,一样的思路,包括多路回溯

查表法由于代码较为复杂,篇幅很大计算量很多,有需要可以私信我

从下图可以看出,总共需要需要12个表,分为带将的和不带将的,带癞子的和不带癞子的

        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

棋牌游戏算法——麻将系列总结 的相关文章

随机推荐

  • 【问题解决】Script file ‘xxx‘ is not present. (conda环境)

    新建了一个conda环境 34 tf2 34 xff0c 在该环境内想要使用pip命令下载第三方包 xff0c 结果出现问题 xff1a Script file 39 D software Anaconda3 envs tf2 Script
  • [解决numpy reshape问题]ValueError: cannot reshape array of size 1 into shape (10,2)

    问题描述 xff1a 想要将一个一维数组在内容不变的前提下变换维度 xff0c 可是一直报错 ValueError cannot reshape array of size 1 into shape 10 2 代码如下 xff1a ladd
  • 【问题解决】SUMO——netedit编辑时键盘失效

    问题描述 xff1a 使用SUMO的netedit软件编辑路网信息的时候 xff0c 发现只能输入数字 xff0c 无法输入字符 解决方法 xff1a 将键盘模式切换成英文后 xff0c 就可以正常输入了
  • 用git命令行向gitee推送代码

    目录 1 生成个人公钥 2 在gitee上添加个人公钥 3 添加远程主机到本机SSH可信列表 4 提交本地文件 1 生成个人公钥 xff08 参考生成 添加SSH公钥 Gitee com xff09 打开git命令行 xff0c 输入命令
  • 【Anaconda环境】安装gym+pytorch

    1 创建conda新环境 conda create name gymTorch python 61 3 7 conda activate gymTorch xff08 进入新环境 xff09 python如果为3 6版本 xff0c 在导入
  • 【解决git报错 10054】OpenSSL SSL_read: Connection was reset, errno 10054

    使用git获取github上代码时报错 xff1a OpenSSL SSL read Connection was reset errno 10054 此时又必须开着vpn才能访问到github 参考网上的回答 xff0c 成功解决问题 x
  • 解决torch.from_numpy报错 (ValueError)

    变量screen的类型是numpy ndarray xff0c 使用如下代码想要将numpy数组转化为torch Tensor xff1a screen 61 torch from numpy screen 运行报错 xff1a Value
  • 【gym】env.render三种mode

    最近使用gym提供的小游戏做强化学习DQN算法的研究 xff0c 首先就是要获取游戏截图 xff0c 并且对截图做一些预处理 screen 61 env render mode 61 39 rgb array 39 上述代码是将游戏截图转换
  • python slice()函数

    slice函数会返回一个切片对象 xff0c 让数组按照该切片对象获取数据 参考自网站 xff1a Python slice 函数 菜鸟教程 slice的语法 xff1a class slice stop class slice start
  • 软件工程概论,课后作业1

    1 网站系统开发需要掌握的技术 在看了网上一些前辈的文章后 xff0c 我认为大体上有以下几点 至少熟悉一种建站程序 对空间和域名的知识有一定的了解 有一些美工基础 对编程有一些了解 代码知识基本的要懂 css 43 div会一点 简单的网
  • Debian11设置屏幕分辨率

    问题现象 xff1a 新的华硕计算机安装debian11后屏幕分辨率是1920 748并且无法修改 xff0c 换了显示屏和HDMI接口一样无法修改 使用 xrandr命令查询反馈 xrandr failed to get size of
  • matplotlib.pyplot.imshow()

    用matplotlib pyplot imshow x 函数将一个x矩阵转化为可显示的图像 这里需要注意的是x的数据类型 xff1a x为float xff0c 那么x的值要在0 1之间 xff1b x为int xff0c 那么x的值要在0
  • 使用telnet通过SMTP协议发送邮件

    1 确认本地电脑的telnet服务是否打开 2 查看邮箱授权码是否设置 在图片中有提示 xff0c 授权码是用于登录第三方邮件客户端的专用密码 xff0c 这样可以保护自己的密码不被泄露 xff0c 还能委托其他客户端进行邮件的操作 如果没
  • 在Linux环境下使用命令行编译运行C源文件

    1 安装gcc 首先如何确定是否已经安装gcc了呢 xff1f 如果有一个hello c的源文件 xff0c 那么使用命令gcc hello c 如果报出提示 xff0c command gcc not found就是代表没有安装这个程序
  • C语言的指针传递和C++的引用传递

    首先 xff0c C语言没有引用传递 C 43 43 中使用引用传递的方式是在函数的参数前加 amp 号 xff0c 如 xff1a void Delete X LinkList amp L ElemType x 声明 Delete X L
  • python 安装pandas失败的解决办法

    python 安装pandas失败的解决办法 1 首先用CMD进行安装 xff0c 安装失败 2 然后用pycharm进行安装 xff0c 同样也失败 图片省略 3 最后在pycharm中添加清华源网址 https pypi tuna ts
  • docker 容器的启动、停止和删除

    1 查看所有docker容器 查看所有在运行的容器 xff1a docker ps 查看所有容器 包括停止的 docker ps a 来看看他们的区别 xff1a 2 启动容器 这里我来启动第二个Redis容器 xff08 因为我已经有一个
  • 用real vnc连接服务器

    用real vnc连接服务器 xff08 一 xff09 在无法访问服务器内部网络 首先 xff0c 本地电脑需要可以ping通服务器的IP xff0c 像学校的服务器 xff0c 一般只能用学校的网络才能访问 xff0c 若在校外 xff
  • nginx配置ssl证书实现https访问

    配置ssl证书之前 xff0c 先准备SSL证书 xff0c 至于获取的途径很多 xff08 阿里云的服务 xff0c 第三方服务购买 xff09 这里不详细解释 以下是我的SSL证书 准备好证书后 xff0c 找到nginx的安装目录 x
  • 棋牌游戏算法——麻将系列总结

    麻将介绍 麻将的基本规则都是一样的 xff0c 我就不累赘了 我从事棋牌工作五年了 xff0c 开发过无数的麻将玩法 xff0c 如柳州麻将 xff0c 转转麻将 xff0c 红中麻将 xff0c 来宾麻将 xff0c 广东麻将 xff0c