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

大家写过游戏都会发现,每一种游戏牌的组成类型不一样的,比如斗地主判断牌型,和德州判断牌型就不一样,最近写德州扑克游戏发现其实所有判断牌型的算法都是一样的。

挑出牌出4张,3张,2张,1张出现的次数,然后各自组合看能出什么样的牌型,最后就能确定下来具体的牌型。下面是具体的代码实现。。。。

一.判断牌型

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

//分析结构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;

}

扫描二维码,添加好友,一起探讨斗地主游戏开发

————————————————
版权声明:本文为CSDN博主「wojiushi3344」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wojiushi3344/article/details/44851535/

棋牌游戏判断牌型算法---适合所有的棋牌游戏相关推荐

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

    棋牌游戏开发咨询 QQ:325131039 棋牌游戏开发咨询交流群: 490287966 由于近年来网络棋牌游戏的火爆导致个各个地区的特色棋牌游戏进入开发的红火时期,也有越来越多的团队个人开始研究棋牌 ...

  2. 棋牌游戏通用牌型数值化方案

    棋牌游戏通用牌型数值化方案 1. 数值化方案背景: 游戏中,要对各个玩家的牌进行比较,排序.通常情况下,我们会这样组织数据: BYTE cbCardData[PlayerCount][CardCoun ...

  3. 德州扑克实践之二------判断牌型

    实践二------牌型判断 起始 现在到了,第二步,上一步我们已经做好了发牌模块,有了手牌,就需要判断牌型了,平时打扑克时,我们需要使用大脑进行判断自己手里的牌属于那种类型的,现在我们需要通过程序来进 ...

  4. 纸牌游戏的牌型分析和出牌策略

    前段时间遇到这个问题,想了一些,也搜了一些,发现网上也只是零星讲了一些笼统思想,复杂的我也没看懂,便自己去尝试写了一些代码来处理这个问题.还是先说明一下适用场景,只是针对一副牌去掉大小王,规则是常见的 ...

  5. 跑得快—扑克牌游戏出牌规则(JavaScript)

    第一次写这种棋牌出牌的规则.第一想到的是正则,花了两天时间写出来,反复调试,大致应该没有BUG.代码有点乱,但是具体注释都写了. 规则JS /*** Created by jialin on 2016 ...

  6. 关于棋牌游戏的福建十三水的一个工具类(牌型分析、大小对比、自动摆牌、获取所有牌型组合)

    关于棋牌游戏的福建十三水的一个工具类(牌型分析.大小对比.自动摆牌.获取所有牌型组合) 写的比较简陋,仅仅只是实现了而已,谈不上美观,大神们不要喷我 直接上图(个人研究使用,不允许用于不正当途径) 1 ...

  7. 斗地主AI算法——第六章の牌型判断

    本章实现了上一章提到的检查当前是否只是一手牌函数ins_SurCardsType /* 检查剩余的牌是否只是一手牌是: 返回手牌类型数据 不是:返回错误类型(cgERROR) */ CardGroup ...

  8. 斗地主含赖子的牌型判断算法

    目标 打出n张牌(可能含有赖子),需要判断这n张牌能组成什么牌型(对子.顺子.飞机-). 整体思路:假设我们已经提前那种牌作为癞子. 整体思路 1.找出n张牌中的赖子,假设有m个赖子 2.计算出这剩余 ...

  9. 算法题 牌型判断 Java

    题目 德州扑克的花型由 N 张扑克牌组成 0<N<8,可以组成的牌型按照价值从高到低来区分分别为: 皇家同花顺:最高为 Ace (一点)的同花顺. 如 A K Q J 10 的同花顺 同花 ...

  10. lua——赢三张牌型处理相关算法(上)——牌值数据

    赢三张,我们东北管这个叫拖拉机.其他的几个名称是违规的.. 是一个简单粗暴的扑克牌(dubo)游戏.玩家每人三张牌,通过特定的牌型规则进行比大小.(押注什么的就不说了,具体详细规则请参考百度) 最近一 ...

最新文章

  1. HDU 3336 Count the string KMP
  2. 清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
  3. 【ABAP】BASE64加密及解密
  4. 长春师范大学 于繁华现任计算机学院工程学院院长,硕士生导师--姚亦飞
  5. 极限编程阅读笔记--第二篇
  6. Django中模型类 属性-学习笔记
  7. group by 查询分组后 各组的内部条数与组的条数
  8. headfirst设计模式(2)—观察者模式
  9. zTree动态添加节点
  10. 一个卡片式的ViewPager,带你玩转ViewPager的PageTransformer属性!
  11. 纯Java文件操作工具,支持文件、文件夹的复制、删除、移动
  12. 装机配置相关---激活win7旗舰版 office
  13. 无线路由器连接有线路由器设置
  14. 【读书笔记】Jenkins权威指南
  15. 解决耳机插在主机上没有声音的问题
  16. 关于bat中set /p=前面加空格的bug修复方法
  17. 单片机寻迹小车ppt_基于单片机循迹小车的设计.doc
  18. Java、C++、Python、Ruby、PHP、C#和JavaScript的理解
  19. c语言下列程序段的功能,2011年计算机等级二级C语言章节习题及答案(15)
  20. php 判断号码运营商,PHP根据手机号判断运营商(详细介绍附代码)

热门文章

  1. 2021-09-26 WPF上位机 45-关键帧动画
  2. 如何设置计算机桌面待办事项,Windows电脑桌面云便签怎么设置每天提醒待办事项?...
  3. LeetCode 单调栈练习题归纳总结
  4. 灵感来了挡也挡不住,基于Redis解决业务场景中延迟队列
  5. 为项目选择的python解释器无效_尝试使PyCharm正常工作,并不断获取“未选择Python解释器”...
  6. 【SequoiaDB巨杉数据库】函数操作 $subtract
  7. BPM系统终于告一段落
  8. 11、合宙Air模块Luat开发:通过http协议获取天气信息
  9. UVA - 558 Wormholes (SPEA算法模板题)
  10. 浅析ERP系统--人资