麻将逻辑思路

看了好多的麻将开发逻辑思路,或者是麻将源码   不是说的太复杂 就是根本看不懂

近期终于有了收获,如果有不对的地方请各位大佬指正,谢谢。

 

不管是哪一种麻将流程大同小异

简单部分

      什么 碰,杠,吃,天胡,地胡,牌型判断  ,相信其实都没什么难度最多就是 流程多一点

 

那么难点,重点在哪里呢? 我认为是胡牌(如何判断胡牌)、听牌(如何拆牌 各种情况可以胡哪些牌)

 

胡牌

   1、对胡   这个比较简单就是手牌全是对子  这个根据麻将的规则来 

    2、平胡 就是 将牌 + (5 == (碰个数 + 杠个数 + 刻子数 + 顺子数量)) 就胡了 

       胡牌肯定需要有将牌,所有首先把手牌(不包括 碰,杠)中  2,3,4 张相同的牌 都可能是将牌,每次提取其中一种,用剩余的

      牌去判断,剩余的牌肯定是  count % 3 == 0 如果count == 0 那就是胡了  。

      刻子(3张一样的) 顺子(3张同花色连续的)   我们遍历所有手牌 统计所有 可能出现的 刻子(相同刻子肯定只有一个)

      顺子(相同顺子有多个)   类似这种结构 {[1] = {顺子,1万},[2] = {顺子,1万},[3] = {顺子,1万},[4] = {刻子,2万}}

      我们需要遍历所有 组合依次取牌 其中有一个  刚好取完扑克 就判断胡成功那   如下: 

      function checkHu()

         1、检查对胡

         2、遍历将牌

         local an = 统计手牌类似结果 {[牌值]=牌数量}

         for k,v in pairs(an) do

               if v >= 2 then

                       local arrCard = 排除2个将牌的剩余手牌 

                      if true == checkPinHu(arrCard ) then

                             return true

                      end

                end

         end

      end

    function checkPinHu(arrCard ) 

             if 0 == #arrCard  then return true end--这里符合表示递归到这里胡判断成功

             local an = 统计arrCard :{[1] = {顺子,1万},[2] = {顺子,1万},[3] = {顺子,1万},[4] = {刻子,2万}}

             for k,v in ipairs(an ) do

                    local 类型,牌值 = v[1],v[2]

                    local cardData = (arrCard 去掉 当前遍历的类型扑克)

                     if true == checkPinHu(cardData )  then return true end--这里就是递归调用

             end

           return false

     end

 

  2、听牌提示

到这里讲完了胡牌,其实知道胡牌了,听牌提示自然就会了,我还是讲一下

1、当我们第摸起牌时,就会去判断是否可以听牌  

  遍历所有手牌 然后判断 哪些唯一的牌(1~9(万索筒)(东南西北 中发白 等))

  每排除的这张牌  然后其他哪些牌可以胡牌  就可以做出听牌逻辑了

  

 

到这里就讲完,胡牌与听牌了  如果各位觉得好就收藏或者打赏一下 ,如果有错误欢迎指正

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值