Advertisement
Guest User

Poker Hand Program

a guest
Jul 27th, 2012
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.13 KB | None | 0 0
  1. //Main
  2. #include <iostream>
  3.  
  4. #include "Hand.h"
  5.  
  6. int main()
  7. {
  8.     Hand test("2H 3H 4H 5H 6H");
  9.  
  10.     test.GenerateHandType();
  11.  
  12.     vector<Card> temp = test.GetHand();
  13.  
  14.     cout << "Hand: " << endl;
  15.  
  16.     for(size_t i = 0; i < temp.size(); i++)
  17.     {
  18.         std::cout << temp.at(i).Suit() <<" " <<  temp.at(i).Type() << std::endl;
  19.     }
  20.  
  21.     std::cout << "Same suit: " << test.HandHasSameSuit() << std::endl;
  22.     std::cout << "Has Pair: " << test.HasPair() << std:: endl;
  23.     std::cout << "Has Multiple Pairs: " << test.HasMultiPair() << std::endl;
  24.     std::cout << "Has Three of a Kind: " << test.HasThreeKind() << std::endl;
  25.     std::cout << "Has Four of a kind: " << test.HasFourKind() << std::endl;
  26.     std::cout << "Has consecutive ranks: " << test.HasConsecRanks() << std::endl;
  27.     std::cout << "Has high consecutive ranks: " << test.HasHighConsecRanks() << std::endl;
  28.  
  29.     std::cout << std::endl;
  30.  
  31.     std::cout << "Hand type: " << test.PokerHandType() << endl;
  32. }
  33.  
  34. //Card
  35. #ifndef CARD_H
  36. #define CARD_H
  37.  
  38. #include "Utils.h"
  39.  
  40. class Card
  41. {
  42. private:
  43.  
  44.     Suits suit;
  45.  
  46.     CardType type;
  47.  
  48. public:
  49.     Card()
  50.     {
  51.         suit = NoSuit;
  52.         type = NoType;
  53.     }
  54.  
  55.     Card(char s, char ct)
  56.     {
  57.         suit = FindSuit(s);
  58.         type = FindType(ct);
  59.     }
  60.  
  61.     Suits Suit() { return suit; }
  62.     CardType Type() { return type; }
  63.  
  64.     void SetSuit(Suits s) { suit = s; }
  65.     void SetType(CardType t) { type = t; }
  66. };
  67.  
  68. #endif
  69.  
  70. //Hand
  71. #ifndef HAND_H
  72. #define HAND_H
  73.  
  74. #include <string>
  75. #include <list>
  76. #include <vector>
  77. #include "Card.h"
  78. #include "Utils.h"
  79.  
  80. using namespace std;
  81.  
  82. class Hand
  83. {
  84. private:
  85.  
  86.     static const int NUMCARDS = 5;
  87.  
  88.     string pokerHandType;
  89.  
  90.     vector<Card> hand;
  91.  
  92.     void SetHand(string h)
  93.     {
  94.         int stringIndex = 0;
  95.  
  96.         Card temp;
  97.  
  98.         for(int i = 0; i < NUMCARDS; ++i)
  99.         {
  100.             temp.SetType( FindType( h[stringIndex] ) );
  101.            
  102.             stringIndex++;
  103.  
  104.             temp.SetSuit( FindSuit( h[stringIndex] ) );
  105.  
  106.             stringIndex +=2;
  107.  
  108.             hand.push_back( temp );
  109.         }
  110.     }
  111.  
  112.     bool bCardsHaveSameSuit;
  113.     bool bHasPair;
  114.     bool bHasMultiplePairs;
  115.     bool bHasThreeKind;
  116.     bool bHasFourKind;
  117.  
  118.     bool bHasConsecutiveRank;
  119.     //Consecutive rank starting from 10;
  120.     bool bHasHighConsecRank;
  121.     bool bLowestTypeIsTen;
  122.  
  123.     int numPairs;
  124. private:
  125.  
  126.     void CheckForSameSuit()
  127.     {
  128.         bCardsHaveSameSuit = hand.at(0).Suit() == hand.at(1).Suit() &&
  129.                                 hand.at(0).Suit() == hand.at(2).Suit() &&
  130.                                 hand.at(0).Suit() == hand.at(3).Suit() &&
  131.                                 hand.at(0).Suit() == hand.at(4).Suit();
  132.     }
  133.  
  134.     void CheckSameType(vector<Card> h)
  135.     {
  136.         if(h.size() == 0)
  137.         {
  138.             return;
  139.         }
  140.  
  141.         int numCardsMatching = 1;
  142.         vector<int> matchingIndex;
  143.  
  144.         matchingIndex.push_back(0);
  145.  
  146.         for(size_t i = 1; i < h.size(); i++)
  147.         {
  148.             if( h.at(0).Type() == h.at(i).Type() )
  149.             {
  150.                 numCardsMatching++;
  151.                 matchingIndex.push_back(i);
  152.             }
  153.         }
  154.  
  155.         if(matchingIndex.size() == 1)
  156.         {
  157.             h.erase( h.begin() );
  158.         }
  159.  
  160.         if(matchingIndex.size() > 1)
  161.         {
  162.             int i = matchingIndex.size();
  163.  
  164.             while(i > 0)
  165.             {
  166.                 h.erase( h.begin() + matchingIndex.at(i - 1) );
  167.                 i--;
  168.             }
  169.         }
  170.  
  171.  
  172.         if(numCardsMatching == 2)
  173.         {
  174.             if( bHasPair )
  175.             {
  176.                 bHasMultiplePairs = true;
  177.             }
  178.             else
  179.             {
  180.                 bHasPair = true;
  181.             }
  182.         }
  183.         else if(numCardsMatching == 3)
  184.         {
  185.             bHasThreeKind = true;
  186.         }
  187.         else if(numCardsMatching == 4)
  188.         {
  189.             bHasFourKind = true;
  190.             return;
  191.         }
  192.  
  193.         CheckSameType(h);
  194.     }
  195.  
  196.     void CheckConsecutiveRanks()
  197.     {
  198.         CardType lowestType = FindLowestType();
  199.  
  200.         if(lowestType == Ten)
  201.         {
  202.             bLowestTypeIsTen = true;
  203.         }
  204.  
  205.         cout << "Lowest type is ten: " << bLowestTypeIsTen << endl;
  206.  
  207.         FindConsecRanks(lowestType);
  208.  
  209.         if(bHasConsecutiveRank && bLowestTypeIsTen)
  210.         {
  211.             bHasHighConsecRank = true;
  212.             bHasConsecutiveRank = false;
  213.         }
  214.     }
  215.  
  216.     CardType FindLowestType()
  217.     {
  218.         CardType lowestType = NoType;
  219.  
  220.         for(int i = 0; i < NUMCARDS; i++)
  221.         {
  222.             if(hand.at(i).Type() < lowestType)
  223.             {
  224.                 lowestType = hand.at(i).Type();
  225.             }
  226.         }
  227.  
  228.         return lowestType;
  229.     }
  230.  
  231.     void FindConsecRanks(CardType type)
  232.     {
  233.         static int cardsChecked = 1;
  234.  
  235.         if(cardsChecked == 5)
  236.         {
  237.             bHasConsecutiveRank = true;
  238.             return;
  239.         }
  240.  
  241.         CardType incrementedEnum = (CardType)(1 + (int)type );
  242.         for(int i = 0; i < NUMCARDS; i++)
  243.         {
  244.             if(incrementedEnum == hand.at(i).Type())
  245.             {
  246.                 cardsChecked++;
  247.                 FindConsecRanks(incrementedEnum);
  248.             }
  249.         }
  250.     }
  251.  
  252.     void DetermineHandType()
  253.     {
  254.         if( bCardsHaveSameSuit && bHasHighConsecRank )
  255.         {
  256.             pokerHandType = "Royal Flush";
  257.         }
  258.         else if( bCardsHaveSameSuit && bHasConsecutiveRank )
  259.         {
  260.             pokerHandType = "Straight Flush";
  261.         }
  262.         else if( bHasFourKind )
  263.         {
  264.             pokerHandType = "Four of a Kind";
  265.         }
  266.         else if( bHasPair && bHasThreeKind )
  267.         {
  268.             pokerHandType = "Full House";
  269.         }
  270.         else if( bCardsHaveSameSuit )
  271.         {
  272.             pokerHandType = "Flush";
  273.         }
  274.         else if( bHasConsecutiveRank )
  275.         {
  276.             pokerHandType = "Straight";
  277.         }
  278.         else if( bHasThreeKind )
  279.         {
  280.             pokerHandType = "Three of  kind";
  281.         }
  282.         else if( bHasMultiplePairs )
  283.         {
  284.             pokerHandType = "Two Pair";
  285.         }
  286.         else if( bHasPair )
  287.         {
  288.             pokerHandType = "Pair";
  289.         }
  290.         else
  291.         {
  292.             pokerHandType = "High Card";
  293.         }
  294.     }
  295.  
  296. public:
  297.     Hand(string h)
  298.     {
  299.         SetHand(h);
  300.         pokerHandType = "High Card";
  301.         bCardsHaveSameSuit = false;
  302.         bHasPair = false;
  303.         bHasMultiplePairs = false;
  304.         bHasThreeKind = false;
  305.         bHasFourKind = false;
  306.         bHasConsecutiveRank = false;
  307.         bHasHighConsecRank = false;
  308.         bLowestTypeIsTen = false;
  309.     }
  310.  
  311.     void Hand::GenerateHandType()
  312.     {
  313.         CheckForSameSuit();
  314.         CheckSameType(hand);
  315.         if( !bHasPair && !bHasMultiplePairs && !bHasThreeKind && !bHasFourKind)
  316.         {
  317.             CheckConsecutiveRanks();
  318.         }
  319.         DetermineHandType();
  320.     }
  321.    
  322.     vector<Card> GetHand() { return hand; }
  323.  
  324.     bool HandHasSameSuit() { return bCardsHaveSameSuit; }
  325.     bool HasPair() { return bHasPair; }
  326.     bool HasMultiPair() { return bHasMultiplePairs; }
  327.     bool HasThreeKind() { return bHasThreeKind; }
  328.     bool HasFourKind() { return bHasFourKind; }
  329.     bool HasConsecRanks() { return bHasConsecutiveRank; }
  330.     bool HasHighConsecRanks() { return bHasHighConsecRank; }
  331.  
  332.     string PokerHandType() { return pokerHandType; }
  333. };
  334.  
  335. #endif
  336. //Utils
  337. #ifndef UTILS_H
  338. #define UTILS_H
  339.  
  340. enum Suits
  341. {
  342.     Hearts = 0,
  343.     Diamonds,
  344.     Clubs,
  345.     Spades,
  346.     NoSuit
  347. };
  348.  
  349. enum CardType
  350. {
  351.     One = 1,
  352.     Two,
  353.     Three,
  354.     Four,
  355.     Five,
  356.     Six,
  357.     Seven,
  358.     Eight,
  359.     Nine,
  360.     Ten,
  361.     Jack,
  362.     Queen,
  363.     King,
  364.     Ace,
  365.     NoType
  366. };
  367.  
  368.  
  369. Suits FindSuit(char c)
  370. {
  371.     switch(c)
  372.     {
  373.     case 'H':
  374.         return Hearts;
  375.         break;
  376.     case 'D':
  377.         return Diamonds;
  378.         break;
  379.     case 'C':
  380.         return Clubs;
  381.         break;
  382.     case 'S':
  383.         return Spades;
  384.         break;
  385.     }
  386.  
  387.     return NoSuit;
  388. }
  389.  
  390. CardType FindType(char c)
  391. {
  392.     switch(c)
  393.     {
  394.     case 'A':
  395.         return Ace;
  396.         break;
  397.     case '1':
  398.         return One;
  399.         break;
  400.     case '2':
  401.         return Two;
  402.         break;
  403.     case '3':
  404.         return Three;
  405.         break;
  406.     case '4':
  407.         return Four;
  408.         break;
  409.     case '5':
  410.         return Five;
  411.         break;
  412.     case '6':
  413.         return Six;
  414.         break;
  415.     case '7':
  416.         return Seven;
  417.         break;
  418.     case '8':
  419.         return Eight;
  420.         break;
  421.     case '9':
  422.         return Nine;
  423.         break;
  424.     case 'T':
  425.         return Ten;
  426.         break;
  427.     case 'J':
  428.         return Jack;
  429.         break;
  430.     case 'Q':
  431.         return Queen;
  432.         break;
  433.     case 'K':
  434.         return King;
  435.         break;
  436.     }
  437.  
  438.     return NoType;
  439. }
  440.  
  441. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement