牌型
德州扑克最后会使用5张牌作为玩家最后的牌进行比大小。这也是上一篇文章一次生成五张牌的原因。
这5张牌可以组成10种牌型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| enum BrandType{ None=-1, HighCard=0, OnePair, TwoPair, ThreeOfaKind, Straight, Flush, FullHouse, FourOfaKind, StraightFlush, RoyalFlush, };
|
任意有效5张牌只会出现10种牌型,最低是高牌。
判断
排序
捋顺5张牌,以便后续开发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
inline void straightCards(Cards &cards){ for(int i=0;i<4;i++){ for(int j=i+1;j<5;j++){ if(cards.card[i].CardNum<cards.card[j].CardNum){ Number t = cards.card[j].CardNum; cards.card[j].CardNum = cards.card[i].CardNum; cards.card[i].CardNum = t; } } } }
|
五条
理论上一副牌中不会出现5个相同的数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
inline bool is5(Cards cards){ if((cards.card[0].CardNum == cards.card[1].CardNum) && (cards.card[0].CardNum == cards.card[2].CardNum) && (cards.card[0].CardNum == cards.card[3].CardNum) && (cards.card[0].CardNum == cards.card[4].CardNum)){ return true; } return false; }
|
包含A
在皇家同花顺中会用到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
inline bool isHighA(Cards cards){ for(int i=0;i<5;i++){ if(cards.card[i].CardNum==Num_A){ return true; } } return false; }
|
同花
直接判断结构体中的花色是否相同
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
inline bool isFlush(Cards cards){ for(int i=1;i<5;i++){ if(cards.card[i].CardDecor!=cards.card[i-1].CardDecor){ return false; } } return true; }
|
顺子
两两差一。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
inline bool isStraight(Cards &cards){ straightCards(cards);
for(int i=1;i<5;i++){ if((cards.card[i-1].CardNum-cards.card[i].CardNum) != 1){ return false; } } return true; }
|
葫芦
检测三条和一对
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
inline bool isFullHouse(Cards &cards){ Number three = Num_None; for(int w=0;w<3;w++){ for(int x=w+1;x<4;x++){ for(int y=x+1;y<5;y++){ if((cards.card[w].CardNum == cards.card[x].CardNum) && (cards.card[w].CardNum == cards.card[y].CardNum)){ three=cards.card[w].CardNum; break; } } } }
if(three == Num_None) return false;
for(int i=0;i<4;i++){ for(int j=i+1;j<5;j++){ if((cards.card[i].CardNum == cards.card[j].CardNum) && (cards.card[i].CardNum != three)){ return true; } } }
return false; }
|
两对
判断两次一对
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
inline bool isTwoPair(Cards &cards){ Number pair1 = Num_None; for(int i=0;i<4;i++){ for(int j=i+1;j<5;j++){ if(cards.card[i].CardNum == cards.card[j].CardNum){ pair1=cards.card[i].CardNum; break; } } }
if(pair1 == Num_None) return false;
for(int i=0;i<4;i++){ for(int j=i+1;j<5;j++){ if((cards.card[i].CardNum == cards.card[j].CardNum) && (cards.card[i].CardNum != pair1)){ return true; } } }
return false; }
|
牌型检测
上面是各自独立判断,但是会有重复的部分,比如葫芦里面可以检测出三条和一对,四条中包含三条,两对中包含两个一对。
综合判断采用由大到小,层层叠加的方式。
- 如果检测到包含A+顺子+同花,就是皇家同花顺
- 如果检测到四条+同花,则判断为四条,因为四条比同花大
- 如果检测到三条并且没有对子就是三条,如果检测到三条+对子就是葫芦
效果