标签:
[内容]
模拟一个梭哈(Show hand) 牌戏,可以洗牌(shuffle)、发牌(Deal)、算牌型(GetType)。
程序为控制台类型,输入Y发牌,输入N退出,不区大小写。输入Y后,先洗牌,把洗过的57张牌都打印出来,再随机抽 5 张,显示它们的牌型和大小。
打印时,牌的表示方法如下:
数字在前,花色在后。
2到9,用对应的数字表示;10 用 T 表示;JQKA就用对应的字母表示
花色:Club(草花) < Diamond(方块) < Heart(红桃) < Spade (黑桃)
[游戏背景]
我们的一付牌里,有 52 张普通牌和 5 张鬼。
52 张普通牌分成 4 种花色,从大到小依次为黑桃(Spade)、红桃(Heart)、方块(Diamond)、草花(club),每种花色是13张牌2-10,J,Q,K,A。
5张鬼不分大小,可以当作任意牌来组成牌型。
牌型比较:五鬼>五条>同花顺>四条>葫芦>同花>顺子>三条>二对>单对>散牌。
数字比较:A>K>Q>J>10>9>8 >7>6>5>4>3>2
花式比较:黑桃>红桃>方块>草花
五鬼——五张鬼
五条——五张相同数字的牌,其中至少一张为鬼。
同花顺——拥有五张连续性同花色的顺子。以A为首的同花顺最大。A只能出现在顺子的头或尾,不能出现在中间。KA234 不是顺子。
四条——四张相同数字的牌,外加一单张。比数字大小,四条「A」最大
葫芦——由「三条」加一个「对子」所组成的牌,若别家也有此牌型,则比三条数字大小,三条相同,则比对子,都相同则比花色
同花——不构成顺子的五张同花色的牌。先比数字最大的单张,如相同再比第二支、依此类推
顺子——五张连续数字的牌组。 以A为首的顺子最大,如果大家都是顺子,比最大的一张牌,如果大小还一样就比这张牌的花式
三条——牌型由三张相同的牌组成,以A为首的三条最大
二对——牌型中五张牌由两组两张同数字的牌所组成。若遇相同则先比这副牌中最大的一对,如又相同再比第二对,如果还是一样,比大对子中的最大花式
单对——牌型由两张相同的牌加上三张单张所组成。如果大家都是对子,比对子的大小,如果对子也一样,比这个对子中的最大花色
散牌——单一型态的五张散牌所组成,不成对(二对),不成三条,不成顺(同花顺),不成同花,不成葫芦,不成四条。先比最大一张牌的大小,如果大小一样,比这张牌的花色 .
运行演示:
Input Y to deal, input N to quit...
>Y
All cards are:
7 Club 2 Diamond Joker 5 Spade T Club
...
Your cards are:
8 Club
5 Diamond
J Heart
Joker
J Club
Your style is: Three Of Kind, J
Input Y to deal, input N to quit...
>Y
All cards are:
Q Heart 4 Club 8 Spade 5 Spade 7 Diamond
2 Club 7 Heart T Spade T Club A Spade
…
Your cards are:
7 Spade
5 Heart
6 Diamond
J Heart
5 Club
Your style is: One Pair 5
>N
Quit game.
一些对应的英文单词:
"Joker", //鬼
"Diamond", //方块
"Heart", //红桃
"Club", //草花
"Spade", //黑桃
"Five Of Jokers"
"Five Of Kind"
"Straight Flush", //同花顺
"Four Of Kind", //四条
"Full House", //葫芦
"Flush", //同花
"Straight", //顺子
"Three Of Kind", //三条
"Two Pair", //二对
"One Pair", //单对
"Odd Card" //散牌
//
1 class Poker 2 3 { 4 public: 5 6 Poker(void); 7 ~Poker(void); 8 inline Poker(int x,int y):v(x),s(y){}; 9 10 11 12 13 private: 14 int s;//花色 15 int v;//数字 16 17 18 }; 19 20 21 22 const static int k_DeckTotalNum = 57; //牌的总数 23 const static int k_DeckHandCardsNum = 5;//玩家牌的数量 24 25 26 27 const static string k_Type[11]= 28 { 29 "Odd Card", //散牌 30 "One Pair", //单对 31 "Two Pair", //二对 32 "Three Of Kind", //三条 33 "Straight", //顺子 34 "Flush", //同花 35 "Full House", //葫芦 36 "Four Of Kind", //四条 37 "Straight Flush", //同花顺 38 "Five Of Kind", //五条 39 "Five Of Jokers" //五鬼 40 }; 41 42 43 44 const static string k_Suit[5]= 45 { 46 "Club", //草花 47 "Diamond", //方块 48 "Heart", //红桃 49 "Spade", //黑桃 50 "Joker" 51 }; 52 53 54 55 const static string k_Value[14]= 56 { 57 "2", 58 "3", 59 "4", 60 "5", 61 "6", 62 "7", 63 "8", 64 "9", 65 "T", 66 "J", 67 "Q", 68 "K", 69 "A", 70 " " 71 };
//
1 const static int DECKTOTAL = 57; 2 const static int SUITTOTAL = 5; 3 const static int VALUETOTAL =14 ; 4 const static int JOKER_V=14; 5 const static int JOKER_S=4 ; 6 7 8 9 10 class ShowHand 11 { 12 public: 13 ShowHand(); 14 ~ShowHand(); 15 16 17 void Init();//初始化所有牌 18 void DeInit(); 19 20 void ShowDeck();//显示所有牌面 21 22 void Shuffle();//洗牌 23 void Deal();//发牌 24 void GetType();//获得玩家牌面类型 25 26 //牌面 27 28 bool IsOddCard( ); 29 bool IsOnePair( ); 30 bool IsTwoPair( ); 31 bool IsThreeOfKind( ); 32 bool IsStraight( ); 33 bool IsFlush( ); 34 bool IsFullHouse( ); 35 bool IsFourOfKind( ); 36 bool IsStraightFlush( ); 37 bool IsFiveOfKind( ); 38 bool IsFiveOfJokers( ); 39 40 void SortCardValue(); //玩家牌 数字排序 41 void SortCardSuit();//玩家牌花色排序 42 43 int JokerNumer();//joker的数量 44 45 bool Continu(int n) ;//从第一张起 n个连续递增的数字 46 47 48 private: 49 Poker m_Deck[DECKTOTAL]; 50 }; 51 52
//
1 // ShowHand.cpp 2 #include "StdAfx.h" 3 #include "ShowHand.h" 4 #include <ctime> 5 using namespace std; 6 7 static vector<Poker> playerDeck; 8 vector<int> deck;//玩家牌的数字 9 vector<int> deckS;//玩家牌的花色 10 11 ShowHand::ShowHand() 12 { 13 14 } 15 16 17 ShowHand::~ShowHand() 18 { 19 20 } 21 22 23 void ShowHand::Init() 24 { 25 m_Deck[0].v=0; 26 int v=0,s=0; 27 for(int i=0;i<52;) 28 { 29 for(int j=0;j<4;j++) 30 { 31 m_Deck[i].v=v; 32 m_Deck[i].s=s; 33 i++; 34 s++; 35 } 36 v++; 37 s=0; 38 } 39 40 for(int i=52;i<57;i++) 41 { 42 m_Deck[i].v=JOKER_V; 43 m_Deck[i].s=JOKER_S; 44 } 45 46 playerDeck.clear(); 47 } 48 49 void ShowHand::DeInit() 50 { 51 52 } 53 54 55 void ShowHand::Shuffle() 56 { 57 int temv,tems; 58 srand((unsigned int)time(NULL)); 59 for(int i=0;i<DECKTOTAL;i++) 60 { 61 int j=rand()%DECKTOTAL; 62 temv=m_Deck[j].v; 63 tems=m_Deck[j].s; 64 65 m_Deck[j].v=m_Deck[i].v; 66 m_Deck[j].s=m_Deck[i].s; 67 68 m_Deck[i].v=temv; 69 m_Deck[i].s=tems; 70 } 71 72 } 73 74 void ShowHand::Deal() 75 { 76 cout<<"Your cards are:"<<endl; 77 for(int i=0;i<5;i++) 78 { 79 int r=rand()%57; 80 playerDeck.push_back(Poker(m_Deck[r].v,m_Deck[r].s)); 81 cout<<setw(2) 82 <<k_Value[playerDeck[i].v]<<" " 83 <<k_Suit[playerDeck[i].s]<<endl; 84 85 } 86 } 87 88 void ShowHand::GetType() 89 { 90 cout<<"Your style is:"; 91 92 SortCardValue(); 93 SortCardSuit(); 94 95 if(IsFiveOfJokers()) 96 { 97 cout<<k_Type[10]<<endl; 98 } 99 else if(IsFiveOfKind() ) 100 { 101 cout<<k_Type[9]<<endl; 102 } 103 else if(IsStraightFlush() ) 104 { 105 cout<<k_Type[8]<<endl; 106 } 107 else if(IsFourOfKind() ) 108 { 109 cout<<k_Type[7]<<endl; 110 } 111 else if(IsFullHouse() ) 112 { 113 cout<<k_Type[6]<<endl; 114 } 115 else if(IsFlush() ) 116 { 117 cout<<k_Type[5]<<endl; 118 } 119 else if(IsStraight() ) 120 { 121 cout<<k_Type[4]<<endl; 122 } 123 else if(IsThreeOfKind() ) 124 { 125 cout<<k_Type[3]<<endl; 126 } 127 else if(IsTwoPair() ) 128 { 129 cout<<k_Type[2]<<endl; 130 } 131 else if(IsOnePair() ) 132 { 133 cout<<k_Type[1]<<endl; 134 } 135 else 136 { 137 cout<<k_Type[0]<<endl; 138 } 139 140 } 141 142 void ShowHand::ShowDeck() 143 { 144 cout<<"All cards are:"<<endl; 145 for(int i=0;i<DECKTOTAL;) 146 { 147 cout<<setw(2) 148 <<k_Value[m_Deck[i].v]<<" " <<k_Suit[m_Deck[i].s] <<" "; 149 i++; 150 if(i%5==0) 151 cout<<endl; 152 } 153 cout<<endl<<endl; 154 } 155 156 157 bool ShowHand::IsOddCard( ) 158 { 159 return true; 160 } 161 162 bool ShowHand::IsOnePair( ) 163 { 164 if( 165 (JokerNumer()==0&&deck[0]==deck[1]&&deck[1]!=deck[2] && deck[2]!=deck[3] &&deck[3]!=deck[4]) 166 ||(JokerNumer()==0&&deck[1]==deck[2]&&deck[0]!=deck[1]&& deck[2]!=deck[3] && deck[3]!=deck[4]) 167 ||(JokerNumer()==0&&deck[2]==deck[3]&&deck[0]!=deck[1]&& deck[1]!=deck[2] && deck[3]!=deck[4] ) 168 ||(JokerNumer()==0&&deck[3]==deck[4]&&deck[0]!=deck[1]&& deck[1]!=deck[2] && deck[2]!=deck[3] ) 169 170 ||(JokerNumer()==1&&deck[0]!=deck[1]&&deck[1]!=deck[2]&& deck[2]!=deck[3] && deckS[3] - deckS[0]>0) 171 172 ) 173 { 174 return true; 175 } 176 177 return false; 178 } 179 180 bool ShowHand::IsTwoPair() 181 { 182 if( 183 (JokerNumer()==0&&deck[0]==deck[1]&& deck[2]==deck[3] &&deck[3]!=deck[4]) 184 ||(JokerNumer()==0&&deck[0]==deck[1]&& deck[3]==deck[4] &&deck[0]!=deck[2]&&deck[2]!=deck[3]) 185 ||(JokerNumer()==0&&deck[1]==deck[2]&& deck[3]==deck[4] &&deck[0]!=deck[1]) 186 187 188 ||(JokerNumer()==1&&deck[0]==deck[1]&&deck[1]!=deck[2]&& deck[2]!=deck[3] ) 189 ||(JokerNumer()==1&&deck[1]==deck[2]&&deck[0]!=deck[1]&& deck[2]!=deck[3] ) 190 ||(JokerNumer()==1&&deck[2]==deck[3]&&deck[0]!=deck[1]&& deck[1]!=deck[2] ) 191 ) 192 { 193 194 return true; 195 } 196 197 return false; 198 199 } 200 201 bool ShowHand::IsThreeOfKind( ) 202 { 203 204 205 if( 206 (JokerNumer()==0&&deck[0]==deck[2]&&deck[0]!=deck[3]&&deck[3]!=deck[4] ) 207 ||(JokerNumer()==0&&deck[1]==deck[3]&&deck[0]!=deck[1]&&deck[3]!=deck[4] ) 208 ||(JokerNumer()==0&&deck[2]==deck[4]&&deck[0]!=deck[1]&&deck[1]!=deck[2] ) 209 210 211 212 ||(JokerNumer()==1&&deck[0]==deck[1]&&deck[0]!=deck[2]&&deck[2]!=deck[3] ) 213 ||(JokerNumer()==1&&deck[1]==deck[2]&&deck[0]!=deck[1]&&deck[2]!=deck[3] ) 214 ||(JokerNumer()==1&&deck[2]==deck[3]&&deck[0]!=deck[1]&&deck[1]!=deck[2] ) 215 216 217 ||(JokerNumer()==2&&deck[0]!=deck[1]&&deck[1]!=deck[2]&&deckS[4]-deckS [0] > 4 ) 218 ) 219 { 220 221 return true; 222 } 223 224 return false; 225 226 } 227 228 bool ShowHand::IsStraight( ) 229 { 230 if( 231 (JokerNumer()==0&&Continu(5) &&deckS[4]-deckS [0] > 4 ) 232 ||(JokerNumer()==1&&Continu(4) &&deckS[3]-deckS [0] > 4 ) 233 ||(JokerNumer()==2&&Continu(3) &&deckS[2]-deckS [0] > 4 ) 234 235 ) 236 { 237 return true; 238 } 239 240 return false; 241 242 } 243 244 245 bool ShowHand::IsFlush( ) 246 { 247 if( 248 (JokerNumer()==0&&deck[4]-deck [0] > 4 && deckS[0]==deckS[4] ) 249 ||(JokerNumer()==1&&deck[3]-deck [0] > 4 &&deckS[0]==deckS[3] ) 250 ||(JokerNumer()==2&&deck[2]-deck [0] > 4 &&deckS[0]==deckS[2] ) 251 252 ) 253 { 254 return true; 255 } 256 257 return false; 258 259 } 260 261 262 bool ShowHand::IsFullHouse( ) 263 { 264 265 if( 266 (JokerNumer()==1 && deck[0]==deck[1] &&deck[2]==deck[3]&&deck[0]!=deck[2] ) 267 268 ||(JokerNumer()==0&& deck[0]==deck[1] &&deck[1]==deck[2] &&deck[3]==deck[4]&&deck[0]!=deck[3]) 269 ||(JokerNumer()==0&& deck[0]==deck[1] &&deck[2]==deck[3] &&deck[3]==deck[4]&&deck[0]!=deck[2]) 270 271 ) 272 { 273 return true; 274 } 275 276 else 277 { 278 return false; 279 } 280 281 } 282 bool ShowHand::IsFourOfKind( ) 283 { 284 285 if( 286 (JokerNumer()==3 && deck[0]!=deck[1]) 287 ||(JokerNumer()==2 && deck[0]==deck[1] &&deck[0]!=deck[2] ) 288 ||(JokerNumer()==2 && deck[0]==deck[2]&&deck[0]!=deck[1] ) 289 ||(JokerNumer()==2 && deck[1]==deck[2] &&deck[0]!=deck[1] ) 290 291 ||(JokerNumer()==1 && deck[0]==deck[1] &&deck[1]==deck[2] &&deck[0]!=deck[3] ) 292 ||(JokerNumer()==1 && deck[0]==deck[1] &&deck[1]==deck[3] &&deck[0]!=deck[2]) 293 ||(JokerNumer()==1 && deck[1]==deck[2] &&deck[2]==deck[3]&&deck[0]!=deck[1] ) 294 295 ||(JokerNumer()==0&& deck[0]==deck[1] &&deck[1]==deck[2] &&deck[2]==deck[3]&&deck[0]!=deck[4]) 296 ||(JokerNumer()==0&& deck[0]==deck[1] &&deck[1]==deck[2] &&deck[2]==deck[4]&&deck[0]!=deck[3]) 297 ||(JokerNumer()==0&& deck[0]==deck[1] &&deck[1]==deck[3] &&deck[3]==deck[4]&&deck[0]!=deck[2]) 298 299 ||(JokerNumer()==0&& deck[0]==deck[2] &&deck[2]==deck[3] &&deck[3]==deck[4]&&deck[0]!=deck[1]) 300 ||(JokerNumer()==0&& deck[1]==deck[2] &&deck[2]==deck[3] &&deck[3]==deck[4]&&deck[0]!=deck[1]) 301 ) 302 { 303 return true; 304 } 305 306 else 307 { 308 return false; 309 } 310 311 } 312 bool ShowHand::IsStraightFlush( ) 313 { 314 315 if( 316 (JokerNumer()==0&&Continu( 5) && deckS[0]==deckS[4] ) || 317 (JokerNumer()==1&&Continu( 4) && deckS[0]==deckS[3] ) || 318 (JokerNumer()==2&&Continu( 3) && deckS[0]==deckS[2] ) || 319 (JokerNumer()==3&&Continu( 2) && deckS[0]==deckS[1] ) 320 ) 321 { 322 323 return true; 324 } 325 326 return false; 327 } 328 bool ShowHand::IsFiveOfKind( ) 329 { 330 if( 331 JokerNumer()==4 332 ||(JokerNumer()==3 && deck[0]==deck[1] &&deck[1]==deck[2]) 333 ||(JokerNumer()==2 && deck[0]==deck[1] &&deck[1]==deck[2] &&deck[2]==deck[3]) 334 ||(JokerNumer()==1 && deck[0]==deck[1] &&deck[1]==deck[2] &&deck[2]==deck[3] &&deck[3]==deck[4]) 335 ) 336 { 337 return true; 338 } 339 340 else 341 { 342 return false; 343 } 344 345 } 346 347 bool ShowHand::IsFiveOfJokers() 348 { 349 if(JokerNumer()==5) 350 { 351 return true; 352 } 353 return false; 354 } 355 356 357 bool ShowHand::Continu(int n) 358 { 359 360 int count=0; 361 for (int i=0;i<n-1;i++) 362 { 363 if (deck[i]!=deck[i+1]) 364 { 365 return false; 366 } 367 } 368 return true; 369 } 370 371 372 //对玩家的牌 排序 373 void ShowHand::SortCardValue() 374 { 375 376 deck.clear(); 377 378 for(int i=0;i<5;i++) 379 { 380 deck.push_back(playerDeck[i].v); 381 } 382 sort(deck.begin(),deck.end() ); 383 } 384 385 void ShowHand::SortCardSuit() 386 { 387 388 deckS.clear(); 389 390 for(int i=0;i<5;i++) 391 { 392 deckS.push_back(playerDeck[i].s); 393 } 394 sort(deckS.begin(),deckS.end() ); 395 } 396 397 //joker的数量 398 int ShowHand::JokerNumer() 399 { 400 int count=0; 401 int i=4; 402 while(i>=0) 403 { 404 if(deck[i]!=JOKER_V) 405 { 406 break; 407 } 408 else 409 { 410 count++; 411 } 412 i--; 413 } 414 return count; 415 } 416 417
//
1 ShowHand sh; 2 3 int _tmain(int argc, _TCHAR* argv[]) 4 { 5 char ch; 6 while(1) 7 { 8 cin>>ch; 9 if(ch==‘Y‘||ch==‘y‘) 10 { 11 sh.Init(); 12 sh.Shuffle(); 13 sh.ShowDeck(); 14 sh.Deal(); 15 sh.GetType(); 16 } 17 else if(ch==‘N‘||ch==‘n‘) 18 { 19 break; 20 } 21 else 22 { 23 cout<<"input error"<<endl; 24 } 25 } 26 27 return 0; 28 }
标签:
原文地址:http://www.cnblogs.com/novor/p/4466086.html