斗地主牌型基本算法升级版本

斗地主牌型基本算法升级版本

好久没更新博客了,前段时间和朋友一起开了一个公司 做APP,最后失败了。现在又开始做棋牌游戏了,最近在看网狐的源码,发现里面斗地主的基本算法太强大了,现在想想我原来的算法简直是弱爆了,分享一下 希望能对你有一点点帮助。以下主要涉及到判断牌型,牌型大小比较2块,如果你想了解更多关于棋牌游戏的东西请访问我的
棋牌游戏专栏

一.判断牌型

定义一个结构来表示每张相同牌的信息。

//分析结构

structtagAnalyseResult
{
BYTE                         cbFourCount;                       //四张数目
BYTE                         cbThreeCount;                      //三张数目
BYTE                         cbDoubleCount;                     //两张数目
BYTE                         cbSignedCount;                    //单张数目
BYTE                         cbFourCardData[MAX_COUNT];        //四张克
BYTE                         cbThreeCardData[MAX_COUNT];       //三张扑克
BYTE                         cbDoubleCardData[MAX_COUNT];      //两张扑克
BYTE                         cbSignedCardData[MAX_COUNT];      //单张扑克
};

当我们需要判断牌型的时候,先分析牌把对应的数据存放到上面的结构体。然后根据不同牌型的规则来判断即可。主要通过下面2个函数.话不多说直接上源代码:

1.      //分析扑克(参数:1将要出牌的数据,出牌的张数,out存放分析的结构体)

void CGameLogic::AnalysebCardData(constBYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult & AnalyseResult)
{
         //设置结果
         ZeroMemory(&AnalyseResult,sizeof(AnalyseResult));

         //扑克分析
         for(BYTE i=0;i<cbCardCount;i++)
         {
                   //变量定义
                   BYTE cbSameCount=1,cbCardValueTemp=0;
                   BYTE cbLogicValue=GetCardLogicValue(cbCardData[i]);

                   //搜索同牌
                   for(BYTE j=i+1;j<cbCardCount;j++)
                   {
                            //获取扑克
                            if(GetCardLogicValue(cbCardData[j])!=cbLogicValue) break;

                            //设置变量
                            cbSameCount++;
                   }

                   //设置结果
                   switch(cbSameCount)
                   {
                   case1:               //单张
                            {
                                     BYTE cbIndex=AnalyseResult.cbSignedCount++;
                                     AnalyseResult.cbSignedCardData[cbIndex*cbSameCount]=cbCardData[i];
                                     break;
                            }
                   case2:               //两张
                            {
                                     BYTE cbIndex=AnalyseResult.cbDoubleCount++;
                                     AnalyseResult.cbDoubleCardData[cbIndex*cbSameCount]=cbCardData[i];
                                     AnalyseResult.cbDoubleCardData[cbIndex*cbSameCount+1]=cbCardData[i+1];
                                     break;
                            }
                   case3:               //三张
                            {
                                     BYTE cbIndex=AnalyseResult.cbThreeCount++;
                                     AnalyseResult.cbThreeCardData[cbIndex*cbSameCount]=cbCardData[i];
                                     AnalyseResult.cbThreeCardData[cbIndex*cbSameCount+1]=cbCardData[i+1];
                                     AnalyseResult.cbThreeCardData[cbIndex*cbSameCount+2]=cbCardData[i+2];
                                     break;
                            }
                   case4:               //四张
                            {
                                     BYTE cbIndex=AnalyseResult.cbFourCount++;
                                     AnalyseResult.cbFourCardData[cbIndex*cbSameCount]=cbCardData[i];
                                     AnalyseResult.cbFourCardData[cbIndex*cbSameCount+1]=cbCardData[i+1];
                                     AnalyseResult.cbFourCardData[cbIndex*cbSameCount+2]=cbCardData[i+2];
                                     AnalyseResult.cbFourCardData[cbIndex*cbSameCount+3]=cbCardData[i+3];
                                     break;
                            }
                   }

                   //设置索引
                   i+=cbSameCount-1;
         }

         return;
}

2.获取具体牌的类型 (实现原理就是 通过出来的张数 和相同的牌来组合牌型 看是否满足)
//获取类型
BYTE CGameLogic::GetCardType(constBYTE cbCardData[], BYTE cbCardCount)
{
         //简单牌型
         switch(cbCardCount)
         {
         case0:      //空牌
                   {
                            returnCT_ERROR;
                   }
         case1: //单牌
                   {
                            returnCT_SINGLE;
                   }
         case2:      //对牌火箭
                   {
                            //牌型判断
                            if((cbCardData[0]==0x4F)&&(cbCardData[1]==0x4E))returnCT_MISSILE_CARD;
                            if(GetCardLogicValue(cbCardData[0])==GetCardLogicValue(cbCardData[1]))returnCT_DOUBLE;

                            returnCT_ERROR;
                   }
         }

         //分析扑克
         tagAnalyseResult AnalyseResult;
         AnalysebCardData(cbCardData,cbCardCount,AnalyseResult);

         //四牌判断
         if(AnalyseResult.cbFourCount>0)
         {
                   //牌型判断
                   if((AnalyseResult.cbFourCount==1)&&(cbCardCount==4))returnCT_BOMB_CARD;
                   //       if((AnalyseResult.cbFourCount==1)&&(AnalyseResult.cbSignedCount==2)&&(cbCardCount==6))return CT_FOUR_LINE_TAKE_ONE;
                   if((AnalyseResult.cbFourCount==1)&&(AnalyseResult.cbSignedCount==2)&&(cbCardCount==6))returnCT_FOUR_LINE_TAKE_ONE;
                   if((AnalyseResult.cbFourCount==1)&&(AnalyseResult.cbDoubleCount==2)&&(cbCardCount==8))returnCT_FOUR_LINE_TAKE_TWO;

                   returnCT_ERROR;
         }

         //三牌判断
         if(AnalyseResult.cbThreeCount>0)
         {
                   //三条类型
                   if(AnalyseResult.cbThreeCount==1&& cbCardCount==3) returnCT_THREE ;

                   //连牌判断
                   if(AnalyseResult.cbThreeCount>1)
                   {
                            //变量定义
                            BYTE cbCardData=AnalyseResult.cbThreeCardData[0];
                            BYTE cbFirstLogicValue=GetCardLogicValue(cbCardData);

                            //错误过虑
                            if(cbFirstLogicValue>=15) return CT_ERROR;

                            //连牌判断
                            for(BYTE i=1;i<AnalyseResult.cbThreeCount;i++)
                            {
                                     BYTE cbCardData=AnalyseResult.cbThreeCardData[i*3];
                                     if(cbFirstLogicValue!=(GetCardLogicValue(cbCardData)+i)) returnCT_ERROR;
                            }
                   }

                   //牌形判断
                   if(AnalyseResult.cbThreeCount*3==cbCardCount) returnCT_THREE_LINE;
                   if(AnalyseResult.cbThreeCount*4==cbCardCount) returnCT_THREE_LINE_TAKE_ONE;
                   if((AnalyseResult.cbThreeCount*5==cbCardCount)&&(AnalyseResult.cbDoubleCount==AnalyseResult.cbThreeCount))returnCT_THREE_LINE_TAKE_TWO;

                   returnCT_ERROR;
         }

         //两张类型
         if(AnalyseResult.cbDoubleCount>=3)
         {
                   //变量定义
                   BYTE cbCardData=AnalyseResult.cbDoubleCardData[0];
                   BYTE cbFirstLogicValue=GetCardLogicValue(cbCardData);

                   //错误过虑
                   if(cbFirstLogicValue>=15) return CT_ERROR;

                   //连牌判断
                   for(BYTE i=1;i<AnalyseResult.cbDoubleCount;i++)
                   {
                            BYTE cbCardData=AnalyseResult.cbDoubleCardData[i*2];
                            if(cbFirstLogicValue!=(GetCardLogicValue(cbCardData)+i)) returnCT_ERROR;
                   }

                   //二连判断
                   if((AnalyseResult.cbDoubleCount*2)==cbCardCount)returnCT_DOUBLE_LINE;

                   returnCT_ERROR;
         }

         //单张判断
         if((AnalyseResult.cbSignedCount>=5)&&(AnalyseResult.cbSignedCount==cbCardCount))
         {
                   //变量定义
                   BYTE cbCardData=AnalyseResult.cbSignedCardData[0];
                   BYTE cbFirstLogicValue=GetCardLogicValue(cbCardData);

                   //错误过虑
                   if(cbFirstLogicValue>=15) return CT_ERROR;

                   //连牌判断
                   for(BYTE i=1;i<AnalyseResult.cbSignedCount;i++)
                   {
                            BYTE cbCardData=AnalyseResult.cbSignedCardData[i];
                            if(cbFirstLogicValue!=(GetCardLogicValue(cbCardData)+i)) returnCT_ERROR;
                   }

                   returnCT_SINGLE_LINE;
         }

         returnCT_ERROR;
}

二.判断牌型大小  (其余不说,请你细细的看代码吧,如果不懂可以联系我 讨论 讨论!)

//对比扑克

bool CGameLogic::CompareCard(constBYTE cbFirstCard[], constBYTE cbNextCard[], BYTE cbFirstCount, BYTE cbNextCount)
{
         //获取类型
         BYTE cbNextType=GetCardType(cbNextCard,cbNextCount);
         BYTE cbFirstType=GetCardType(cbFirstCard,cbFirstCount);

         //类型判断
         if(cbNextType==CT_ERROR) returnfalse;
         if(cbNextType==CT_MISSILE_CARD) returntrue;

         //炸弹判断
         if((cbFirstType!=CT_BOMB_CARD)&&(cbNextType==CT_BOMB_CARD)) return true;
         if((cbFirstType==CT_BOMB_CARD)&&(cbNextType!=CT_BOMB_CARD)) return false;

         //规则判断
         if((cbFirstType!=cbNextType)||(cbFirstCount!=cbNextCount))returnfalse;

         //开始对比
         switch(cbNextType)
         {
         caseCT_SINGLE:
         caseCT_DOUBLE:
         caseCT_THREE:
         caseCT_SINGLE_LINE:
         caseCT_DOUBLE_LINE:
         caseCT_THREE_LINE:
         caseCT_BOMB_CARD:
                   {
                            //获取数值
                            BYTE cbNextLogicValue=GetCardLogicValue(cbNextCard[0]);
                            BYTE cbFirstLogicValue=GetCardLogicValue(cbFirstCard[0]);

                            //对比扑克
                            returncbNextLogicValue>cbFirstLogicValue;
                   }
         caseCT_THREE_LINE_TAKE_ONE:
         caseCT_THREE_LINE_TAKE_TWO:
                   {
                            //分析扑克
                            tagAnalyseResult NextResult;
                            tagAnalyseResult FirstResult;
                            AnalysebCardData(cbNextCard,cbNextCount,NextResult);
                            AnalysebCardData(cbFirstCard,cbFirstCount,FirstResult);

                            //获取数值
                            BYTEcbNextLogicValue=GetCardLogicValue(NextResult.cbThreeCardData[0]);
                            BYTEcbFirstLogicValue=GetCardLogicValue(FirstResult.cbThreeCardData[0]);

                            //对比扑克
                            returncbNextLogicValue>cbFirstLogicValue;
                   }
         caseCT_FOUR_LINE_TAKE_ONE:
         caseCT_FOUR_LINE_TAKE_TWO:
                   {
                            //分析扑克
                            tagAnalyseResult NextResult;
                            tagAnalyseResult FirstResult;
                            AnalysebCardData(cbNextCard,cbNextCount,NextResult);
                            AnalysebCardData(cbFirstCard,cbFirstCount,FirstResult);

                            //获取数值
                            BYTEcbNextLogicValue=GetCardLogicValue(NextResult.cbFourCardData[0]);
                            BYTE cbFirstLogicValue=GetCardLogicValue(FirstResult.cbFourCardData[0]);

                            //对比扑克
                            returncbNextLogicValue>cbFirstLogicValue;
                   }
         }

         returnfalse;
}
时间: 2024-08-12 22:24:23

斗地主牌型基本算法升级版本的相关文章

斗地主算法判断牌型

由于近年来网络棋牌游戏的火爆导致个各个地区的特色棋牌游戏开发进入红火时期,也有越来越多的团队个人开始研究棋牌游戏的开发,所以本文主旨在于各个开发人员之间的交流. 每个游戏都有属于自己的规则,当然斗地主也不例外,常斗地主的朋友可能知道在斗地主里面一共有13种牌型,你所出的牌必须符合13种的一种才能够出得了牌,这个就叫地主的规则.那么我们下面可以通过一个枚举结构来表示每一种的牌型,在这里我们把错误的牌型也当成是一种牌型. 那么在编程中我们该怎么来判断一组牌到底该属于哪一种牌型了?? ?这就是接下来我

棋牌游戏开发之地主算法判断牌型

棋牌游戏开发疑问交流 QQ:325131039(勿发广告) 棋牌游戏开发技术交流群: 490287966(勿发广告) ps: 本文转载自博主 wojiushi3344 每个游戏都有属于自己的规则,当然地主也不例外,常斗地主的朋友可能知道在斗地主里面一共有13种牌型,你所出的牌必须符合13种的一种才能够出得了牌,这个就叫地主的规则.那么我们下面可以通过一个枚举结构来表示每一种的牌型,在这里我们把错误的牌型也当成是一种牌型. [cpp] view plaincopy enum  CARD_TYPE

斗地主基本牌型判断

/** * Created by xujw on 2017/10/16. * 斗地主 * 单副扑克 * 没有癞子玩法 * 牌对象为{grade:3,face:1} * grade 牌面点数(3-13:3-K, 14:A, 15:2, 16:小王 17:大王) * face 牌面花色(1:黑桃.2:红桃.3:梅花.4:方块) */ var CARD_TYPE_INVALID = -1; // 无效手牌 var CARD_TYPE_SINGLE = 1; // 单张 var CARD_TYPE_DO

斗地主特殊牌型定义

游戏内一些牌型的定义,不做过多解释代码很详细,哪有不懂可以留言询问 public enum DDZPaiType { HuoJian("火箭",30,"HuoJian"), ZhaDan("炸弹",20,"ZhaDan"), DanPai("单牌",10,"DanPai"), DuiPai("对牌",10,"DuiPai"), SanZhangPa

中国寒龙社工包v3.34 6.1升级版本已经发布 具体请到官网下载!!感谢支持!~~~~~不会升级的请到咱们交流群!本程序在windowsxp下最为兼容 感谢支持!如果有BUG请反馈!!

寒龙社会工程包:http://pan.baidu.com/s/1dDcilBb当你看到 中国寒龙V3.34 6.1版本的发布  那么本工具包将更强大的 展现了工具包的价值! 本次开发由by:寒龙升级  感谢大家支持 如果有各位小组的支持 本人不谢感激! 当然本站内的工具包 可以提供专门店小组工具包 制作!承接QQ群:94588528 本次手动升级  修复一下几点的不足! v3.33版本出现的  各种打不开的问题 v3.33版本中出现 主程序远控不能配置的问题 v3.33版本 部分 文件夹不能打开

Python升级版本及版本升级后Yum无法使用的解决方法

#升级版本 yum -y install gcc cd /opt wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tgz tar xf Python-2.7.6.tgz  ./configure --prefix=/usr/local/python2.7  cd Python-2.7.6 ./configure --prefix=/usr/local/python2.7  make && make install mv /usr/b

蓝桥杯历届试题:牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌.一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张.这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢? 请填写该整数,不要填写任何多余的内容或说明文字. 最容易想到的方法是dfs暴力枚举,但刚上手很容易写成这样,即标记每种牌出现次数枚举所有情况可能的牌的出现情况: 错误的解法: #include<cstring> #include<cstdio&

2015 蓝桥杯:7.牌型种数

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

NTFS For Mac升级版本方法介绍

在苹果市场发展快速的今天,Mac电脑在我们日常办公中必不可少,但是我们再使用Mac电脑时常出现与Windows系统文件不兼容的问题.这时NTFS For Mac就派上用场了. NTFS For Mac在Windows系统和Mac系统之间提供无阻碍的数据交换.现在它已经升级到NTFS For Mac12了,如何升级NTFS For Mac版本呢? 小编在这里告诉大家升级版本操作起来很简单,NTFS For Mac官网会不定期的推出新版本,系统会自动检查是否有新版本推出.如果一个新版本的驱动程序已被