开源一个不过百行代码而又强悍与效率的麻将赖子算法!!

如题:  
          博主17年开始从事棋牌游戏开发,开始接触赖子算法时,当时互联网找不到任何资料,于是自己琢磨了三天开始写出第一个算法,到目前为止已经自己写过三款不同的赖子算法,分别为:

  1. 递归法        (<1ms级 , 复杂度为:最好O(n),最差O(n^3) )
  2.优化型递归法代入法   ( us级 , 复杂度为:最好O(n),最差O(n^2) )
  3 查表法          (us级 , 复杂度为:O(1) )

      以上所有版本均支持多赖子,哪怕手牌是23张,全是赖子,均不影响复杂度,差异甚小

在征得源项目老板的同意下,分享第一种算法给游戏爱好者们学习与进步,废话少说,直接上代码如下:

-----------------------------------------------------------------------------------------------------------------------
//会牌核心算法递归版本, 由原胡牌算法演进而来,检测更全面    by    iori  2017/1/10
bool laizi_hupai_base(int *pi_mj, int i_num, int *pi_select,int laizi_val)
{
    //pi_select[]用于在递归调用时记录已经访问过的牌
    int i,j,k;
    int i_max,i_min,i_mid;
    int i_mark1,i_mark2;
    int i_have3=0 ,laizi_num = 0;
    
    for(i=0; i= 2) //能成有会刻或者顺,默认刻
                {
                        // do something  根据你的项目需求可以保存数据
                }
                else
                if( (pi_mj[i] == pi_mj[j] && pi_mj[i] == pi_mj[k]) || (laizi_num == 1 && (pi_mj[i]  ==  pi_mj[j] ||  pi_mj[j] == pi_mj[k] || pi_mj[i]  == pi_mj[k]))  )  //表示能组成刻子
                {
                        // do something
                }
                else  if (laizi_num == 1)//判断是否能成有会顺
                {
                    if(pi_mj[i] == laizi_val)
                    {
                        if(pi_mj[j] - pi_mj[k] != -1 && pi_mj[j] - pi_mj[k] != -2 && pi_mj[j] - pi_mj[k] != 1 && pi_mj[j] - pi_mj[k] != 2 )
                            continue;
			//这里根据项目不同的牌值区分 中发白与风牌过滤掉,博主这个项目没有,就不补上了
                    }else if(pi_mj[j] == laizi_val)
                    {
                        if(pi_mj[i] - pi_mj[k] != -1 && pi_mj[i] - pi_mj[k] != -2 && pi_mj[i] - pi_mj[k] != 1 && pi_mj[i] - pi_mj[k] != 2 )
                            continue;
                    }else if(pi_mj[k] == laizi_val)
                    {
                        if(pi_mj[i] - pi_mj[j] != -1 && pi_mj[i] - pi_mj[j] != -2 && pi_mj[i] - pi_mj[j] != 1 && pi_mj[i] - pi_mj[j] != 2 )
                            continue;
                    }
                        
                }else
                if( i_max-i_min == 2 && ( pi_mj[i] == i_mid || pi_mj[j] == i_mid || pi_mj[k] == i_mid)) //表示能组成顺子
                {
                        // do something
                }else
                    continue;
                
                //记录下来 下面递归
                pi_select[i] = pi_select[j] = pi_select[k] = 1;
                
                if( !laizi_hupai_base(pi_mj, i_num, pi_select,laizi_val) )
                {
                    pi_select[i] = pi_select[j] = pi_select[k] = 0; //递归一次结束,返回
                    continue;
                }
                
                //选择的3张成刻、顺,而剩下的和了
                return true;
            }
            
            //只剩两张牌, 相等 或者 其中一张为癞子时,满足牌型
            if( (i_have3 == 0) &&( pi_mj[i_mark1] == pi_mj[i_mark2] || pi_mj[i_mark1] == laizi_val ||  pi_mj[i_mark2] == laizi_val  ))
            {
                return true; //这里不退出,可以保存下来计算出所有能胡的牌型
            }
        }
    }
    return false;
}			

------------------------------------------------------------------ end by Iori

    算法好不好,跑一跑就知道,打上time log就明了,如有疑问,欢迎留言,支持原创,支持开源,如有转载,请与博主联系授权 !

你可能感兴趣的:(游戏算法)