您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等)
斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等)斗地主游戏算法牌型项目研发本篇主要讲解斗地主中如何判断一手牌的牌型。牌型火箭:即双王(大王和小王),最大的牌。炸弹:四张点数相同的牌,如:7777。单牌:任意一张单牌。对牌:任意两张点数相同的牌。三张:任意三张点数相同的牌,如888。三带一:点数相同的三张牌+一张单牌或一对牌。如:333+6或444+99。单顺:任意五张或五张以上点数相连的牌,如:45678或78910JQK。不包括2和双王。双顺:三对或更多的连续对牌,如:334455、7788991010JJ。不包括2点和双王。三顺:二个或更多的连续三张牌,如:333444、555666777888。不包括2点和双王。飞机带翅膀:三顺+同数量的单牌或同数量的对牌。如:444555+79或333444555+7799JJ四带二:四张牌+两手牌。(注意:四带二不是炸弹)。如:5555+3+8或4444+55+77。友情提示:本篇是接着上1篇讲述的,建议先看看上1篇一张牌Card的构造过程。斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌/***游戏规则牌的类型共有10种:**1.单2.对子3.3不带4.3带15.炸弹6.顺子7.4带28.连队9.飞机10.对王**@authorLeiWen@FansUnion.cn,***/1.单[java]viewplaincopy/***判断牌是否为单**@parammyCards*牌的集合*@return如果为单,返回true;否则,返回false。*/publicstaticbooleanisDan(ListCardmyCards){//默认不是单booleanflag=false;if(myCards!=null&&myCards.size()==1){flag=true;}returnflag;}2.对子[java]viewplaincopy/***判断牌是否为对子**@parammyCards*牌的集合*@return如果为对子,返回true;否则,返回false。*/publicstaticbooleanisDuiZi(ListCardmyCards){//默认不是对子booleanflag=false;if(myCards!=null&&myCards.size()==2){intgrade1=myCards.get(0).grade;intgrade2=myCards.get(1).grade;if(grade1==grade2){flag=true;}}returnflag;}3.3带1/**[java]viewplaincopy*判断牌是否为3带1**@parammyCards*牌的集合*@return如果为3带1,被带牌的位置,0或3,否则返回-1。炸弹返回-1。*/publicstaticintisSanDaiYi(ListCardmyCards){intflag=-1;//默认不是3带1if(myCards!=null&&myCards.size()==4){//对牌进行排序CardUtil.sortCards(myCards);int[]grades=newint[4];grades[0]=myCards.get(0).grade;grades[1]=myCards.get(1).grade;grades[2]=myCards.get(2).grade;grades[3]=myCards.get(3).grade;//暂时认为炸弹不为3带1if((grades[1]==grades[0])&&(grades[2]==grades[0])&&(grades[3]==grades[0])){return-1;}//3带1,被带的牌在牌头elseif((grades[1]==grades[0]&&grades[2]==grades[0])){return0;}//3带1,被带的牌在牌尾elseif(grades[1]==grades[3]&&grades[2]==grades[3]){return3;}}returnflag;}4.3不带[java]viewplaincopy/***判断牌是否为3不带**@parammyCards*牌的集合*@return如果为3不带,返回true;否则,返回false。*/publicstaticbooleanisSanBuDai(ListCardmyCards){//默认不是3不带booleanflag=false;if(myCards!=null&&myCards.size()==3){intgrade0=myCards.get(0).grade;intgrade1=myCards.get(1).grade;intgrade2=myCards.get(2).grade;if(grade0==grade1&&grade2==grade0){flag=true;}}returnflag;}5.顺子[java]viewplaincopy/***判断牌是否为顺子**@parammyCards*牌的集合*@return如果为顺子,返回true;否则,返回false。*/publicstaticbooleanisShunZi(ListCardmyCards){//默认是顺子booleanflag=true;if(myCards!=null){intsize=myCards.size();//顺子牌的个数在5到12之间if(size5||size12){returnfalse;}//对牌进行排序CardUtil.sortCards(myCards);for(intn=0;nsize-1;n++){intprev=myCards.get(n).grade;intnext=myCards.get(n+1).grade;//小王、大王、2不能加入顺子if(prev==17||prev==16||prev==15||next==17||next==16||next==15){flag=false;break;}else{if(prev-next!=-1){flag=false;break;}}}}returnflag;}6.炸弹[java]viewplaincopy/***判断牌是否为炸弹**@parammyCards*牌的集合*@return如果为炸弹,返回true;否则,返回false。*/publicstaticbooleanisZhaDan(ListCardmyCards){//默认不是炸弹booleanflag=false;if(myCards!=null&&myCards.size()==4){int[]grades=newint[4];grades[0]=myCards.get(0).grade;grades[1]=myCards.get(1).grade;grades[2]=myCards.get(2).grade;grades[3]=myCards.get(3).grade;if((grades[1]==grades[0])&&(grades[2]==grades[0])&&(grades[3]==grades[0])){flag=true;}}returnflag;}7.王炸[java]viewplaincopy/***判断牌是否为王炸**@parammyCards*牌的集合*@return如果为王炸,返回true;否则,返回false。*/publicstaticbooleanisDuiWang(ListCardmyCards){//默认不是对王booleanflag=false;if(myCards!=null&&myCards.size()==2){intgradeOne=myCards.get(0).grade;intgradeTwo=myCards.get(1).grade;//只有小王和大王的等级之后才可能是33if(gradeOne+gradeTwo==33){flag=true;}}returnflag;}8.连对[java]viewplaincopy/***判断牌是否为连对**@parammyCards*牌的集合*@return如果为连对,返回true;否则,返回false。*/publicstaticbooleanisLianDui(ListCardmyCards){//默认是连对booleanflag=true;if(myCards==null){flag=false;returnflag;}intsize=myCards.size();if(size6||size%2!=0){flag=false;}else{//对牌进行排序CardUtil.sortCards(myCards);for(inti=0;isize;i=i+2){if(myCards.get(i).grade!=myCards.get(i+1).grade){flag=false;break;}if(isize-2){if(myCards.get(i).grade-myCards.get(i+2).grade!=-1){flag=false;break;}}}}returnflag;}9.飞机[java]viewplaincopy/***判断牌是否为飞机**@parammyCards*牌的集合*@return如果为飞机,返回true;否则,返回false。*/publicstaticbooleanisFeiJi(ListCardmyCards){booleanflag=false;//默认不是单if(myCards!=null){intsize=myCards.size();if(size=6){//对牌进行排序CardUtil.sortCards(myCards);if(size%3==0&&size%4!=0){flag=isFeiJiBuDai(myCards);}elseif(size%3!=0&&size%4==0){flag=isFeiJiDai(myCards);}elseif(size==12){flag=isFeiJiBuDai(myCards)||isFeiJiDai(myCards);
本文标题:斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等)
链接地址:https://www.777doc.com/doc-2432902 .html