![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /*判定扑克的牌型。给5张牌,返回它的牌型, 2 *顺子:case 55 3 *4个的+1个单张:case 41 4 *3个+对子:case 32 5 *3个+2个单张:case 311 6 *2对+1个单张:case 221 7 *1对+3个单张:case 2111 8 *5个单张:case 51 9 */ 10 #include <iostream> 11 #include <cstdlib> 12 13 using namespace std; 14 15 void sort_cards(const int *cards, int *cards_sorted, int num); 16 17 int is_straight(int *my_cards, int start, int end);//case 55 18 int is_4same1(int *my_cards, int start, int end);//case 41 19 int is_3same2same(int *my_cards, int start, int end);//case 32 20 21 int 22 main(int argc, char *argv[]) 23 { 24 int cards[] = {5, 4, 1, 3, 2}; 25 int cards_sorted[5]; 26 int num = 5; 27 28 sort_cards(cards, cards_sorted, num); 29 if(is_straight(cards_sorted, 0 , 4)) 30 cout << "\n cards are straight.55" << endl; 31 if(is_4same1(cards_sorted, 0, 4)) 32 cout << "\n cards are 4same1.41" << endl; 33 int result32 = is_3same2same(cards_sorted, 0 ,4); 34 switch (result32){ 35 case 5: 36 cout << "\n cards are 3same2same.32" << endl; 37 break; 38 case 4: 39 cout << "\n cards are 2match1different.221" << endl; 40 break; 41 case 3: 42 cout << "\n cards are 3same2different.311" << endl; 43 break; 44 case 2: 45 cout << "\n cards are 1match3different.2111" << endl; 46 break; 47 case 0: 48 cout << "\n cards are 5different.51" << endl; 49 break; 50 default: 51 break; 52 } 53 54 return 0; 55 } 56 57 /*C++功底不够,还是有很多C的影子*/ 58 void 59 sort_cards(const int *cards, int *cards_sorted, int num){ 60 int i, j, min_value, min_position, tmp_value; 61 for(i = 0; i < num; i++){ 62 *(cards_sorted + i) = *(cards + i); 63 } 64 65 for(i = 0; i < num; i++){ 66 min_value = *(cards_sorted + i); 67 min_position = i; 68 for(j = i+1; j < num; j++){ 69 if(*(cards_sorted + j) < min_value){ 70 min_value = *(cards_sorted + j); 71 min_position = j; 72 } 73 } 74 tmp_value = *(cards_sorted + i); 75 *(cards_sorted + i) = min_value; 76 *(cards_sorted + min_position) = tmp_value; 77 } 78 79 cout << "cards_sorted are:" << endl; 80 for(i = 0; i < num; i++){ 81 cout << *(cards_sorted + i) << " "; 82 } 83 } 84 85 int 86 is_straight(int *my_cards, int start, int end)//case 55 87 { 88 int i; 89 for(i = 0; i < 4; i++){ 90 if(*(my_cards + start) < 3) 91 return 0; 92 if(*(my_cards + start + i + 1) - *(my_cards + start + i) != 1) 93 return 0; 94 } 95 return 1; 96 } 97 98 int 99 is_4same1(int *my_cards, int start, int end)//case 41 100 { 101 int i, j; 102 for(i = start; i < (end -3); i++){ 103 for(j = 0; j < 3; j++){ 104 if(*(my_cards + i + j + 1) != *(my_cards + i + j)) 105 break; 106 if(j == 2) 107 return 1; 108 } 109 } 110 return 0; 111 } 112 113 /*这个函数的设计还是比较巧妙,根据返回值,得到不同的类型。 114 */ 115 int 116 is_3same2same(int *my_cards, int start, int end)//case 32 117 { 118 int i, j; 119 int hit3 = 0; 120 int hit2 = 0; 121 for(i = start; i < end;){ 122 for(j = 0; j < 2; j++){ 123 if(*(my_cards + i + j + 1) != *(my_cards + i + j)) 124 break; 125 } 126 if(j == 2){ 127 hit3 += 3; 128 i += 3; 129 continue; 130 } 131 if(j == 1){ 132 hit2 += 2; 133 i += 2; 134 continue; 135 } 136 i++; 137 } 138 139 return (hit2 + hit3); 140 } 141 142 /*还有很多需要改进的地方。真想做个斗地主。或许应该找个斗地主的源码学习下。 143 *Look, before I leap! If I don't know the direction, I should do some small things. 144 */
游戏规则
使用道具
一副标准扑克牌去掉大小王后的52张牌进行游戏。
游戏人数
最少两个玩家,最多10个玩家,个别情况有12个玩家的。
游戏的目的
赢取其他玩家筹码,
下注宗旨
玩家之间同时继续看牌或比牌需要下同样注额筹码,筹码不足的玩家allin全下后可以看到底并参与比牌。
发牌下注步骤
发牌一般分为5个步骤,分别为,
Perflop—先下大小盲注,然后给每个玩家发2张底牌,大盲注后面第一个玩家选择跟注、加注或者盖牌放弃,按照顺时针方向,其他玩家依次表态,大盲注玩家最后表态,如果玩家有加注情况,前面已经跟注的玩家需要再次表态甚至多次表态。
Flop—同时发三张公牌,由小盲注开始(如果小盲注已盖牌,由后面最近的玩家开始,以此类推),按照顺时针方向依次表态,玩家可以选择下注、加注、或者盖牌放弃。
Turn—发第4张牌,由小盲注开始,按照顺时针方向依次表态,玩家可以选择下注、加注、或者盖牌放弃。
River—发第五张牌,由小盲注开始,按照顺时针方向依次表态,玩家可以选择下注、加注、或者盖牌放弃。
比牌—经过前面4轮发牌和下注,剩余的玩家开始亮牌比大小,成牌最大的玩家赢取池底。
比牌方法
用自己的2张底牌和5张公共牌结合在一起,选出5张牌,不论手中的牌使用几张(甚至可以不用手中的底牌),凑成最大的成牌,跟其他玩家比大小。
比牌先比牌型,大的牌型大于小的牌型,牌型一般分为10种,从大到小为:
皇家同花顺(royal flush):由AKQJ10五张组成,并且这5张牌花色相同
同花顺(straight flush):由五张连张同花色的牌组成
4条(four of a kind):4张同点值的牌加上一张其他任何牌
满堂红(full house)(又称“葫芦”):3张同点值加上另外一对
同花(flush):5张牌花色相同,但是不成顺子
顺子(straight):五张牌连张,至少一张花色不同
3条(three of a kind):三张牌点值相同,其他两张各异
两对(two pairs):两对加上一个杂牌
一对(one pair):一对加上3张杂牌
高牌(high card):不符合上面任何一种牌型的牌型,由单牌且不连续不同花的组成
相同牌型比点值,4种花色不分大小,点值以A为最大点,2为最小点。比点值本着牌型优先和最大点优先的原则,先比主要部分,再比较次要部分,先比最大点,再比次大点。例如先比较葫芦的3条部分,3条大的胜出,如果3条部分相等,再比较1对部分。顺子比牌中,A2345的顶张为5,A算1,属于最小的顺子。对于散牌比大小,先比较各自的最大牌,如果最大牌的点值不同,则立刻分出胜负,如果最大牌点值相同,再比次大牌,以此类推,最终比出大小,如果所有点值相等,则不分胜负,平分池底。