跑胡子小写“一”到“十”各4張共40张,大写“壹”到“拾”各4张共40张
砌牌:跑胡子为3人同玩,庄家砌21张其他方位砌20张,留19张在墩上
一对牌:手中2个相同的牌为1对。
一坎牌:手中3个相同的牌为1坎
一提牌:手中4个相同的牌为1提。
一句话:砌牌后手中的牌依据规则组合成相连的三张,比如小四、五、六称为一句话。另外二、七、十组合也称为一句话
绞牌(混对):当1对大牌与1张相同的小牌,或者1对小牌与1张相同的大牌组合时成为絞牌。如1对小九与1张大玖
1.几组牌(三张一组)+将(一对),跑胡子可以没将
2.都有:一句话(顺子)、提(杠)、坎(碰)、对(将)洏跑胡子多一种绞牌及二七十特殊牌组
3.跑胡子还有最小胡息、翻数、翻醒、跟醒等更复杂的算分逻辑
4.此算法简单修改后可适用麻将只胡一張牌叫什么胡,并且涵盖听牌功能
回溯算法,在我看来是一种用递归方式穷举所有解的算法写的差的回溯算法跟穷举方法的效率差不多,甚至更差(代码可读性差、递归占用较多堆栈、更容易出错)但好的回溯算法结合了优秀的”截枝逻辑”,可以使算法效率提升非常多倍的同时还能得到所有需要的解。总的来当你想得到一种、多种甚至所有解的时候,使用穷举效率又太慢这时回溯算法就是很好的選择。
跑胡子就很适合用回溯法求解,一是因为当它有赖子牌(万能牌)时会出现很多种不同的解。二是由于它复杂的算分系统让求最优解(得分最高)成为一件较难的问题。
已实现java版跑胡子胡牌算法因算分规则复杂多变,本算法并不返回一个最优解而是得到所囿解。效率经测试:1ms以内
适用任意浏览器调出开发者工具在Console中输入以下指令即可配牌测试,注意房间号'room_id':276262要和上方当前房间号对应上unusedPaiArr是底牌数组会先给庄家发20张再给闲家发20张然后再给庄家发一张牌。
这是第一代核心算法目的是得到所有的解还有很大的优化空间,比如顺子混对只能用1个癞子坎可以加一张王组合成提等。
* 牌数组,索引=牌id,值=牌数量
* 剩余牌的数量,只有全部拆完才算胡
* 保存所有可以胡的牌型
* 所有可鉯胡牌型用到的癞子保存在这里
// 手里有3张以上相同的不可以拆
// 剩余3张以内的 0是拆完了可以胡 1不能胡 2刚好是个将就可以胡
// 保存癞子代替的牌
// 剩余2张能否做将
// 处理边界的问题,9 10 11变成顺子的问题
// 只有是2的时候才组合2710