在学习麒麟子大大的幼麟麻将, 探讨下有癞子麻将胡牌算法.

麒麟子大大的幼麟麻将 是没有百搭.癞子的. ,但是我平时玩的麻将,白板是癞子财神, 一个人最多可以拥有4张,
那么计算胡牌的时候, 如果采用暴力计算,最多可能需要343434*34 种胡牌算法, nodejs,本来计算能力就不是很突出,需要花费大量的时间来计算.
不是论坛上各位大神们有没有更好用一些的胡牌算法? 万分感谢~

3赞

开多线程+递归 4张万能牌不多了,6张的都有

正在做一个有癞子玩法的麻将,最多可能有8张癞子。

我们的番型比较少逻辑也不太复杂,所以采用的策略是:

  • 首先忽略癞子牌
  • 依据手里的普通牌,从最大番型开始逆推是否可胡
  • 如果可胡的话,算出癞子牌代表的牌面

之前还考虑了另一种方案,服务器端默认癞子牌为某个牌面,玩家自己决定(手动点选)癞子代表哪张牌,玩家改变癞子牌代表牌面后计算是否可胡。这样就规避了穷举的运算量,但相对的在交互方案上面会更复杂,也会增加客户端的开发量。

也考虑了很多其他的策略:

  • 提前穷举算好,写到数据库里,算得时候排好序,从数据库里查(8张数据量还是太大。。。)
  • 用一定的算法排除某些取值,这样可以减少一些运算量
  • 多种方案组合计算

我们服务器端是java写的

关注一下,这个确实是个难点,穷举计算那根本玩不下去。

还没做过麻将,不过穷举算法肯定不行啊.
换个思路就好了.
已知现在的牌,然后计算出胡最大的牌需要几张百搭,百搭数够就胡了呗.
从大到小计算,应该很容易
PS:不容易也别喷我,没做过,不知道

服务器的也启动起来了吗?我部署的时候启动start_all 脚本会报错误。

不知你们可有思绪?

我的项目有带这个算法的,之前用js写,性能太差,就用了js调c++,在c++里写,性能可以,已经在上线运行了

简单递归就ok了。
数组a[3][10]代表牌的手里的牌,有几张就对应的二维数组就+1个。

func hupai(a[3][10],laizi)

for(i = 0; i < 3; ){
for(j = 1; j <= 9;) {
一直++j到a[i][j] != 0
如果(j > 9)就 ++i
然后 continue;
1).成对 (a[i][j] >= 1 有一对将)// 差1个就补一个,laizi-1, 然后递归(hupai(a[3][10] - 当前已经用了的牌组), laizi-已经用了的个数)
2) 成连子(a[i][j] >=1 && a[i][j+1]>=1&& a[i][j+2] >=1 ) //如果其中有不等于1 laizi就减一,递归 (hupai(a[3][10] - 当前已经用了的牌组), laizi-已经用了的个数)
3 )成3 同上
4)都不满足,当前分之continue

//特殊牌牌行特殊先处理,比如什么13,1等,如果要记录翻书,就hupai参数递归传递下去。
//终止条件为牌剩余2或者剩余3、剩余2成对,不足补齐癞子。癞子不足continue没胡牌,任意一分之走到最后表示胡牌。如果要记录最高翻书就把所有分之走完,传递的胡牌参数取最高。
//4张牌多翻的情况我还没想好,应该可以可以在上路分之选择中多加一个分之ok
}
}

对了,注意数组越界,伪代码没处理,简单来说如果数组越界代表当前分之停止,不满足胡牌条件。相当于分之裁剪了

初略想的,按理时间复杂度应该不算高

优化 就可以hupai再多一个参数,传递当前剩余牌数过去

整个C++的模块不就搞定了嘛,瞎操心。

赚钱的东西谁和你探讨。十几年前很多算法论坛探讨这个的:),你错过了学习的时代,又看多了糟粕的代码。等哪天棋牌不赚钱了看有没人开源个真正商业版的代码给你看。

这个你要看算法书,就去看 alpha-beta 剪枝。

真正的算法和语言性能关系不太大,就拿慢点的python写也一样秒杀汇编,只看写的人的算法水平和对语言的熟练程度

你说的phython写的秒杀汇编不靠谱吧!还有,在实际项目中,实用就好,哪有时间找最优算法(我们是小公司)

我写的天津混吊麻将,也是这个思路,刚好和你的一样,不约而同,哈哈

你这个应该是目录错了 ,仔细检查下.

谢谢答复.我自己还是使用了最笨的办法, 循环遍历, 当有4张癞子牌, 全部计算下来 大概500毫秒, 普通的牌基本就可以忽略了, 当然4张癞子全在一个人手里概率还是蛮小的. 所以 就先将就这么使用了. 后续打算专门弄个线程来进行胡牌计算, 帮node 的单线程分担下.

说的有道理, 看来麻将赚钱的时代过去了. 不赚钱了,所以才有源代码公布出来.

哈哈哈 不过我也就当自己娱乐, 跟朋友玩一玩. ,本身我自己就是麻将爱好者,现在周末都去朋友家玩. 以后就可以自己手机上玩玩啦. 边娱乐边学习.

只要有需求,麻将就能赚钱。这跟开不开源没关系。产品又不值钱

https://github.com/yuanfengyun/qipai

高效的麻将胡牌算法,能处理任意张赖子:

速度:1S左右处理100万次每次四个赖子的麻将判胡;5秒处理1亿次八个赖子判胡(golang虚拟机上实测)。

实现:

基于花色切分,然后查表。

有多种语言版本:lua、c++、c#、golang、js、java。

1赞

你好,请问代码在哪里可以找到,谢谢了!

癞子麻将胡牌算法JS版本,适合cocos-creator,pomelo,node,laya,egret

  • 本算法10W次随机14张牌胡牌检测耗时4700毫秒,其中随机生成10万次14张牌,耗时2000毫秒。
  • 所以10W次随机14张牌胡牌计算为2700毫秒 cpu5代I7
  • 本算法支持七对判断,支持癞子,支持随机癞子,支持风牌

check.rar (2.1 KB)

虽然用不上,顶你的开源精神