fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <ctime>
  5. #include <cstdlib>
  6. #include <map>
  7. #include <string>
  8.  
  9. using namespace std;
  10.  
  11. // Struct đại diện cho một lá bài
  12. struct Card {
  13. string suit;
  14. string rank;
  15. int value;
  16. };
  17.  
  18. // Struct đại diện cho người chơi
  19. struct Player {
  20. string name;
  21. vector<Card> hand;
  22. int balance;
  23. int bet;
  24. };
  25.  
  26. // Hàm tạo bộ bài
  27. vector<Card> createDeck() {
  28. vector<Card> deck;
  29. vector<string> suits = { "Hearts", "Diamonds", "Clubs", "Spades" };
  30. vector<string> ranks = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
  31. vector<int> values = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
  32.  
  33. for (const string& suit : suits) {
  34. for (size_t i = 0; i < ranks.size(); ++i) {
  35. deck.push_back(Card{ suit, ranks[i], values[i] });
  36. }
  37. }
  38.  
  39. return deck;
  40. }
  41.  
  42. // Hàm xáo bộ bài
  43. void shuffleDeck(vector<Card>& deck) {
  44. srand(static_cast<unsigned int>(time(0)));
  45. random_shuffle(deck.begin(), deck.end());
  46. }
  47.  
  48. // Hàm in ra một lá bài
  49. void printCard(const Card& card) {
  50. cout << card.rank << " of " << card.suit << endl;
  51. }
  52.  
  53. // Hàm chia bài cho người chơi
  54. vector<Card> dealHand(vector<Card>& deck, int numCards) {
  55. vector<Card> hand;
  56. for (int i = 0; i < numCards; ++i) {
  57. hand.push_back(deck.back());
  58. deck.pop_back();
  59. }
  60. return hand;
  61. }
  62.  
  63. // Hàm chấm điểm tay bài
  64. int evaluateHand(const vector<Card>& hand) {
  65. // Tính điểm của tay bài dựa trên luật Texas Hold'em
  66. map<string, int> rankCount;
  67. map<string, int> suitCount;
  68. vector<int> values;
  69.  
  70. for (const Card& card : hand) {
  71. rankCount[card.rank]++;
  72. suitCount[card.suit]++;
  73. values.push_back(card.value);
  74. }
  75.  
  76. sort(values.begin(), values.end());
  77. bool isFlush = (suitCount.size() == 1);
  78. bool isStraight = (values.size() == 5 && values[4] - values[0] == 4);
  79.  
  80. bool isFourOfAKind = false, isFullHouse = false, isThreeOfAKind = false, isTwoPair = false, isOnePair = false;
  81. for (const auto& count : rankCount) {
  82. if (count.second == 4) isFourOfAKind = true;
  83. if (count.second == 3) isThreeOfAKind = true;
  84. if (count.second == 2) isOnePair = !isOnePair ? true : (isTwoPair = true);
  85. }
  86. isFullHouse = isThreeOfAKind && isOnePair;
  87.  
  88. if (isFlush && isStraight) return 8; // Straight Flush
  89. if (isFourOfAKind) return 7; // Four of a Kind
  90. if (isFullHouse) return 6; // Full House
  91. if (isFlush) return 5; // Flush
  92. if (isStraight) return 4; // Straight
  93. if (isThreeOfAKind) return 3; // Three of a Kind
  94. if (isTwoPair) return 2; // Two Pair
  95. if (isOnePair) return 1; // One Pair
  96. return 0; // High Card
  97. }
  98.  
  99. // Hàm so sánh tay bài giữa hai người chơi
  100. string compareHands(const vector<Card>& hand1, const vector<Card>& hand2) {
  101. int score1 = evaluateHand(hand1);
  102. int score2 = evaluateHand(hand2);
  103.  
  104. if (score1 > score2) {
  105. return "Player 1 wins!";
  106. }
  107. else if (score1 < score2) {
  108. return "Player 2 wins!";
  109. }
  110. else {
  111. return "It's a tie!";
  112. }
  113. }
  114.  
  115. // Hàm hiển thị tay bài
  116. void printHand(const vector<Card>& hand) {
  117. for (const Card& card : hand) {
  118. printCard(card);
  119. }
  120. }
  121.  
  122. // Hàm đặt cược của người chơi
  123. void placeBets(Player& player1, Player& player2) {
  124. cout << player1.name << ", bạn có " << player1.balance << " đơn vị tiền. Bạn muốn đặt cược bao nhiêu? ";
  125. cin >> player1.bet;
  126. player1.balance -= player1.bet;
  127.  
  128. cout << player2.name << ", bạn có " << player2.balance << " đơn vị tiền. Bạn muốn đặt cược bao nhiêu? ";
  129. cin >> player2.bet;
  130. player2.balance -= player2.bet;
  131. }
  132.  
  133. int main() {
  134. vector<Card> deck = createDeck();
  135. shuffleDeck(deck);
  136.  
  137. Player player1 = { "Player 1", {}, 1000, 0 };
  138. Player player2 = { "Player 2", {}, 1000, 0 };
  139.  
  140. // Chia bài pre-flop
  141. player1.hand = dealHand(deck, 2);
  142. player2.hand = dealHand(deck, 2);
  143.  
  144. cout << player1.name << "'s hand:\n";
  145. printHand(player1.hand);
  146.  
  147. cout << "\n" << player2.name << "'s hand:\n";
  148. printHand(player2.hand);
  149.  
  150. // Đặt cược pre-flop
  151. placeBets(player1, player2);
  152.  
  153. // Chia Flop
  154. vector<Card> flop = dealHand(deck, 3);
  155. cout << "\nFlop:\n";
  156. printHand(flop);
  157.  
  158. // Đặt cược sau Flop
  159. placeBets(player1, player2);
  160.  
  161. // Chia Turn
  162. vector<Card> turn = dealHand(deck, 1);
  163. cout << "\nTurn:\n";
  164. printHand(turn);
  165.  
  166. // Đặt cược sau Turn
  167. placeBets(player1, player2);
  168.  
  169. // Chia River
  170. vector<Card> river = dealHand(deck, 1);
  171. cout << "\nRiver:\n";
  172. printHand(river);
  173.  
  174. // Đặt cược sau River
  175. placeBets(player1, player2);
  176.  
  177. // Kết hợp bài chung với bài của người chơi
  178. vector<Card> player1FullHand = player1.hand;
  179. vector<Card> player2FullHand = player2.hand;
  180. player1FullHand.insert(player1FullHand.end(), flop.begin(), flop.end());
  181. player1FullHand.insert(player1FullHand.end(), turn.begin(), turn.end());
  182. player1FullHand.insert(player1FullHand.end(), river.begin(), river.end());
  183.  
  184. player2FullHand.insert(player2FullHand.end(), flop.begin(), flop.end());
  185. player2FullHand.insert(player2FullHand.end(), turn.begin(), turn.end());
  186. player2FullHand.insert(player2FullHand.end(), river.begin(), river.end());
  187.  
  188. // So sánh tay bài và thông báo người thắng
  189. string result = compareHands(player1FullHand, player2FullHand);
  190. cout << "\nResult: " << result << endl;
  191.  
  192. // Cập nhật số tiền thắng cuộc
  193. if (result == "Player 1 wins!") {
  194. player1.balance += player1.bet + player2.bet;
  195. }
  196. else if (result == "Player 2 wins!") {
  197. player2.balance += player1.bet + player2.bet;
  198. }
  199. else {
  200. player1.balance += player1.bet;
  201. player2.balance += player2.bet;
  202. }
  203.  
  204. cout << player1.name << "'s balance: " << player1.balance << endl;
  205. cout << player2.name << "'s balance: " << player2.balance << endl;
  206.  
  207. return 0;
  208. }
  209.  
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
Player 1's hand:
10 of Spades
2 of Clubs

Player 2's hand:
9 of Clubs
8 of Clubs
Player 1, bạn có 1000 đơn vị tiền. Bạn muốn đặt cược bao nhiêu? Player 2, bạn có 1000 đơn vị tiền. Bạn muốn đặt cược bao nhiêu? 
Flop:
K of Diamonds
10 of Hearts
3 of Clubs
Player 1, bạn có 1000 đơn vị tiền. Bạn muốn đặt cược bao nhiêu? Player 2, bạn có 1000 đơn vị tiền. Bạn muốn đặt cược bao nhiêu? 
Turn:
5 of Clubs
Player 1, bạn có 1000 đơn vị tiền. Bạn muốn đặt cược bao nhiêu? Player 2, bạn có 1000 đơn vị tiền. Bạn muốn đặt cược bao nhiêu? 
River:
4 of Spades
Player 1, bạn có 1000 đơn vị tiền. Bạn muốn đặt cược bao nhiêu? Player 2, bạn có 1000 đơn vị tiền. Bạn muốn đặt cược bao nhiêu? 
Result: Player 1 wins!
Player 1's balance: 1000
Player 2's balance: 1000