Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.96 KB | None | 0 0
  1. #include <numeric>
  2. #include <set>
  3.  
  4.  
  5. enum ResultHand {RoyalFlush, StraightFlush, FourOfAKind, FullHouse, Flush, Straight, ThreeOfAKind, TwoPair, OnePair, HighCard};
  6.  
  7. struct Card {
  8. public:
  9.   Card(char value, char suit) : value(value) , suit(suit) {};
  10.   char value;
  11.   char suit;
  12. };
  13.  
  14. struct PokerHand {
  15.   PokerHand (const char* pokerhand)
  16.   {
  17.     for(int i = 0; i < strlen(pokerhand) ; i=i+3)
  18.     {
  19.       cards.push_back(Card(pokerhand[i], pokerhand[i+1]));
  20.     }
  21.     fillMapWithCardValues();
  22.     sum = sumOfValueCards();
  23.     resultHand = checkResultHand();
  24.   }
  25.  
  26.   void fillMapWithCardValues()
  27.   {
  28.     int value = 0;
  29.     cardValues['2'] = ++value;
  30.     cardValues['3'] = ++value;
  31.     cardValues['4'] = ++value;
  32.     cardValues['5'] = ++value;
  33.     cardValues['6'] = ++value;
  34.     cardValues['7'] = ++value;
  35.     cardValues['8'] = ++value;
  36.     cardValues['9'] = ++value;
  37.     cardValues['T'] = ++value;
  38.     cardValues['J'] = ++value;
  39.     cardValues['Q'] = ++value;
  40.     cardValues['K'] = ++value;
  41.     cardValues['A'] = ++value;
  42.   }
  43.   bool isAllSameSuit(char color)
  44.   {
  45.     return std::all_of(cards.begin(), cards.end(), [color](Card card) {
  46.       return card.suit == color;
  47.     });  
  48.   }
  49.   bool isFlush()
  50.   {
  51.     return (isAllSameSuit('S') || isAllSameSuit('H') || isAllSameSuit('D') || isAllSameSuit('C'));
  52.   }
  53.  
  54.   bool isStraight()
  55.   {
  56.     std::vector<int> tmp;
  57.     std::transform(cards.begin(), cards.end(), std::back_inserter(tmp),
  58.     [this](const Card& card) {return cardValues.at(card.value);});
  59.     std::sort(tmp.begin(), tmp.end());
  60.     bool flag = true;
  61.     for(int i=0; i<tmp.size() - 1; i++)
  62.     {
  63.       if((tmp[i]+1) != tmp[i+1])
  64.       {
  65.         flag = false;
  66.       }
  67.     }
  68. //     std::cout << "FLAG: " << flag << std::endl;
  69.     return isFiveHighStraight() || flag;
  70.   }
  71.  
  72.   bool isFiveHighStraight()
  73.   {
  74.     int sum = cardValues.at('A') + cardValues.at('2') + cardValues.at('3') + cardValues.at('4') + cardValues.at('5');
  75.     return sum == sumOfValueCards();  
  76.   }
  77.  
  78.   bool isStraightFlush()
  79.   {
  80.     return isStraight() & isFlush();
  81.   }
  82.  
  83.   bool isRoyalFlush()
  84.   {
  85.     int sum = cardValues.at('T') + cardValues.at('J') + cardValues.at('Q') + cardValues.at('K') + cardValues.at('A');
  86.     return sum == sumOfValueCards() && isFlush();
  87.   }
  88.  
  89.   int sumOfValueCards()
  90.   {
  91.     int sum = 0;
  92.     for(const auto& card : cards)
  93.     {
  94.       sum = sum + cardValues.at(card.value);
  95.     }
  96.     return sum;
  97.   }
  98.  
  99.   std::set <char> sameCards(int value)
  100.   {
  101.     std::set<char> tmp;
  102.     for(const auto& x : cardValues)
  103.     {
  104.       if(std::count_if(cards.begin(), cards.end(), [x, value](const Card& card) {return card.value == x.first;}) == value)
  105.       {
  106.         tmp.insert(x.first);
  107.       }
  108.     }
  109.     sumOfResult = 0;
  110.     for(const auto& x : tmp)
  111.     {
  112.       sumOfResult += cardValues.at(x);
  113.     }
  114.     return tmp;
  115.   }
  116.    
  117.   bool isTheSameCard(int value)
  118.   {
  119.     auto theSameCards = sameCards(value);
  120.     if(theSameCards.empty())
  121.     {
  122.       return false;    
  123.     }
  124.     sumOfResult = 0;
  125.     for(const auto& x : theSameCards)
  126.     {
  127.       sumOfResult += cardValues.at(x);
  128.     }
  129.     return true;
  130.   }
  131.  
  132.   bool isFourOfAKind()
  133.   {
  134.     return isTheSameCard(4);
  135.   }
  136.  
  137.   bool isFullHouse()
  138.   {
  139.     return isTheSameCard(3) && isTheSameCard(2);
  140.   }
  141.  
  142.   bool isThreeOfAKind()
  143.   {
  144.     return isTheSameCard(3);
  145.   }
  146.  
  147.   bool isTwoPairs()
  148.   {
  149.     return sameCards(2).size() == 2;
  150.   }
  151.  
  152.   bool isOnePair()
  153.   {
  154.     return sameCards(2).size() == 1;
  155.   }
  156.  
  157.   char theHighestCard()
  158.   {
  159.     auto max = cards.begin()->value;
  160.     for(const auto& card : cards)
  161.     {
  162.       if(card.value > max)
  163.       {
  164.         max = card.value;
  165.       }
  166.     }
  167.     return max;
  168.   }
  169.  
  170.   ResultHand checkResultHand()
  171.   {
  172.     if(isRoyalFlush())
  173.     {
  174.       return ResultHand::RoyalFlush;
  175.     }
  176.     if(isStraightFlush())
  177.     {
  178.       return ResultHand::StraightFlush;
  179.     }
  180.     if(isFourOfAKind())
  181.     {
  182.       return ResultHand::FourOfAKind;
  183.     }
  184.     if(isFullHouse())
  185.     {
  186.       return ResultHand::FullHouse;
  187.     }
  188.     if(isFlush())
  189.     {
  190.       return ResultHand::Flush;
  191.     }
  192.     if(isStraight())
  193.     {
  194.       return ResultHand::Straight;
  195.     }
  196.     if(isThreeOfAKind())
  197.     {
  198.       return ResultHand::ThreeOfAKind;
  199.     }
  200.     if(isTwoPairs())
  201.     {
  202.       return ResultHand::TwoPair;
  203.     }
  204.     if(isOnePair())
  205.     {
  206.       return ResultHand::OnePair;
  207.     }
  208.     else
  209.     {
  210.       highestCard = theHighestCard();
  211.       return ResultHand::HighCard;
  212.     }
  213.   }
  214.  
  215.     int sum;
  216.     int highestCard;
  217.     int sumOfResult{0};
  218.     ResultHand resultHand;
  219.       std::vector<Card> cards;
  220.    
  221. private:
  222.  
  223.  
  224.   std::map<char, int> cardValues;
  225. };
  226.  
  227. enum class Result { Win, Loss, Tie };
  228.  
  229. Result compare (const PokerHand &player, const PokerHand &opponent) {
  230.     for(const auto& card : player.cards)
  231.     {
  232.       std::cout << card.value << card.suit << " ";
  233.     }
  234.     std::cout<<std::endl;
  235.     for(const auto& card : opponent.cards)
  236.     {
  237.       std::cout << card.value << card.suit << " ";
  238.     }
  239.     std::cout << std::endl;
  240.   std::cout << "PLAYER: " << player.resultHand;
  241.   std::cout << "OPPONENT: " << opponent.resultHand << std::endl;
  242.  
  243.   if(player.resultHand > opponent.resultHand)
  244.   {
  245.     return Result::Loss;
  246.   }
  247.   if(player.resultHand < opponent.resultHand)
  248.   {
  249.     return Result::Win;
  250.   }
  251.   if(player.resultHand ==  ResultHand::HighCard && opponent.resultHand == ResultHand::HighCard)
  252.   {
  253.     if(player.highestCard > opponent.highestCard)
  254.     {
  255.       return Result::Win;
  256.     }
  257.     if(player.highestCard < opponent.highestCard)
  258.     {
  259.       return Result::Loss;
  260.     }
  261.    
  262.   }
  263.   if(player.sumOfResult > opponent.sumOfResult)
  264.   {
  265.     return Result::Win;
  266.   }
  267.   if(player.sumOfResult < opponent.sumOfResult)
  268.   {
  269.     return Result::Loss;
  270.   }
  271.   if(player.sum > opponent.sum)
  272.   {
  273.     return Result::Win;
  274.   }
  275.   if(player.sum < opponent.sum)
  276.   {
  277.     return Result::Loss;
  278.   }
  279.   return Result::Tie;
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement