View Code
  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,属于最小的顺子。对于散牌比大小,先比较各自的最大牌,如果最大牌的点值不同,则立刻分出胜负,如果最大牌点值相同,再比次大牌,以此类推,最终比出大小,如果所有点值相等,则不分胜负,平分池底。