麻将拆塔子或拆对,依据什么

前几天刚好有项目需要胡牌算法查阅资料后,大部分胡牌算法的博客都是只讲原理实现太过简单,且没有给出测试用例然后就有了下面的这个胡牌算法,我将从算法原理和算法实现两部分展开想直接用的,直接跳到算法部分即可


这里麻将是108张牌,也就是只带万条,筒数据结构可抽象为两种形式

  • 分别将牌的类型(万,条筒)类型(type) 和值( value)设置为牌的属性
  • 将牌的值写成十六进制(十六进制一个数字可以同时表示牌值和牌型

下面将给絀牌值的数据结构


  

下面是牌对象的数据结构


每个人搬牌后,手中的牌必是14张(或8张)胡牌时需满足以下条件

  • 手中有一对将牌(两张一样的牌)
  • 剩丅的牌满足刻子(三张相同的牌)或顺子三张连续的牌

所以胡牌的数学模型可被抽象成以下公式:


搞清楚如何能够胡牌之后,下面谈一下判断胡牌的流程

  • 去除将牌得到所有去除所有将牌之后得到的数组集(去除两张相同牌得到的不同组合)
  • 遍历去除将牌之后的数组集,将數组集中的剩余手牌根据是否连续分为不同的断点**([3,4,5,7,7,7]转换为{[3,4,5],[7,7,7]}**)
  • 根据刚才得到的断点数组判断其中断点内的牌是否满足3n的格式(顺子或刻子),不滿足直接false
  • 若断点断的牌符合3n的格式(顺子或刻子),继续检查所有断点内容是否符合胡牌规则(下面代码中有详述)

不想看的直接复制(复制可直接运行)!!!


 
 
 
 
 
 
 
 
 
 
 
 
 

去除将牌返回所有可能的情况



断点后,检查所断的牌型是不是顺子或者刻子



根据拆解位检测最终是否能胡


 



大概用了两天的時间完成的感觉搞清流程和原理之后,再按着步骤去做就很简单了。只是原来写习惯java了用node.js实现时要格外注意内存泄露的问题。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信