码迷,mamicode.com
首页 > 编程语言 > 详细

C++ ShowHand

时间:2015-04-29 16:52:08      阅读:625      评论:0      收藏:0      [点我收藏+]

标签:

 

[内容]

模拟一个梭哈(Show hand) 牌戏,可以洗牌(shuffle)、发牌(Deal)、算牌型(GetType)

程序为控制台类型,输入Y发牌,输入N退出,不区大小写。输入Y后,先洗牌,把洗过的57张牌都打印出来,再随机抽 5 张,显示它们的牌型和大小。

打印时,牌的表示方法如下:

数字在前,花色在后。

29,用对应的数字表示;10 T 表示;JQKA就用对应的字母表示

花色:Club(草花) < Diamond(方块) < Heart(红桃) < Spade (黑桃)

 

[游戏背景]

我们的一付牌里,有 52 张普通牌和 5 张鬼。

52 张普通牌分成 4 种花色,从大到小依次为黑桃(Spade)、红桃(Heart)、方块(Diamond)、草花(club),每种花色是13张牌2-10JQKA

5张鬼不分大小,可以当作任意牌来组成牌型

 

 牌型比较:五鬼>五条>同花顺>四条>葫芦>同花>顺子>三条>二对>单对>散牌。

  数字比较:AKQJ1098 765432

  花式比较:黑桃>红桃>方块>草花 

  五鬼——五张鬼

  五条——五张相同数字的牌,其中至少一张为鬼。

  同花顺——拥有五张连续性同花色的顺子。以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 }

 

C++ ShowHand

标签:

原文地址:http://www.cnblogs.com/novor/p/4466086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!