From 066889e0484a24a2bccd12eabb82ca0b2be7b19b Mon Sep 17 00:00:00 2001 From: Krekhov Nikolai Date: Sun, 20 Mar 2022 16:48:04 +0300 Subject: [PATCH 01/24] add somu structure to project --- include/card.h | 0 include/player.h | 0 include/state.h | 0 sources/card.cpp | 0 sources/player.cpp | 0 sources/state.cpp | 0 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 include/card.h create mode 100644 include/player.h create mode 100644 include/state.h create mode 100644 sources/card.cpp create mode 100644 sources/player.cpp create mode 100644 sources/state.cpp diff --git a/include/card.h b/include/card.h new file mode 100644 index 0000000..e69de29 diff --git a/include/player.h b/include/player.h new file mode 100644 index 0000000..e69de29 diff --git a/include/state.h b/include/state.h new file mode 100644 index 0000000..e69de29 diff --git a/sources/card.cpp b/sources/card.cpp new file mode 100644 index 0000000..e69de29 diff --git a/sources/player.cpp b/sources/player.cpp new file mode 100644 index 0000000..e69de29 diff --git a/sources/state.cpp b/sources/state.cpp new file mode 100644 index 0000000..e69de29 From def47599e10c60d1473fb54d3f57ce1130bf6aa7 Mon Sep 17 00:00:00 2001 From: Polev Alexey Date: Sat, 30 Apr 2022 21:10:23 +0300 Subject: [PATCH 02/24] global refactoring --- include/Card.h | 27 +++ include/Deck.h | 32 ++++ include/Hand.h | 59 ++++++ include/PokerGame.h | 38 ++++ include/card.h | 0 include/player.h | 0 include/state.h | 0 sources/CMakeLists.txt | 10 + sources/Card.cpp | 58 ++++++ sources/Deck.cpp | 69 +++++++ sources/Hand.cpp | 333 +++++++++++++++++++++++++++++++++ sources/Poker.cpp | 5 + sources/PokerGame.cpp | 415 +++++++++++++++++++++++++++++++++++++++++ sources/card.cpp | 0 sources/player.cpp | 0 sources/state.cpp | 0 16 files changed, 1046 insertions(+) create mode 100644 include/Card.h create mode 100644 include/Deck.h create mode 100644 include/Hand.h create mode 100644 include/PokerGame.h delete mode 100644 include/card.h delete mode 100644 include/player.h delete mode 100644 include/state.h create mode 100644 sources/CMakeLists.txt create mode 100644 sources/Card.cpp create mode 100644 sources/Deck.cpp create mode 100644 sources/Hand.cpp create mode 100644 sources/Poker.cpp create mode 100644 sources/PokerGame.cpp delete mode 100644 sources/card.cpp delete mode 100644 sources/player.cpp delete mode 100644 sources/state.cpp diff --git a/include/Card.h b/include/Card.h new file mode 100644 index 0000000..525fbd4 --- /dev/null +++ b/include/Card.h @@ -0,0 +1,27 @@ +#include +#ifndef CARD_H_ +#define CARD_H_ +using std::string; + +enum Suit{ + HEARTS=1, DIAMONDS, SPADES, CLUBS}; +enum Face{ + TWO=1, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE}; + +class Card { +private: + Suit suit; + Face face; +public: + Card(const Suit& suit, const Face& face); + Face getFace() const; + void setFace(Face face); + Suit getSuit() const; + void setSuit(Suit suit); + string getSuitString(); + string getFaceString(); + string toString(); + virtual ~Card(); +}; + +#endif /* CARD_H_ */ diff --git a/include/Deck.h b/include/Deck.h new file mode 100644 index 0000000..9bf0d5c --- /dev/null +++ b/include/Deck.h @@ -0,0 +1,32 @@ +#ifndef DECK_H_ +#define DECK_H_ + +#include +#include +#include +#include +#include "Card.h" +using std::vector; +using std::cout; +using std::endl; + + +class Deck { +private: + vector deck; +public: + Deck(); + Deck(const vector& deck); + void initDeck(); + const vector& getDeck() const; + void setDeck(const vector& deck); + void shuffle(); + int cardsRemaining(); + vector dealHand(const int& size); + Card drawCard(const unsigned& index = 0); + void addCard(Card card); + string toString(); + virtual ~Deck(); +}; + +#endif /* DECK_H_ */ diff --git a/include/Hand.h b/include/Hand.h new file mode 100644 index 0000000..17c3e5d --- /dev/null +++ b/include/Hand.h @@ -0,0 +1,59 @@ +#ifndef HAND_H_ +#define HAND_H_ +#include "Card.h" +#include +#include +#include +using std::vector; +using std::string; +using std::cout; +using std::endl; +using std::stringstream; + +class Hand { +private: + string ownerName; + vector hand; + unsigned short countFaces[13]; + unsigned short countSuits[4]; +public: + Hand(const vector& hand); + + const vector& getHand() const; + void setHand(const vector& hand); + const string& getOwnerName() const; + void setOwnerName(const string& ownerName); + + friend Hand operator+(Hand& hand1, Hand& hand2); + friend bool operator>(Hand& hand1, Hand& hand2); + friend bool operator<(Hand& hand1, Hand& hand2); + friend bool operator>=(Hand& hand1, Hand& hand2); + friend bool operator<=(Hand& hand1, Hand& hand2); + friend bool operator==(Hand& hand1, Hand& hand2); + + void countCardProps(); + void sortBySuit(const bool& asc = false); + void sortByFace(const bool& asc = false); + void swapCards(const unsigned& index1, const unsigned& index2); + Card getCard(int index); + Card peekCard(int index); + void addCard(Card card); + int cardsRemaining(); + bool hasFaceMatch(const int& num1, const int& num2 = 0); + bool hasSuitMatch(const int& num); + bool hasStraight(); + unsigned short getHighestCard(const short& recur = 0); + unsigned short getHighestCombo(const short& recur = 0); + int evaluate(); + string printEvaluation(); + string toFaceSymbol(const Face& index); + string toSuitSymbol(const Suit& index); + string drawHand(const int& faceDown = 0); + string toString(); + static void winner(Hand& h1, Hand& h2); + static int determineWinner(Hand& hand1, Hand& hand2); + + virtual ~Hand(); +}; + +#endif /* HAND_H_ */ diff --git a/include/PokerGame.h b/include/PokerGame.h new file mode 100644 index 0000000..1520454 --- /dev/null +++ b/include/PokerGame.h @@ -0,0 +1,38 @@ +#ifndef POKERGAME_H_ +#define POKERGAME_H_ + +#include +#include +#include +#include "Deck.h" +#include "Hand.h" +using namespace std; + +class PokerGame { +private: + Deck deck; + unsigned short numOfPlayers{}; + unsigned short gameType; + vector playerHands; + vector credit; + stringstream history; + static void splash(); + static void clearScreen(); + static void pause(); +public: + PokerGame(); + unsigned short getNumOfPlayers() const; + void setNumOfPlayers(unsigned short numOfPlayers); + unsigned short getGameType() const; + void setGameType(unsigned short gameType); + const vector& getPlayerHands() const; + void setPlayerHands(const vector& playerHands); + void discardFromHand(Hand& hand, int discard); + void beginGame(); + void gameInit(); + void classicGameLoop(int turns = 1); + void texasGameLoop(int turns = 1); + virtual ~PokerGame(); +}; + +#endif /* POKERGAME_H_ */ diff --git a/include/card.h b/include/card.h deleted file mode 100644 index e69de29..0000000 diff --git a/include/player.h b/include/player.h deleted file mode 100644 index e69de29..0000000 diff --git a/include/state.h b/include/state.h deleted file mode 100644 index e69de29..0000000 diff --git a/sources/CMakeLists.txt b/sources/CMakeLists.txt new file mode 100644 index 0000000..810f3f2 --- /dev/null +++ b/sources/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.20) +project(Proj) + +set(CMAKE_CXX_STANDARD 17) + +file(GLOB SOURCES + *.cpp + ) + +add_executable(Proj ${SOURCES}) diff --git a/sources/Card.cpp b/sources/Card.cpp new file mode 100644 index 0000000..b054545 --- /dev/null +++ b/sources/Card.cpp @@ -0,0 +1,58 @@ +#include "Card.h" + +Card::Card(const Suit& suit, const Face& face) { + setSuit(suit); + setFace(face); +} + +string Card::getSuitString() { + switch(suit){ + case HEARTS: return "Hearts"; + case DIAMONDS: return "Diamonds"; + case SPADES: return "Spades"; + case CLUBS: return "Clubs"; + default: return "Unknown"; + } +} + +string Card::getFaceString() { + switch(face){ + case TWO: return "Two"; + case THREE: return "Three"; + case FOUR: return "Four"; + case FIVE: return "Five"; + case SIX: return "Six"; + case SEVEN: return "Seven"; + case EIGHT: return "Eight"; + case NINE: return "Nine"; + case TEN: return "Ten"; + case JACK: return "Jack"; + case QUEEN: return "Queen"; + case KING: return "King"; + case ACE: return "Ace"; + default: return "Unknown"; + } +} + +string Card::toString() { + return getFaceString() + " of " + getSuitString(); +} + +Face Card::getFace() const { + return face; +} + +void Card::setFace(Face face) { + this->face = face; +} + +Suit Card::getSuit() const { + return suit; +} + +void Card::setSuit(Suit suit) { + this->suit = suit; +} + +Card::~Card() { +} diff --git a/sources/Deck.cpp b/sources/Deck.cpp new file mode 100644 index 0000000..b161c20 --- /dev/null +++ b/sources/Deck.cpp @@ -0,0 +1,69 @@ +#include "Deck.h" + +Deck::Deck() { + srand(time(0)); + initDeck(); +} + +Deck::Deck(const vector& deck) { + srand(time(0)); + setDeck(deck); +} + +void Deck::initDeck(){ + vector newDeck; + for(int i = TWO; i != ACE; ++i) + for(int j = HEARTS; j!=CLUBS; ++j) + newDeck.emplace_back(static_cast(j),static_cast(i)); + setDeck(newDeck); +} + +void Deck::setDeck(const vector& deck) { + this->deck = deck; +} + +void Deck::shuffle() { + vector newDeck; + int rnum; + while(deck.size()>0){ + rnum = rand()%(deck.size()); + newDeck.push_back(drawCard(rnum)); + } + setDeck(newDeck); +} + +Card Deck::drawCard(const unsigned& index) { + Card drawnCard = deck.at(index); + deck.erase(deck.begin()+index); + return drawnCard; +} + +void Deck::addCard(Card card){ + deck.push_back(card); +} + +vector Deck::dealHand(const int& size){ + vector hand; + for(int i = 0; i < size; i++) + hand.push_back(drawCard(0)); + return hand; +} + +string Deck::toString() { + string str = ""; + for(int i = 0; i < cardsRemaining(); i++) + str+=deck[i].toString() + "\n"; + return str; +} + +const vector& Deck::getDeck() const { + return deck; +} + +int Deck::cardsRemaining() { + return deck.size(); +} + +Deck::~Deck() { +} + diff --git a/sources/Hand.cpp b/sources/Hand.cpp new file mode 100644 index 0000000..6a5e39d --- /dev/null +++ b/sources/Hand.cpp @@ -0,0 +1,333 @@ +#include "Hand.h" + +//Constructor +Hand::Hand(const vector& hand) { + setHand(hand); + countCardProps(); +} + +//Count number of faces and suits in the hand +void Hand::countCardProps(){ + for(unsigned i = 0; i < sizeof(countFaces)/sizeof(countFaces[0]); i++) + countFaces[i] = 0; + for(unsigned i = 0; i < sizeof(countSuits)/sizeof(countSuits[0]); i++) + countSuits[i] = 0; + for(unsigned i = 0; i < hand.size(); i++){ + countFaces[hand.at(i).getFace()-1]++; + countSuits[hand.at(i).getSuit()-1]++; + } +} + +//Hand getter +const vector& Hand::getHand() const { + return hand; +} + +//Hand setter +void Hand::setHand(const vector& hand) { + this->hand = hand; +} + +const string& Hand::getOwnerName() const { + return ownerName; +} + +void Hand::setOwnerName(const string& ownerName) { + this->ownerName = ownerName; +} + +Hand operator+(Hand& hand1, Hand& hand2){ + Hand h1 = hand1; + Hand h2 = hand2; + while(h2.cardsRemaining()>0) h1.addCard(h2.getCard(0)); + return h1; +} +bool operator>(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) == 1?true:false);} +bool operator<(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) == -1?true:false);} +bool operator>=(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) >= 0?true:false);} +bool operator<=(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) <= 0?true:false);} +bool operator==(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) == 0?true:false);} + +//Sort hand by suit +void Hand::sortBySuit(const bool& asc){ + unsigned tmp; + for(unsigned i = 0; i < getHand().size(); i++){ + tmp = i; + for(unsigned j = i; j < getHand().size(); j++){ + if(asc){ + if(getHand().at(j).getSuit() < getHand().at(tmp).getSuit()) tmp = j; + } else { + if(getHand().at(j).getSuit() > getHand().at(tmp).getSuit()) tmp = j; + } + } + swapCards(i, tmp); + } +} + +//Sort hand by face +void Hand::sortByFace(const bool& asc){ + unsigned tmp; + for(unsigned i = 0; i < getHand().size(); i++){ + tmp = i; + for(unsigned j = i; j < getHand().size(); j++){ + if(asc){ + if(getHand().at(j).getFace() < getHand().at(tmp).getFace()) tmp = j; + } else { + if(getHand().at(j).getFace() > getHand().at(tmp).getFace()) tmp = j; + } + } + swapCards(i, tmp); + } +} + +//Swap position of two cards +void Hand::swapCards(const unsigned& index1, const unsigned& index2){ + Card tmp = hand[index1]; + hand[index1] = hand[index2]; + hand[index2] = tmp; +} + +//Draw a card from the hand +Card Hand::getCard(int index) { + Card selected = hand[index]; + hand.erase(hand.begin()+index); + return selected; +} + +Card Hand::peekCard(int index) { + return hand[index]; +} + +void Hand::addCard(Card card){ + hand.push_back(card); +} + +//Number of cards remaining +int Hand::cardsRemaining(){ + return hand.size(); +} + +//Find if hand has a face match +bool Hand::hasFaceMatch(const int& num1, const int& num2) { + bool flag1 = 0, flag2 = 0; + for(unsigned i = 0; i < sizeof(countFaces)/sizeof(countFaces[0]); i++){ + if(countFaces[i] == num1 && !flag1){flag1 = true; continue;} + if(countFaces[i] == num2) flag2 = true; + } + return (flag1&flag2); +} + +//Find if hand has a number of matching suits +bool Hand::hasSuitMatch(const int& num) { + for(unsigned i = 0; i < sizeof(countSuits)/sizeof(countSuits[0]); i++) + if(countSuits[i] == num) return true; + return false; +} + +//Find if hand has a straight +bool Hand::hasStraight() { + unsigned iterator = 0; + while(countFaces[iterator]==0){iterator++;} + for(unsigned i = iterator; i < iterator+5; i++) + if(countFaces[i] == 0 || i >= sizeof(countFaces)/sizeof(countFaces[0])) return false; + return true; +} + +//Find the highest card value from the hand +unsigned short Hand::getHighestCard(const short& recur){ + unsigned short count = 0; + for(unsigned short i = 0; i < sizeof(countFaces)/sizeof(countFaces[0]); i++) + if(countFaces[i] > 0) count++; + if(count == 0) return 0; + unsigned short index = (sizeof(countFaces)/sizeof(countFaces[0]) - 1); + while(countFaces[index] == 0){index--;} + if(recur>0) { + countFaces[index] = 0; + return getHighestCard(recur-1); + } + countCardProps(); + return index; +} + +//Find the highest combo +unsigned short Hand::getHighestCombo(const short& recur){ + unsigned short count = 0; + for(unsigned short i = 1; i < sizeof(countFaces)/sizeof(countFaces[0]); i++) + if(countFaces[i] >= countFaces[count]) count = i; + if(recur>0) { + countFaces[count] = 0; + return getHighestCombo(recur-1); + } + countCardProps(); + return count; +} + +//Get a hand evaluation +int Hand::evaluate(){ + countCardProps(); + if(hasStraight() && hasSuitMatch(5)) return 8; + if(hasFaceMatch(4)) return 7; + if(hasFaceMatch(3,2)) return 6; + if(hasSuitMatch(5)) return 5; + if(hasStraight()) return 4; + if(hasFaceMatch(3)) return 3; + if(hasFaceMatch(2,2)) return 2; + if(hasFaceMatch(2)) return 1; + return 0; +} + +//Return a string evaluation +string Hand::printEvaluation(){ + switch(evaluate()){ + case 0: return "High Card"; + case 1: return "One Pair"; + case 2: return "Two Pair"; + case 3: return "Three Of A Kind"; + case 4: return "Straight"; + case 5: return "Flush"; + case 6: return "Full House"; + case 7: return "Four Of A Kind"; + case 8: return "Straight Flush"; + default: return "Error"; + } +} + +//Convert card face index to a symbol +string Hand::toFaceSymbol(const Face& index){ + switch(index){ + case TWO: return "2"; + case THREE: return "3"; + case FOUR: return "4"; + case FIVE: return "5"; + case SIX: return "6"; + case SEVEN: return "7"; + case EIGHT: return "8"; + case NINE: return "9"; + case TEN: return "T"; + case JACK: return "J"; + case QUEEN: return "Q"; + case KING: return "K"; + case ACE: return "A"; + default: return "0"; + } +} + +//Convert card suit index to a symbol +string Hand::toSuitSymbol(const Suit& index){ + switch(index){ + case HEARTS: return "♥"; + case DIAMONDS: return "♦"; + case SPADES: return "♠"; + case CLUBS: return "♣"; + default: return "O"; + } +} + +//Get a string of drawn cards from the hand +string Hand::drawHand(const int& faceDown){ + stringstream str; + for(unsigned i = 0; i < 5; i++){ + int tmp = faceDown; + for(unsigned j = 0; j < hand.size(); j++){ + switch(i){ + case 0: str << "┌─────┐"; break; + case 1: (tmp&1)?str << "│░░░░░│":str << "│" << toFaceSymbol(hand[j].getFace()) << " │"; break; + case 2: (tmp&1)?str << "│░░░░░│":str << "│ " << toSuitSymbol(hand[j].getSuit()) << " │"; break; + case 3: (tmp&1)?str << "│░░░░░│":str << "│ " << toFaceSymbol(hand[j].getFace()) << "│"; break; + case 4: str << "└─────┘"; break; + } + tmp=tmp>>1; + } + str << endl; + } + return str.str(); +} + +//Get a string of cards from the hand +string Hand::toString(){ + string str = ""; + for(unsigned i = 0; i < hand.size(); i++) + str+=hand[i].toString() + "\n"; + return str; +} + +//Destructor +Hand::~Hand() { +} + +int Hand::determineWinner(Hand& hand1, Hand& hand2){ + if(hand1.evaluate()>hand2.evaluate()) return 1; + else if(hand1.evaluate() hand2.getHighestCombo(i)) return 1; + else if(hand1.getHighestCombo(i) < hand2.getHighestCombo(i)) return -1; + } + break; + case 0: case 4: case 5: case 8: + if(hand1.getHighestCard() > hand2.getHighestCard()) return 1; + else if(hand1.getHighestCard() < hand2.getHighestCard()) return -1; + else{ + recur = 0; + cout << endl; + while(hand1.getHighestCard(recur) == hand2.getHighestCard(recur) && recur < hand1.cardsRemaining()){recur++;} + if(hand1.getHighestCard(recur) > hand2.getHighestCard(recur)) return 1; + else if(hand1.getHighestCard(recur) < hand2.getHighestCard(recur)) return -1; + } + } + } + return 0; +} + + + + + + + + + + + +//Winner logic +void Hand::winner(Hand& hand1, Hand& hand2){ + if(hand1.evaluate()>hand2.evaluate()) + cout << "1 wins with " << hand1.printEvaluation() << " against " << hand2.printEvaluation(); + else if(hand1.evaluate() hand2.getHighestCombo(i)){ + cout << "1 wins with " << hand1.printEvaluation() << " and highest card " << hand1.toFaceSymbol(static_cast(hand1.getHighestCombo(i)+1)); break;} + else if(hand1.getHighestCombo(i) < hand2.getHighestCombo(i)){ + cout << "2 wins with " << hand2.printEvaluation() << " and highest card " << hand2.toFaceSymbol(static_cast(hand2.getHighestCombo(i)+1)); break;} + } + break; + case 0: case 4: case 5: case 8: + if(hand1.getHighestCard() > hand2.getHighestCard()){ + cout << "1 wins with " << hand1.printEvaluation() << " and highest card " << hand1.toFaceSymbol(static_cast(hand1.getHighestCard()+1)); break;} + else if(hand1.getHighestCard() < hand2.getHighestCard()){ + cout << "2 wins with " << hand2.printEvaluation() << " and highest card " << hand2.toFaceSymbol(static_cast(hand2.getHighestCard()+1)); break;} + else{ + recur = 0; + cout << endl; + while(hand1.getHighestCard(recur) == hand2.getHighestCard(recur) && recur < hand1.cardsRemaining()){ + //cout << "Recur: " << recur << " : " << hand1.toFaceSymbol(hand1.getHighestCard(recur)+1) << endl; + recur++; + } + if(hand1.getHighestCard(recur) > hand2.getHighestCard(recur)){ + cout << "1 wins with " << hand1.printEvaluation() << " and highest card " << hand1.toFaceSymbol(static_cast(hand1.getHighestCard(recur)+1)); break;} + else if(hand1.getHighestCard(recur) < hand2.getHighestCard(recur)){ + cout << "2 wins with " << hand2.printEvaluation() << " and highest card " << hand2.toFaceSymbol(static_cast(hand2.getHighestCard(recur)+1)); break;} + else cout << "Equal standing with " << hand2.printEvaluation() << endl; break;} + } + } +} diff --git a/sources/Poker.cpp b/sources/Poker.cpp new file mode 100644 index 0000000..5c39fb7 --- /dev/null +++ b/sources/Poker.cpp @@ -0,0 +1,5 @@ +#include "PokerGame.h" +int main() { + PokerGame game; + game.beginGame(); +} diff --git a/sources/PokerGame.cpp b/sources/PokerGame.cpp new file mode 100644 index 0000000..57aa325 --- /dev/null +++ b/sources/PokerGame.cpp @@ -0,0 +1,415 @@ +#include "PokerGame.h" + +PokerGame::PokerGame() { + setNumOfPlayers(2); + gameType = 0; +} + +void PokerGame::splash() { + cout << "╔═══════════════ C++ ════════════════╗" << '\n'; + cout << "║ ╔════╗ ╔════╗ ╔═╗╔═╗ ╔════╗ ╔════╗ ║" << '\n'; + cout << "║ ║ ╔╗ ║ ║ ╔╗ ║ ║ ║║ ║ ║ ╔══╝ ║ ╔╗ ║ ║" << '\n'; + cout << "║ ║ ║║ ║ ║ ║║ ║ ║ ╚╝ ║ ║ ║ ║ ╚╝ ║ ║" << '\n'; + cout << "║ ║ ╚╝ ║ ║ ║║ ║ ║ ╔═╝ ║ ╚══╗ ║ ╔═╝ ║" << '\n'; + cout << "║ ║ ╔══╝ ║ ║║ ║ ║ ╚═╗ ║ ╔══╝ ║ ╚═╗ ║" << '\n'; + cout << "║ ║ ║ ║ ║║ ║ ║ ╔╗ ║ ║ ║ ║ ╔╗ ║ ║" << '\n'; + cout << "║ ║ ║ ║ ╚╝ ║ ║ ║║ ║ ║ ╚══╗ ║ ║║ ║ ║" << '\n'; + cout << "║ ╚═╝ ╚════╝ ╚═╝╚═╝ ╚════╝ ╚═╝╚═╝ ║" << '\n'; + cout << "╚════════════════════════════════════╝" << '\n'; + cout << '\n'; +} + +void PokerGame::clearScreen() { + for (int i = 0; i < 50; i++) { + cout << '\n'; + } +} + +void PokerGame::pause() { + cout << "Press enter to continue...\n" << flush; + cin.ignore(20, cin.peek()); + cin.ignore(20, '\n'); +} + +void PokerGame::discardFromHand(Hand &hand, int discard) { + if (discard < 1 || discard > 3) return; + vector index(hand.cardsRemaining(), false); + for (int i = 0; i < discard; i++) { + int choice; + cout << "\nEnter " << (i == 0 ? "first" : i == 1 ? "second" : "third") << " card index to discard: "; + cin >> choice; + cout << "- Discarding " << hand.peekCard(choice - 1).toString() << '\n'; + index[choice - 1] = true; + } + + for (int i = sizeof(index) / sizeof(index[0]) - 1; i >= 0; i--) { + if (index[i]) { + deck.addCard(hand.getCard(i)); + hand.addCard(deck.drawCard()); + } + } + hand.sortByFace(); + cout << "\n\nNew hand: (" << hand.printEvaluation() << ")" << '\n'; + cout << hand.drawHand() << '\n'; + pause(); +} + +void PokerGame::beginGame() { + splash(); + gameInit(); + switch (gameType) { + case 1: classicGameLoop(); + break; + case 2: texasGameLoop(5); + break; + } +} + +void PokerGame::gameInit() { + deck.shuffle(); + unsigned short num; + unsigned short game; + cout << "\n1 - Classic Poker " << '\n'; + cout << "2 - Texas Hold'em " << '\n'; + cout << "Input game type: "; + cin >> game; + cout << "\nInput number of players: "; + cin >> num; + setNumOfPlayers(num); + setGameType(game); + string name; + cout << '\n'; + for (int i = 0; i < numOfPlayers; i++) { + cout << "Enter name for player " << i + 1 << ": "; + cin >> name; + playerHands.push_back(deck.dealHand(gameType == 1 ? 5 : 2)); + playerHands[i].setOwnerName(name); + playerHands[i].sortByFace(); + credit.push_back(100); + } +} + +void PokerGame::classicGameLoop(int turns) { + string names[numOfPlayers]; + for (int i = 0; i < numOfPlayers; i++) names[i] = playerHands[i].getOwnerName(); + for (int i = 0; i < turns; i++) { + for (int j = 0; j < numOfPlayers; j++) { + pause(); + clearScreen(); + cout << "============= ROUND " << i + 1 << " =============\n\n"; + int discard; + cout << playerHands[j].getOwnerName() << "'s hand: (" << playerHands[j].printEvaluation() << ")\n\n"; + cout << playerHands[j].drawHand(); + for (int k = 0; k < playerHands[j].cardsRemaining(); k++) cout << "╚═ " << k + 1 << " ═╝"; + cout << '\n'; + cout << "\nInput number of cards to discard (up to three): "; + cin >> discard; + discardFromHand(playerHands[j], discard); + } + + vector hands(numOfPlayers, false); + for (int j = 0; j < numOfPlayers - 1; j++) { + if (hands[j]) continue; + for (int k = j + 1; k < numOfPlayers; k++) { + if (playerHands[j] > playerHands[k]) hands[k] = 1; + else if (playerHands[j] < playerHands[k]) { + hands[j] = true; + break; + } + } + } + + int winnerCount = 0; + for (int j = 0; j < numOfPlayers; j++) { + if (!hands[j]) winnerCount++; + } + + clearScreen(); + cout << "============= ROUND " << i + 1 << " =============\n\n"; + for (int j = 0; j < numOfPlayers; j++) { + cout << playerHands[j].getOwnerName() << "'s hand: (" << playerHands[j].printEvaluation() << ")\n"; + cout << playerHands[j].drawHand(); + cout << "\n===================================\n\n"; + } + + cout << "===================================\n"; + if (winnerCount == 1) { + for (int j = 0; j < numOfPlayers; j++) + if (!hands[j]) + cout << playerHands[j].getOwnerName() << " wins with " << playerHands[j].printEvaluation() + << "\n"; + } else cout << "Tie, split the pot.\n"; + cout << "===================================\n"; + + deck.initDeck(); + deck.shuffle(); + playerHands.clear(); + + for (int j = 0; j < numOfPlayers; j++) { + playerHands.push_back(deck.dealHand(5)); + playerHands[j].setOwnerName(names[j]); + playerHands[j].sortByFace(); + } + + cout << "Next: Round " << (i + 2) << '\n'; + } +} + +void PokerGame::texasGameLoop(int turns) { + int pot, stage, dealer, ante, limit; + bool folded[numOfPlayers]; + int foldedCount, player, loop = 0; + Hand dealerHand(deck.dealHand(5)); + + while (1) { +//Init game data + stage = 31; + pot = 0; + foldedCount = 0; + for (int i = 0; i < numOfPlayers; i++) { + playerHands[i].setHand(deck.dealHand(2)); + playerHands[i].sortByFace(); + folded[i] = false; + } + history.str("- Begin new game -\n"); + dealer = loop % numOfPlayers; + player = (dealer + 2) % numOfPlayers; + deck.initDeck(); + deck.shuffle(); + dealerHand.setHand(deck.dealHand(5)); + + for (int i = 0; i < numOfPlayers; i++) { + if (credit[i] <= 0) { + folded[i] = true; + foldedCount++; + } + } + + if (foldedCount == numOfPlayers - 1) { + for (int i = 0; i < numOfPlayers; i++) + if (credit[i] > 0) { + cout << "======================================" << '\n'; + cout << playerHands[i].getOwnerName() << " won the game. " << '\n'; + cout << "======================================" << '\n'; + pause(); + return; + } + } + + for (int turn = 0; turn < 4; turn++) { +//Init round data + limit = numOfPlayers; + history << "\n- Begin round " << turn + 1 << " -" << '\n'; + ante = 0; + if (turn == 0) { + history << "Current dealer: " << playerHands[dealer].getOwnerName() << '\n'; + for (int i = 1; i < 3; i++) { + pot += i; + credit.at((dealer + i) % numOfPlayers) -= i; + history << (i == 1 ? "Small (1$)" : "Big (2$)") << " blind from " + << playerHands.at((dealer + i) % numOfPlayers).getOwnerName() << '\n'; + } + ante = 2; + } + + +//Betting stage + if (turn != 3) { + for (int i = 0; i < limit; i++) { + if (foldedCount == numOfPlayers - 1) break; + player = (player + 1) % numOfPlayers; + if (folded[player]) continue; +//Temporary evaluative hand + Hand check = playerHands[player]; + for (int j = 0; j < (turn == 0 ? 0 : turn == 1 ? 3 : (turn + 2)); j++) + check.addCard(dealerHand.peekCard(j)); + check.sortByFace(); +//Print history + clearScreen(); + cout << "============= HISTORY =============\n"; + cout << history.str(); +//Print game data + cout << "\n============= ROUND " << turn + 1 << " =============\n\n"; + cout << ((player == dealer) ? "*DEALER* " : "") << "Player: " + << playerHands[player].getOwnerName() + << " (Credit: " << credit[player] << "$)\n\n"; + cout << "Pot: " << pot << "$\n"; + cout << "Ante: " << ante << "$.\n\n"; + cout << "Dealer hand:" << '\n'; + cout << dealerHand.drawHand(stage) << '\n'; + cout << "Waiting for player " << playerHands[player].getOwnerName() << '\n'; + pause(); + cout << "Hand (" << check.printEvaluation() << "):" << '\n'; + cout << playerHands[player].drawHand() << '\n'; +//Choose action + short action = 0; + while ((action < 1 && action != -1) || action > 3) { + cout << "1 - Fold 2 - " << (ante == 0 ? "Check" : "Call") << " 3 - Raise (-1 to quit)" + << '\n'; + cout << "Choose action: "; + cin >> action; + } +//Execute action + switch (action) { + case -1: clearScreen(); + cout << "Thank you for playing!" << '\n'; + return; + //Case Fold + case 1: folded[player] = true; + cout << "You folded." << '\n'; + history << playerHands[player].getOwnerName() << " folded." << '\n'; + foldedCount++; + break; + //Case Call/Check + case 2: + if (ante == 0) { + cout << "You checked." << '\n'; + history << playerHands[player].getOwnerName() << " checked." << '\n'; + } else { + if (ante > credit[player]) { + pot += credit[player]; + credit[player] -= credit[player]; + folded[player] = true; + foldedCount++; + cout << "You went all in with " << ante << "$." << '\n'; + history << playerHands[player].getOwnerName() << " went all in with " << ante + << "$." << '\n'; + } else { + pot += ante; + credit[player] -= ante; + cout << "You called with " << ante << "$." << '\n'; + history << playerHands[player].getOwnerName() << " called with " << ante << "$." + << '\n'; + } + } + break; + //Case Raise + case 3: int raise = 0; + while (raise <= 0) { + cout << "Choose amount to raise with: "; + cin >> raise; + } + if (raise >= credit[player]) { + raise = credit[player]; + folded[player] = true; + foldedCount++; + } + limit = numOfPlayers; + i = 0; + ante = raise; + pot += raise; + credit[player] -= raise; + cout << "You raised ante to " << ante << "$." << '\n'; + history << playerHands[player].getOwnerName() << " raised ante to " << ante << "$." + << '\n'; + break; + } + + pause(); + } + +//Enter final round + } else { + vector evaluate; + vector loser(numOfPlayers, false); + int winnerCount = 0; + + for (int i = 0; i < numOfPlayers; i++) { + evaluate.push_back(playerHands[i] + dealerHand); + evaluate[i].sortByFace(); + } + + for (int i = 0; i < numOfPlayers - 1; i++) { + if (folded[i] && credit[i] > 0) loser[i] = true; + if (loser[i]) continue; + for (int j = i + 1; j < numOfPlayers; j++) { + if (folded[j] && credit[j] > 0) { + loser[j] = true; + break; + } else if (evaluate[i] > evaluate[j]) { + loser[j] = true; + break; + } else if (evaluate[i] < evaluate[j]) { + loser[i] = true; + break; + } + } + } + + for (int i = 0; i < numOfPlayers; i++) if (!loser[i]) winnerCount++; + + dealerHand.sortByFace(); + + clearScreen(); + cout << "=========== FINAL ROUND ===========\n\n"; + cout << "Dealer hand: " << '\n'; + cout << dealerHand.drawHand(); + cout << "===================================\n"; + for (int i = 0; i < numOfPlayers; i++) { + if (folded[i] && credit[i] > 0) continue; + cout << "Player " << playerHands[i].getOwnerName() << "'s hand (" + << evaluate[i].printEvaluation() + << "):" << '\n'; + cout << playerHands[i].drawHand() << '\n'; + playerHands[i] = (playerHands[i] + dealerHand); + playerHands[i].sortByFace(); + } + + if (winnerCount) { + for (int i = 0; i < numOfPlayers; i++) + if (!loser[i]) { + cout << "Player " << playerHands[i].getOwnerName() << " wins " << pot << "$ with " + << evaluate[i].printEvaluation() << "." << '\n'; + credit[i] += pot; + break; + } + } else { + cout << "Tie between players: " << '\n'; + for (int i = 0; i < numOfPlayers; i++) + if (!loser[i]) { + cout << playerHands[i].getOwnerName() << " with " << evaluate[i].printEvaluation() + << '\n'; + credit[i] += pot / winnerCount; + } + cout << "Each wins " << pot / winnerCount << "$." << '\n'; + } + } +//Shift dealer mask + if (turn == 0) { + stage = stage << 3; + } else { + stage = stage << 1; + } + } + pause(); + ++loop; + } +} + +const vector &PokerGame::getPlayerHands() const { + return playerHands; +} + +void PokerGame::setPlayerHands(const vector &playerHands) { + this->playerHands = playerHands; +} + +unsigned short PokerGame::getGameType() const { + return gameType; +} + +void PokerGame::setGameType(unsigned short gameType) { + (gameType > 0 && gameType < 3) ? this->gameType = gameType : this->gameType = 1; +} + +unsigned short PokerGame::getNumOfPlayers() const { + return numOfPlayers; +} + +void PokerGame::setNumOfPlayers(unsigned short numOfPlayers) { + (numOfPlayers > 1 && numOfPlayers < 11) ? this->numOfPlayers = numOfPlayers : this->numOfPlayers = 2; +} + +PokerGame::~PokerGame() = default; + + diff --git a/sources/card.cpp b/sources/card.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/sources/player.cpp b/sources/player.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/sources/state.cpp b/sources/state.cpp deleted file mode 100644 index e69de29..0000000 From 6cdd3e55f182c06ea0275c713bec31e2c7e59ee6 Mon Sep 17 00:00:00 2001 From: Krekhov Nikolai Date: Sat, 30 Apr 2022 21:22:34 +0300 Subject: [PATCH 03/24] chage CMmakeLists --- sources/CMakeLists.txt => CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename sources/CMakeLists.txt => CMakeLists.txt (73%) diff --git a/sources/CMakeLists.txt b/CMakeLists.txt similarity index 73% rename from sources/CMakeLists.txt rename to CMakeLists.txt index 810f3f2..637fd53 100644 --- a/sources/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ project(Proj) set(CMAKE_CXX_STANDARD 17) file(GLOB SOURCES - *.cpp + sources/*.cpp ) - +include_directories(include) add_executable(Proj ${SOURCES}) From e426bd65be1438fa76bb737a9d06d6501351e21d Mon Sep 17 00:00:00 2001 From: sergiokb Date: Sat, 30 Apr 2022 21:40:02 +0300 Subject: [PATCH 04/24] Changed Hand --- sources/Hand.cpp | 567 ++++++++++++++++++++++++++--------------------- 1 file changed, 318 insertions(+), 249 deletions(-) diff --git a/sources/Hand.cpp b/sources/Hand.cpp index 6a5e39d..f2e014e 100644 --- a/sources/Hand.cpp +++ b/sources/Hand.cpp @@ -1,333 +1,402 @@ #include "Hand.h" //Constructor -Hand::Hand(const vector& hand) { - setHand(hand); - countCardProps(); +Hand::Hand(const vector &hand) { + setHand(hand); + countCardProps(); } //Count number of faces and suits in the hand -void Hand::countCardProps(){ - for(unsigned i = 0; i < sizeof(countFaces)/sizeof(countFaces[0]); i++) - countFaces[i] = 0; - for(unsigned i = 0; i < sizeof(countSuits)/sizeof(countSuits[0]); i++) - countSuits[i] = 0; - for(unsigned i = 0; i < hand.size(); i++){ - countFaces[hand.at(i).getFace()-1]++; - countSuits[hand.at(i).getSuit()-1]++; - } +void Hand::countCardProps() { + for (unsigned i = 0; i < sizeof(countFaces) / sizeof(countFaces[0]); i++) + countFaces[i] = 0; + for (unsigned i = 0; i < sizeof(countSuits) / sizeof(countSuits[0]); i++) + countSuits[i] = 0; + for (unsigned i = 0; i < hand.size(); i++) { + countFaces[hand[i].getFace() - 1]++; + countSuits[hand[i].getSuit() - 1]++; + } } //Hand getter -const vector& Hand::getHand() const { - return hand; +const vector &Hand::getHand() const { + return hand; } //Hand setter -void Hand::setHand(const vector& hand) { - this->hand = hand; +void Hand::setHand(const vector &hand) { + this->hand = hand; } -const string& Hand::getOwnerName() const { - return ownerName; +const string &Hand::getOwnerName() const { + return ownerName; } -void Hand::setOwnerName(const string& ownerName) { - this->ownerName = ownerName; +void Hand::setOwnerName(const string &ownerName) { + this->ownerName = ownerName; } -Hand operator+(Hand& hand1, Hand& hand2){ - Hand h1 = hand1; - Hand h2 = hand2; - while(h2.cardsRemaining()>0) h1.addCard(h2.getCard(0)); - return h1; +Hand operator+(Hand &hand1, Hand &hand2) { + Hand h1 = hand1; + Hand h2 = hand2; + while (h2.cardsRemaining() > 0) h1.addCard(h2.getCard(0)); + return h1; } -bool operator>(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) == 1?true:false);} -bool operator<(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) == -1?true:false);} -bool operator>=(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) >= 0?true:false);} -bool operator<=(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) <= 0?true:false);} -bool operator==(Hand& hand1, Hand& hand2) {return (Hand::determineWinner(hand1, hand2) == 0?true:false);} + +bool operator>(Hand &hand1, Hand &hand2) { return (Hand::determineWinner(hand1, hand2) == 1 ? true : false); } + +bool operator<(Hand &hand1, Hand &hand2) { return (Hand::determineWinner(hand1, hand2) == -1 ? true : false); } + +bool operator>=(Hand &hand1, Hand &hand2) { return (Hand::determineWinner(hand1, hand2) >= 0 ? true : false); } + +bool operator<=(Hand &hand1, Hand &hand2) { return (Hand::determineWinner(hand1, hand2) <= 0 ? true : false); } + +bool operator==(Hand &hand1, Hand &hand2) { return (Hand::determineWinner(hand1, hand2) == 0 ? true : false); } //Sort hand by suit -void Hand::sortBySuit(const bool& asc){ - unsigned tmp; - for(unsigned i = 0; i < getHand().size(); i++){ - tmp = i; - for(unsigned j = i; j < getHand().size(); j++){ - if(asc){ - if(getHand().at(j).getSuit() < getHand().at(tmp).getSuit()) tmp = j; - } else { - if(getHand().at(j).getSuit() > getHand().at(tmp).getSuit()) tmp = j; - } - } - swapCards(i, tmp); - } +void Hand::sortBySuit(const bool &asc) { + unsigned tmp; + for (unsigned i = 0; i < getHand().size(); i++) { + tmp = i; + for (unsigned j = i; j < getHand().size(); j++) { + if (asc) { + if (getHand()[j].getSuit() < getHand()[tmp].getSuit()) tmp = j; + } else { + if (getHand()[j].getSuit() > getHand()[tmp].getSuit()) tmp = j; + } + } + swapCards(i, tmp); + } } //Sort hand by face -void Hand::sortByFace(const bool& asc){ - unsigned tmp; - for(unsigned i = 0; i < getHand().size(); i++){ - tmp = i; - for(unsigned j = i; j < getHand().size(); j++){ - if(asc){ - if(getHand().at(j).getFace() < getHand().at(tmp).getFace()) tmp = j; - } else { - if(getHand().at(j).getFace() > getHand().at(tmp).getFace()) tmp = j; - } - } - swapCards(i, tmp); - } +void Hand::sortByFace(const bool &asc) { + unsigned tmp; + for (unsigned i = 0; i < getHand().size(); i++) { + tmp = i; + for (unsigned j = i; j < getHand().size(); j++) { + if (asc) { + if (getHand()[j].getFace() < getHand()[tmp].getFace()) tmp = j; + } else { + if (getHand()[j].getFace() > getHand()[tmp].getFace()) tmp = j; + } + } + swapCards(i, tmp); + } } //Swap position of two cards -void Hand::swapCards(const unsigned& index1, const unsigned& index2){ - Card tmp = hand[index1]; - hand[index1] = hand[index2]; - hand[index2] = tmp; +void Hand::swapCards(const unsigned &index1, const unsigned &index2) { + Card tmp = hand[index1]; + hand[index1] = hand[index2]; + hand[index2] = tmp; } //Draw a card from the hand Card Hand::getCard(int index) { - Card selected = hand[index]; - hand.erase(hand.begin()+index); - return selected; + Card selected = hand[index]; + hand.erase(hand.begin() + index); + return selected; } Card Hand::peekCard(int index) { - return hand[index]; + return hand[index]; } -void Hand::addCard(Card card){ - hand.push_back(card); +void Hand::addCard(Card card) { + hand.push_back(card); } //Number of cards remaining -int Hand::cardsRemaining(){ - return hand.size(); +int Hand::cardsRemaining() { + return hand.size(); } //Find if hand has a face match -bool Hand::hasFaceMatch(const int& num1, const int& num2) { - bool flag1 = 0, flag2 = 0; - for(unsigned i = 0; i < sizeof(countFaces)/sizeof(countFaces[0]); i++){ - if(countFaces[i] == num1 && !flag1){flag1 = true; continue;} - if(countFaces[i] == num2) flag2 = true; - } - return (flag1&flag2); +bool Hand::hasFaceMatch(const int &num1, const int &num2) { + bool flag1 = 0, flag2 = 0; + for (unsigned i = 0; i < sizeof(countFaces) / sizeof(countFaces[0]); i++) { + if (countFaces[i] == num1 && !flag1) { + flag1 = true; + continue; + } + if (countFaces[i] == num2) flag2 = true; + } + return (flag1 & flag2); } //Find if hand has a number of matching suits -bool Hand::hasSuitMatch(const int& num) { - for(unsigned i = 0; i < sizeof(countSuits)/sizeof(countSuits[0]); i++) - if(countSuits[i] == num) return true; - return false; +bool Hand::hasSuitMatch(const int &num) { + for (unsigned i = 0; i < sizeof(countSuits) / sizeof(countSuits[0]); i++) + if (countSuits[i] == num) return true; + return false; } //Find if hand has a straight bool Hand::hasStraight() { - unsigned iterator = 0; - while(countFaces[iterator]==0){iterator++;} - for(unsigned i = iterator; i < iterator+5; i++) - if(countFaces[i] == 0 || i >= sizeof(countFaces)/sizeof(countFaces[0])) return false; - return true; + unsigned iterator = 0; + while (countFaces[iterator] == 0) { iterator++; } + for (unsigned i = iterator; i < iterator + 5; i++) + if (countFaces[i] == 0 || i >= sizeof(countFaces) / sizeof(countFaces[0])) return false; + return true; } //Find the highest card value from the hand -unsigned short Hand::getHighestCard(const short& recur){ - unsigned short count = 0; - for(unsigned short i = 0; i < sizeof(countFaces)/sizeof(countFaces[0]); i++) - if(countFaces[i] > 0) count++; - if(count == 0) return 0; - unsigned short index = (sizeof(countFaces)/sizeof(countFaces[0]) - 1); - while(countFaces[index] == 0){index--;} - if(recur>0) { - countFaces[index] = 0; - return getHighestCard(recur-1); - } - countCardProps(); - return index; +unsigned short Hand::getHighestCard(const short &recur) { + unsigned short count = 0; + for (unsigned short i = 0; i < sizeof(countFaces) / sizeof(countFaces[0]); i++) + if (countFaces[i] > 0) count++; + if (count == 0) return 0; + unsigned short index = (sizeof(countFaces) / sizeof(countFaces[0]) - 1); + while (countFaces[index] == 0) { index--; } + if (recur > 0) { + countFaces[index] = 0; + return getHighestCard(recur - 1); + } + countCardProps(); + return index; } //Find the highest combo -unsigned short Hand::getHighestCombo(const short& recur){ - unsigned short count = 0; - for(unsigned short i = 1; i < sizeof(countFaces)/sizeof(countFaces[0]); i++) - if(countFaces[i] >= countFaces[count]) count = i; - if(recur>0) { - countFaces[count] = 0; - return getHighestCombo(recur-1); - } - countCardProps(); - return count; +unsigned short Hand::getHighestCombo(const short &recur) { + unsigned short count = 0; + for (unsigned short i = 1; i < sizeof(countFaces) / sizeof(countFaces[0]); i++) + if (countFaces[i] >= countFaces[count]) count = i; + if (recur > 0) { + countFaces[count] = 0; + return getHighestCombo(recur - 1); + } + countCardProps(); + return count; } //Get a hand evaluation -int Hand::evaluate(){ - countCardProps(); - if(hasStraight() && hasSuitMatch(5)) return 8; - if(hasFaceMatch(4)) return 7; - if(hasFaceMatch(3,2)) return 6; - if(hasSuitMatch(5)) return 5; - if(hasStraight()) return 4; - if(hasFaceMatch(3)) return 3; - if(hasFaceMatch(2,2)) return 2; - if(hasFaceMatch(2)) return 1; - return 0; +int Hand::evaluate() { + countCardProps(); + if (hasStraight() && hasSuitMatch(5)) return 8; + if (hasFaceMatch(4)) return 7; + if (hasFaceMatch(3, 2)) return 6; + if (hasSuitMatch(5)) return 5; + if (hasStraight()) return 4; + if (hasFaceMatch(3)) return 3; + if (hasFaceMatch(2, 2)) return 2; + if (hasFaceMatch(2)) return 1; + return 0; } //Return a string evaluation -string Hand::printEvaluation(){ - switch(evaluate()){ - case 0: return "High Card"; - case 1: return "One Pair"; - case 2: return "Two Pair"; - case 3: return "Three Of A Kind"; - case 4: return "Straight"; - case 5: return "Flush"; - case 6: return "Full House"; - case 7: return "Four Of A Kind"; - case 8: return "Straight Flush"; - default: return "Error"; - } +string Hand::printEvaluation() { + switch (evaluate()) { + case 0: + return "High Card"; + case 1: + return "One Pair"; + case 2: + return "Two Pair"; + case 3: + return "Three Of A Kind"; + case 4: + return "Straight"; + case 5: + return "Flush"; + case 6: + return "Full House"; + case 7: + return "Four Of A Kind"; + case 8: + return "Straight Flush"; + default: + return "Error"; + } } //Convert card face index to a symbol -string Hand::toFaceSymbol(const Face& index){ - switch(index){ - case TWO: return "2"; - case THREE: return "3"; - case FOUR: return "4"; - case FIVE: return "5"; - case SIX: return "6"; - case SEVEN: return "7"; - case EIGHT: return "8"; - case NINE: return "9"; - case TEN: return "T"; - case JACK: return "J"; - case QUEEN: return "Q"; - case KING: return "K"; - case ACE: return "A"; - default: return "0"; - } +string Hand::toFaceSymbol(const Face &index) { + switch (index) { + case TWO: + return "2"; + case THREE: + return "3"; + case FOUR: + return "4"; + case FIVE: + return "5"; + case SIX: + return "6"; + case SEVEN: + return "7"; + case EIGHT: + return "8"; + case NINE: + return "9"; + case TEN: + return "T"; + case JACK: + return "J"; + case QUEEN: + return "Q"; + case KING: + return "K"; + case ACE: + return "A"; + default: + return "0"; + } } //Convert card suit index to a symbol -string Hand::toSuitSymbol(const Suit& index){ - switch(index){ - case HEARTS: return "♥"; - case DIAMONDS: return "♦"; - case SPADES: return "♠"; - case CLUBS: return "♣"; - default: return "O"; - } +string Hand::toSuitSymbol(const Suit &index) { + switch (index) { + case HEARTS: + return "♥"; + case DIAMONDS: + return "♦"; + case SPADES: + return "♠"; + case CLUBS: + return "♣"; + default: + return "O"; + } } //Get a string of drawn cards from the hand -string Hand::drawHand(const int& faceDown){ - stringstream str; - for(unsigned i = 0; i < 5; i++){ - int tmp = faceDown; - for(unsigned j = 0; j < hand.size(); j++){ - switch(i){ - case 0: str << "┌─────┐"; break; - case 1: (tmp&1)?str << "│░░░░░│":str << "│" << toFaceSymbol(hand[j].getFace()) << " │"; break; - case 2: (tmp&1)?str << "│░░░░░│":str << "│ " << toSuitSymbol(hand[j].getSuit()) << " │"; break; - case 3: (tmp&1)?str << "│░░░░░│":str << "│ " << toFaceSymbol(hand[j].getFace()) << "│"; break; - case 4: str << "└─────┘"; break; - } - tmp=tmp>>1; - } - str << endl; - } - return str.str(); +string Hand::drawHand(const int &faceDown) { + stringstream str; + for (unsigned i = 0; i < 5; i++) { + int tmp = faceDown; + for (unsigned j = 0; j < hand.size(); j++) { + switch (i) { + case 0: + str << "┌─────┐"; + break; + case 1: + (tmp & 1) ? str << "│░░░░░│" : str << "│" << toFaceSymbol(hand[j].getFace()) << " │"; + break; + case 2: + (tmp & 1) ? str << "│░░░░░│" : str << "│ " << toSuitSymbol(hand[j].getSuit()) << " │"; + break; + case 3: + (tmp & 1) ? str << "│░░░░░│" : str << "│ " << toFaceSymbol(hand[j].getFace()) << "│"; + break; + case 4: + str << "└─────┘"; + break; + } + tmp = tmp >> 1; + } + str << endl; + } + return str.str(); } //Get a string of cards from the hand -string Hand::toString(){ - string str = ""; - for(unsigned i = 0; i < hand.size(); i++) - str+=hand[i].toString() + "\n"; - return str; +string Hand::toString() { + string str = ""; + for (unsigned i = 0; i < hand.size(); i++) + str += hand[i].toString() + "\n"; + return str; } //Destructor Hand::~Hand() { } -int Hand::determineWinner(Hand& hand1, Hand& hand2){ - if(hand1.evaluate()>hand2.evaluate()) return 1; - else if(hand1.evaluate() hand2.getHighestCombo(i)) return 1; - else if(hand1.getHighestCombo(i) < hand2.getHighestCombo(i)) return -1; - } - break; - case 0: case 4: case 5: case 8: - if(hand1.getHighestCard() > hand2.getHighestCard()) return 1; - else if(hand1.getHighestCard() < hand2.getHighestCard()) return -1; - else{ - recur = 0; - cout << endl; - while(hand1.getHighestCard(recur) == hand2.getHighestCard(recur) && recur < hand1.cardsRemaining()){recur++;} - if(hand1.getHighestCard(recur) > hand2.getHighestCard(recur)) return 1; - else if(hand1.getHighestCard(recur) < hand2.getHighestCard(recur)) return -1; - } - } - } - return 0; +int Hand::determineWinner(Hand &hand1, Hand &hand2) { + if (hand1.evaluate() > hand2.evaluate()) return 1; + else if (hand1.evaluate() < hand2.evaluate()) return -1; + else { + int recur; + switch (hand1.evaluate()) { + case 1: + case 2: + case 3: + case 6: + case 7: + recur = (hand1.evaluate() == 2 ? 2 : hand1.evaluate() == 6 ? 1 : 0); + for (int i = 0; i <= recur; i++) { + if (hand1.getHighestCombo(i) > hand2.getHighestCombo(i)) return 1; + else if (hand1.getHighestCombo(i) < hand2.getHighestCombo(i)) return -1; + } + break; + case 0: + case 4: + case 5: + case 8: + if (hand1.getHighestCard() > hand2.getHighestCard()) return 1; + else if (hand1.getHighestCard() < hand2.getHighestCard()) return -1; + else { + recur = 0; + cout << endl; + while (hand1.getHighestCard(recur) == hand2.getHighestCard(recur) && + recur < hand1.cardsRemaining()) { recur++; } + if (hand1.getHighestCard(recur) > hand2.getHighestCard(recur)) return 1; + else if (hand1.getHighestCard(recur) < hand2.getHighestCard(recur)) return -1; + } + } + } + return 0; } - - - - - - - - - //Winner logic -void Hand::winner(Hand& hand1, Hand& hand2){ - if(hand1.evaluate()>hand2.evaluate()) - cout << "1 wins with " << hand1.printEvaluation() << " against " << hand2.printEvaluation(); - else if(hand1.evaluate() hand2.getHighestCombo(i)){ - cout << "1 wins with " << hand1.printEvaluation() << " and highest card " << hand1.toFaceSymbol(static_cast(hand1.getHighestCombo(i)+1)); break;} - else if(hand1.getHighestCombo(i) < hand2.getHighestCombo(i)){ - cout << "2 wins with " << hand2.printEvaluation() << " and highest card " << hand2.toFaceSymbol(static_cast(hand2.getHighestCombo(i)+1)); break;} - } - break; - case 0: case 4: case 5: case 8: - if(hand1.getHighestCard() > hand2.getHighestCard()){ - cout << "1 wins with " << hand1.printEvaluation() << " and highest card " << hand1.toFaceSymbol(static_cast(hand1.getHighestCard()+1)); break;} - else if(hand1.getHighestCard() < hand2.getHighestCard()){ - cout << "2 wins with " << hand2.printEvaluation() << " and highest card " << hand2.toFaceSymbol(static_cast(hand2.getHighestCard()+1)); break;} - else{ - recur = 0; - cout << endl; - while(hand1.getHighestCard(recur) == hand2.getHighestCard(recur) && recur < hand1.cardsRemaining()){ - //cout << "Recur: " << recur << " : " << hand1.toFaceSymbol(hand1.getHighestCard(recur)+1) << endl; - recur++; - } - if(hand1.getHighestCard(recur) > hand2.getHighestCard(recur)){ - cout << "1 wins with " << hand1.printEvaluation() << " and highest card " << hand1.toFaceSymbol(static_cast(hand1.getHighestCard(recur)+1)); break;} - else if(hand1.getHighestCard(recur) < hand2.getHighestCard(recur)){ - cout << "2 wins with " << hand2.printEvaluation() << " and highest card " << hand2.toFaceSymbol(static_cast(hand2.getHighestCard(recur)+1)); break;} - else cout << "Equal standing with " << hand2.printEvaluation() << endl; break;} - } - } +void Hand::winner(Hand &hand1, Hand &hand2) { + if (hand1.evaluate() > hand2.evaluate()) + cout << "1 wins with " << hand1.printEvaluation() << " against " << hand2.printEvaluation(); + else if (hand1.evaluate() < hand2.evaluate()) + cout << "2 wins with " << hand2.printEvaluation() << " against " << hand1.printEvaluation(); + else { + int recur; + switch (hand1.evaluate()) { + case 1: + case 2: + case 3: + case 6: + case 7: + recur = (hand1.evaluate() == 2 ? 2 : hand1.evaluate() == 6 ? 1 : 0); + for (int i = 0; i <= recur; i++) { + if (hand1.getHighestCombo(i) > hand2.getHighestCombo(i)) { + cout << "1 wins with " << hand1.printEvaluation() << " and highest card " + << hand1.toFaceSymbol(static_cast(hand1.getHighestCombo(i) + 1)); + break; + } else if (hand1.getHighestCombo(i) < hand2.getHighestCombo(i)) { + cout << "2 wins with " << hand2.printEvaluation() << " and highest card " + << hand2.toFaceSymbol(static_cast(hand2.getHighestCombo(i) + 1)); + break; + } + } + break; + case 0: + case 4: + case 5: + case 8: + if (hand1.getHighestCard() > hand2.getHighestCard()) { + cout << "1 wins with " << hand1.printEvaluation() << " and highest card " + << hand1.toFaceSymbol(static_cast(hand1.getHighestCard() + 1)); + break; + } else if (hand1.getHighestCard() < hand2.getHighestCard()) { + cout << "2 wins with " << hand2.printEvaluation() << " and highest card " + << hand2.toFaceSymbol(static_cast(hand2.getHighestCard() + 1)); + break; + } else { + recur = 0; + cout << endl; + while (hand1.getHighestCard(recur) == hand2.getHighestCard(recur) && + recur < hand1.cardsRemaining()) { + //cout << "Recur: " << recur << " : " << hand1.toFaceSymbol(hand1.getHighestCard(recur)+1) << endl; + recur++; + } + if (hand1.getHighestCard(recur) > hand2.getHighestCard(recur)) { + cout << "1 wins with " << hand1.printEvaluation() << " and highest card " + << hand1.toFaceSymbol(static_cast(hand1.getHighestCard(recur) + 1)); + break; + } else if (hand1.getHighestCard(recur) < hand2.getHighestCard(recur)) { + cout << "2 wins with " << hand2.printEvaluation() << " and highest card " + << hand2.toFaceSymbol(static_cast(hand2.getHighestCard(recur) + 1)); + break; + } else cout << "Equal standing with " << hand2.printEvaluation() << endl; + break; + } + } + } } From 363a3c04fec72dc58865be65d7e6e73b32ae3764 Mon Sep 17 00:00:00 2001 From: Polev Alexey Date: Sat, 30 Apr 2022 21:40:09 +0300 Subject: [PATCH 05/24] added dash function and code style in PokerGame.cpp --- sources/PokerGame.cpp | 125 ++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/sources/PokerGame.cpp b/sources/PokerGame.cpp index 57aa325..58341a7 100644 --- a/sources/PokerGame.cpp +++ b/sources/PokerGame.cpp @@ -20,7 +20,7 @@ void PokerGame::splash() { } void PokerGame::clearScreen() { - for (int i = 0; i < 50; i++) { + for (int i = 0; i < 50; ++i) { cout << '\n'; } } @@ -31,10 +31,14 @@ void PokerGame::pause() { cin.ignore(20, '\n'); } +void PokerGame::dash() { + cout << "===================================\n"; +} + void PokerGame::discardFromHand(Hand &hand, int discard) { if (discard < 1 || discard > 3) return; vector index(hand.cardsRemaining(), false); - for (int i = 0; i < discard; i++) { + for (int i = 0; i < discard; ++i) { int choice; cout << "\nEnter " << (i == 0 ? "first" : i == 1 ? "second" : "third") << " card index to discard: "; cin >> choice; @@ -79,10 +83,10 @@ void PokerGame::gameInit() { setGameType(game); string name; cout << '\n'; - for (int i = 0; i < numOfPlayers; i++) { + for (int i = 0; i < numOfPlayers; ++i) { cout << "Enter name for player " << i + 1 << ": "; cin >> name; - playerHands.push_back(deck.dealHand(gameType == 1 ? 5 : 2)); + playerHands.emplace_back(deck.dealHand(gameType == 1 ? 5 : 2)); playerHands[i].setOwnerName(name); playerHands[i].sortByFace(); credit.push_back(100); @@ -91,16 +95,16 @@ void PokerGame::gameInit() { void PokerGame::classicGameLoop(int turns) { string names[numOfPlayers]; - for (int i = 0; i < numOfPlayers; i++) names[i] = playerHands[i].getOwnerName(); - for (int i = 0; i < turns; i++) { - for (int j = 0; j < numOfPlayers; j++) { + for (int i = 0; i < numOfPlayers; ++i) names[i] = playerHands[i].getOwnerName(); + for (int i = 0; i < turns; ++i) { + for (int j = 0; j < numOfPlayers; ++j) { pause(); clearScreen(); cout << "============= ROUND " << i + 1 << " =============\n\n"; int discard; cout << playerHands[j].getOwnerName() << "'s hand: (" << playerHands[j].printEvaluation() << ")\n\n"; cout << playerHands[j].drawHand(); - for (int k = 0; k < playerHands[j].cardsRemaining(); k++) cout << "╚═ " << k + 1 << " ═╝"; + for (int k = 0; k < playerHands[j].cardsRemaining(); ++k) cout << "╚═ " << k + 1 << " ═╝"; cout << '\n'; cout << "\nInput number of cards to discard (up to three): "; cin >> discard; @@ -108,10 +112,10 @@ void PokerGame::classicGameLoop(int turns) { } vector hands(numOfPlayers, false); - for (int j = 0; j < numOfPlayers - 1; j++) { + for (int j = 0; j < numOfPlayers - 1; ++j) { if (hands[j]) continue; - for (int k = j + 1; k < numOfPlayers; k++) { - if (playerHands[j] > playerHands[k]) hands[k] = 1; + for (int k = j + 1; k < numOfPlayers; ++k) { + if (playerHands[j] > playerHands[k]) hands[k] = true; else if (playerHands[j] < playerHands[k]) { hands[j] = true; break; @@ -120,38 +124,40 @@ void PokerGame::classicGameLoop(int turns) { } int winnerCount = 0; - for (int j = 0; j < numOfPlayers; j++) { + for (int j = 0; j < numOfPlayers; ++j) { if (!hands[j]) winnerCount++; } clearScreen(); cout << "============= ROUND " << i + 1 << " =============\n\n"; - for (int j = 0; j < numOfPlayers; j++) { + for (int j = 0; j < numOfPlayers; ++j) { cout << playerHands[j].getOwnerName() << "'s hand: (" << playerHands[j].printEvaluation() << ")\n"; cout << playerHands[j].drawHand(); - cout << "\n===================================\n\n"; + dash(); + cout << '\n'; } - cout << "===================================\n"; + dash(); if (winnerCount == 1) { - for (int j = 0; j < numOfPlayers; j++) + for (int j = 0; j < numOfPlayers; ++j) if (!hands[j]) - cout << playerHands[j].getOwnerName() << " wins with " << playerHands[j].printEvaluation() - << "\n"; - } else cout << "Tie, split the pot.\n"; - cout << "===================================\n"; + cout << playerHands[j].getOwnerName() << " wins with " << playerHands[j].printEvaluation() << "\n"; + } else { + cout << "Tie, split the pot.\n"; + } + dash(); deck.initDeck(); deck.shuffle(); playerHands.clear(); - for (int j = 0; j < numOfPlayers; j++) { - playerHands.push_back(deck.dealHand(5)); + for (int j = 0; j < numOfPlayers; ++j) { + playerHands.emplace_back(deck.dealHand(5)); playerHands[j].setOwnerName(names[j]); playerHands[j].sortByFace(); } - cout << "Next: Round " << (i + 2) << '\n'; + cout << "Next: Round " << i + 2 << '\n'; } } @@ -161,12 +167,14 @@ void PokerGame::texasGameLoop(int turns) { int foldedCount, player, loop = 0; Hand dealerHand(deck.dealHand(5)); - while (1) { + while (true) { //Init game data stage = 31; pot = 0; foldedCount = 0; - for (int i = 0; i < numOfPlayers; i++) { + deck.initDeck(); + deck.shuffle(); + for (int i = 0; i < numOfPlayers; ++i) { playerHands[i].setHand(deck.dealHand(2)); playerHands[i].sortByFace(); folded[i] = false; @@ -174,11 +182,9 @@ void PokerGame::texasGameLoop(int turns) { history.str("- Begin new game -\n"); dealer = loop % numOfPlayers; player = (dealer + 2) % numOfPlayers; - deck.initDeck(); - deck.shuffle(); dealerHand.setHand(deck.dealHand(5)); - for (int i = 0; i < numOfPlayers; i++) { + for (int i = 0; i < numOfPlayers; ++i) { if (credit[i] <= 0) { folded[i] = true; foldedCount++; @@ -186,24 +192,24 @@ void PokerGame::texasGameLoop(int turns) { } if (foldedCount == numOfPlayers - 1) { - for (int i = 0; i < numOfPlayers; i++) + for (int i = 0; i < numOfPlayers; ++i) if (credit[i] > 0) { - cout << "======================================" << '\n'; + dash(); cout << playerHands[i].getOwnerName() << " won the game. " << '\n'; - cout << "======================================" << '\n'; + dash(); pause(); return; } } - for (int turn = 0; turn < 4; turn++) { + for (int turn = 0; turn < 4; ++turn) { //Init round data limit = numOfPlayers; history << "\n- Begin round " << turn + 1 << " -" << '\n'; ante = 0; if (turn == 0) { history << "Current dealer: " << playerHands[dealer].getOwnerName() << '\n'; - for (int i = 1; i < 3; i++) { + for (int i = 1; i < 3; ++i) { pot += i; credit.at((dealer + i) % numOfPlayers) -= i; history << (i == 1 ? "Small (1$)" : "Big (2$)") << " blind from " @@ -215,13 +221,13 @@ void PokerGame::texasGameLoop(int turns) { //Betting stage if (turn != 3) { - for (int i = 0; i < limit; i++) { + for (int i = 0; i < limit; ++i) { if (foldedCount == numOfPlayers - 1) break; player = (player + 1) % numOfPlayers; if (folded[player]) continue; //Temporary evaluative hand Hand check = playerHands[player]; - for (int j = 0; j < (turn == 0 ? 0 : turn == 1 ? 3 : (turn + 2)); j++) + for (int j = 0; j < (turn == 0 ? 0 : turn == 1 ? 3 : (turn + 2)); ++j) check.addCard(dealerHand.peekCard(j)); check.sortByFace(); //Print history @@ -292,7 +298,7 @@ void PokerGame::texasGameLoop(int turns) { if (raise >= credit[player]) { raise = credit[player]; folded[player] = true; - foldedCount++; + ++foldedCount; } limit = numOfPlayers; i = 0; @@ -314,15 +320,15 @@ void PokerGame::texasGameLoop(int turns) { vector loser(numOfPlayers, false); int winnerCount = 0; - for (int i = 0; i < numOfPlayers; i++) { + for (int i = 0; i < numOfPlayers; ++i) { evaluate.push_back(playerHands[i] + dealerHand); evaluate[i].sortByFace(); } - for (int i = 0; i < numOfPlayers - 1; i++) { + for (int i = 0; i < numOfPlayers - 1; ++i) { if (folded[i] && credit[i] > 0) loser[i] = true; if (loser[i]) continue; - for (int j = i + 1; j < numOfPlayers; j++) { + for (int j = i + 1; j < numOfPlayers; ++j) { if (folded[j] && credit[j] > 0) { loser[j] = true; break; @@ -336,7 +342,10 @@ void PokerGame::texasGameLoop(int turns) { } } - for (int i = 0; i < numOfPlayers; i++) if (!loser[i]) winnerCount++; + for (int i = 0; i < numOfPlayers; ++i) { + if (!loser[i]) + ++winnerCount; + } dealerHand.sortByFace(); @@ -344,72 +353,70 @@ void PokerGame::texasGameLoop(int turns) { cout << "=========== FINAL ROUND ===========\n\n"; cout << "Dealer hand: " << '\n'; cout << dealerHand.drawHand(); - cout << "===================================\n"; - for (int i = 0; i < numOfPlayers; i++) { + dash(); + for (int i = 0; i < numOfPlayers; ++i) { if (folded[i] && credit[i] > 0) continue; cout << "Player " << playerHands[i].getOwnerName() << "'s hand (" - << evaluate[i].printEvaluation() - << "):" << '\n'; + << evaluate[i].printEvaluation() << "):" << '\n'; cout << playerHands[i].drawHand() << '\n'; - playerHands[i] = (playerHands[i] + dealerHand); + playerHands[i] = playerHands[i] + dealerHand; playerHands[i].sortByFace(); } if (winnerCount) { - for (int i = 0; i < numOfPlayers; i++) + for (int i = 0; i < numOfPlayers; ++i) { if (!loser[i]) { cout << "Player " << playerHands[i].getOwnerName() << " wins " << pot << "$ with " << evaluate[i].printEvaluation() << "." << '\n'; credit[i] += pot; break; } + } } else { cout << "Tie between players: " << '\n'; - for (int i = 0; i < numOfPlayers; i++) + for (int i = 0; i < numOfPlayers; ++i) { if (!loser[i]) { cout << playerHands[i].getOwnerName() << " with " << evaluate[i].printEvaluation() << '\n'; credit[i] += pot / winnerCount; } + } cout << "Each wins " << pot / winnerCount << "$." << '\n'; } } //Shift dealer mask - if (turn == 0) { + if (turn == 0) stage = stage << 3; - } else { + else stage = stage << 1; - } } pause(); ++loop; } } -const vector &PokerGame::getPlayerHands() const { +const vector& PokerGame::getPlayerHands() const { return playerHands; } -void PokerGame::setPlayerHands(const vector &playerHands) { - this->playerHands = playerHands; +void PokerGame::setPlayerHands(const vector& playerHands_) { + this->playerHands = playerHands_; } unsigned short PokerGame::getGameType() const { return gameType; } -void PokerGame::setGameType(unsigned short gameType) { - (gameType > 0 && gameType < 3) ? this->gameType = gameType : this->gameType = 1; +void PokerGame::setGameType(unsigned short gameType_) { + (gameType_ > 0 && gameType_ < 3) ? this->gameType = gameType_ : this->gameType = 1; } unsigned short PokerGame::getNumOfPlayers() const { return numOfPlayers; } -void PokerGame::setNumOfPlayers(unsigned short numOfPlayers) { - (numOfPlayers > 1 && numOfPlayers < 11) ? this->numOfPlayers = numOfPlayers : this->numOfPlayers = 2; +void PokerGame::setNumOfPlayers(unsigned short numOfPlayers_) { + (numOfPlayers_ > 1 && numOfPlayers_ < 11) ? this->numOfPlayers = numOfPlayers_ : this->numOfPlayers = 2; } PokerGame::~PokerGame() = default; - - From 779f1456f30198ac8915500dd020a89adeb0e757 Mon Sep 17 00:00:00 2001 From: Krekhov Nikolai Date: Sat, 30 Apr 2022 21:50:10 +0300 Subject: [PATCH 06/24] fix bag in Deck(36 -> 52 cards) --- sources/Deck.cpp | 4 ++-- sources/Hand.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sources/Deck.cpp b/sources/Deck.cpp index b161c20..0b73296 100644 --- a/sources/Deck.cpp +++ b/sources/Deck.cpp @@ -12,8 +12,8 @@ Deck::Deck(const vector& deck) { void Deck::initDeck(){ vector newDeck; - for(int i = TWO; i != ACE; ++i) - for(int j = HEARTS; j!=CLUBS; ++j) + for(int i = TWO; i != ACE + 1; ++i) + for(int j = HEARTS; j!=CLUBS + 1; ++j) newDeck.emplace_back(static_cast(j),static_cast(i)); setDeck(newDeck); } diff --git a/sources/Hand.cpp b/sources/Hand.cpp index 6a5e39d..9a03971 100644 --- a/sources/Hand.cpp +++ b/sources/Hand.cpp @@ -13,8 +13,8 @@ void Hand::countCardProps(){ for(unsigned i = 0; i < sizeof(countSuits)/sizeof(countSuits[0]); i++) countSuits[i] = 0; for(unsigned i = 0; i < hand.size(); i++){ - countFaces[hand.at(i).getFace()-1]++; - countSuits[hand.at(i).getSuit()-1]++; + countFaces[hand[i].getFace()-1]++; + countSuits[hand[i].getSuit()-1]++; } } From 53d93dc08a87145eb099d78a5565780a2caa55df Mon Sep 17 00:00:00 2001 From: sergiokb Date: Sat, 30 Apr 2022 21:55:40 +0300 Subject: [PATCH 07/24] added dash in .h --- include/PokerGame.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/PokerGame.h b/include/PokerGame.h index 1520454..c01874a 100644 --- a/include/PokerGame.h +++ b/include/PokerGame.h @@ -19,6 +19,7 @@ class PokerGame { static void splash(); static void clearScreen(); static void pause(); + static void dash(); public: PokerGame(); unsigned short getNumOfPlayers() const; From 46a8c53295acaddde3d20aa4cfb3c0e566a41b6f Mon Sep 17 00:00:00 2001 From: sergiokb Date: Sat, 30 Apr 2022 22:38:17 +0300 Subject: [PATCH 08/24] postfix on prefix --- sources/Hand.cpp | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/sources/Hand.cpp b/sources/Hand.cpp index 871e2e1..825b7a3 100644 --- a/sources/Hand.cpp +++ b/sources/Hand.cpp @@ -9,13 +9,13 @@ Hand::Hand(const vector &hand) { //Count number of faces and suits in the hand void Hand::countCardProps() { - for (unsigned i = 0; i < sizeof(countFaces) / sizeof(countFaces[0]); i++) + for (unsigned i = 0; i < sizeof(countFaces) / sizeof(countFaces[0]); ++i) countFaces[i] = 0; - for (unsigned i = 0; i < sizeof(countSuits) / sizeof(countSuits[0]); i++) + for (unsigned i = 0; i < sizeof(countSuits) / sizeof(countSuits[0]); ++i) countSuits[i] = 0; - for (unsigned i = 0; i < hand.size(); i++) { - countFaces[hand[i].getFace() - 1]++; - countSuits[hand[i].getSuit() - 1]++; + for (unsigned i = 0; i < hand.size(); ++i) { + ++countFaces[hand[i].getFace() - 1]; + ++countSuits[hand[i].getSuit() - 1]; } } @@ -57,9 +57,9 @@ bool operator==(Hand &hand1, Hand &hand2) { return (Hand::determineWinner(hand1, //Sort hand by suit void Hand::sortBySuit(const bool &asc) { unsigned tmp; - for (unsigned i = 0; i < getHand().size(); i++) { + for (unsigned i = 0; i < getHand().size(); ++i) { tmp = i; - for (unsigned j = i; j < getHand().size(); j++) { + for (unsigned j = i; j < getHand().size(); ++j) { if (asc) { if (getHand()[j].getSuit() < getHand()[tmp].getSuit()) tmp = j; } else { @@ -73,9 +73,9 @@ void Hand::sortBySuit(const bool &asc) { //Sort hand by face void Hand::sortByFace(const bool &asc) { unsigned tmp; - for (unsigned i = 0; i < getHand().size(); i++) { + for (unsigned i = 0; i < getHand().size(); ++i) { tmp = i; - for (unsigned j = i; j < getHand().size(); j++) { + for (unsigned j = i; j < getHand().size(); ++j) { if (asc) { if (getHand()[j].getFace() < getHand()[tmp].getFace()) tmp = j; } else { @@ -116,7 +116,7 @@ int Hand::cardsRemaining() { //Find if hand has a face match bool Hand::hasFaceMatch(const int &num1, const int &num2) { bool flag1 = 0, flag2 = 0; - for (unsigned i = 0; i < sizeof(countFaces) / sizeof(countFaces[0]); i++) { + for (unsigned i = 0; i < sizeof(countFaces) / sizeof(countFaces[0]); ++i) { if (countFaces[i] == num1 && !flag1) { flag1 = true; continue; @@ -128,7 +128,7 @@ bool Hand::hasFaceMatch(const int &num1, const int &num2) { //Find if hand has a number of matching suits bool Hand::hasSuitMatch(const int &num) { - for (unsigned i = 0; i < sizeof(countSuits) / sizeof(countSuits[0]); i++) + for (unsigned i = 0; i < sizeof(countSuits) / sizeof(countSuits[0]); ++i) if (countSuits[i] == num) return true; return false; } @@ -136,8 +136,8 @@ bool Hand::hasSuitMatch(const int &num) { //Find if hand has a straight bool Hand::hasStraight() { unsigned iterator = 0; - while (countFaces[iterator] == 0) { iterator++; } - for (unsigned i = iterator; i < iterator + 5; i++) + while (countFaces[iterator] == 0) { ++iterator; } + for (unsigned i = iterator; i < iterator + 5; ++i) if (countFaces[i] == 0 || i >= sizeof(countFaces) / sizeof(countFaces[0])) return false; return true; } @@ -145,11 +145,11 @@ bool Hand::hasStraight() { //Find the highest card value from the hand unsigned short Hand::getHighestCard(const short &recur) { unsigned short count = 0; - for (unsigned short i = 0; i < sizeof(countFaces) / sizeof(countFaces[0]); i++) - if (countFaces[i] > 0) count++; + for (unsigned short i = 0; i < sizeof(countFaces) / sizeof(countFaces[0]); ++i) + if (countFaces[i] > 0) ++count; if (count == 0) return 0; unsigned short index = (sizeof(countFaces) / sizeof(countFaces[0]) - 1); - while (countFaces[index] == 0) { index--; } + while (countFaces[index] == 0) { --index; } if (recur > 0) { countFaces[index] = 0; return getHighestCard(recur - 1); @@ -161,7 +161,7 @@ unsigned short Hand::getHighestCard(const short &recur) { //Find the highest combo unsigned short Hand::getHighestCombo(const short &recur) { unsigned short count = 0; - for (unsigned short i = 1; i < sizeof(countFaces) / sizeof(countFaces[0]); i++) + for (unsigned short i = 1; i < sizeof(countFaces) / sizeof(countFaces[0]); ++i) if (countFaces[i] >= countFaces[count]) count = i; if (recur > 0) { countFaces[count] = 0; @@ -264,9 +264,9 @@ string Hand::toSuitSymbol(const Suit &index) { //Get a string of drawn cards from the hand string Hand::drawHand(const int &faceDown) { stringstream str; - for (unsigned i = 0; i < 5; i++) { + for (unsigned i = 0; i < 5; ++i) { int tmp = faceDown; - for (unsigned j = 0; j < hand.size(); j++) { + for (unsigned j = 0; j < hand.size(); ++j) { switch (i) { case 0: str << "┌─────┐"; @@ -294,7 +294,7 @@ string Hand::drawHand(const int &faceDown) { //Get a string of cards from the hand string Hand::toString() { string str = ""; - for (unsigned i = 0; i < hand.size(); i++) + for (unsigned i = 0; i < hand.size(); ++i) str += hand[i].toString() + "\n"; return str; } @@ -315,7 +315,7 @@ int Hand::determineWinner(Hand &hand1, Hand &hand2) { case 6: case 7: recur = (hand1.evaluate() == 2 ? 2 : hand1.evaluate() == 6 ? 1 : 0); - for (int i = 0; i <= recur; i++) { + for (int i = 0; i <= recur; ++i) { if (hand1.getHighestCombo(i) > hand2.getHighestCombo(i)) return 1; else if (hand1.getHighestCombo(i) < hand2.getHighestCombo(i)) return -1; } @@ -330,7 +330,7 @@ int Hand::determineWinner(Hand &hand1, Hand &hand2) { recur = 0; cout << endl; while (hand1.getHighestCard(recur) == hand2.getHighestCard(recur) && - recur < hand1.cardsRemaining()) { recur++; } + recur < hand1.cardsRemaining()) { ++recur; } if (hand1.getHighestCard(recur) > hand2.getHighestCard(recur)) return 1; else if (hand1.getHighestCard(recur) < hand2.getHighestCard(recur)) return -1; } @@ -355,7 +355,7 @@ void Hand::winner(Hand &hand1, Hand &hand2) { case 6: case 7: recur = (hand1.evaluate() == 2 ? 2 : hand1.evaluate() == 6 ? 1 : 0); - for (int i = 0; i <= recur; i++) { + for (int i = 0; i <= recur; ++i) { if (hand1.getHighestCombo(i) > hand2.getHighestCombo(i)) { cout << "1 wins with " << hand1.printEvaluation() << " and highest card " << hand1.toFaceSymbol(static_cast(hand1.getHighestCombo(i) + 1)); @@ -385,7 +385,7 @@ void Hand::winner(Hand &hand1, Hand &hand2) { while (hand1.getHighestCard(recur) == hand2.getHighestCard(recur) && recur < hand1.cardsRemaining()) { //cout << "Recur: " << recur << " : " << hand1.toFaceSymbol(hand1.getHighestCard(recur)+1) << endl; - recur++; + ++recur; } if (hand1.getHighestCard(recur) > hand2.getHighestCard(recur)) { cout << "1 wins with " << hand1.printEvaluation() << " and highest card " From 1f86fa6f3132ea25365d4d6e89f7a17df7838968 Mon Sep 17 00:00:00 2001 From: Polev Alexey Date: Sat, 30 Apr 2022 23:07:04 +0300 Subject: [PATCH 09/24] fixed codestyle in Deck.cpp --- sources/Deck.cpp | 82 +++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/sources/Deck.cpp b/sources/Deck.cpp index 0b73296..0a1a0d7 100644 --- a/sources/Deck.cpp +++ b/sources/Deck.cpp @@ -1,69 +1,65 @@ #include "Deck.h" Deck::Deck() { - srand(time(0)); - initDeck(); + srand(time(nullptr)); + initDeck(); } -Deck::Deck(const vector& deck) { - srand(time(0)); - setDeck(deck); +Deck::Deck(const vector &deck) { + srand(time(nullptr)); + setDeck(deck); } -void Deck::initDeck(){ - vector newDeck; - for(int i = TWO; i != ACE + 1; ++i) - for(int j = HEARTS; j!=CLUBS + 1; ++j) - newDeck.emplace_back(static_cast(j),static_cast(i)); - setDeck(newDeck); +void Deck::initDeck() { + vector newDeck; + for (int i = TWO; i != ACE + 1; ++i) + for (int j = HEARTS; j != CLUBS + 1; ++j) + newDeck.emplace_back(static_cast(j), static_cast(i)); + setDeck(newDeck); } -void Deck::setDeck(const vector& deck) { - this->deck = deck; +void Deck::setDeck(const vector& deck_) { + this->deck = deck_; } void Deck::shuffle() { - vector newDeck; - int rnum; - while(deck.size()>0){ - rnum = rand()%(deck.size()); - newDeck.push_back(drawCard(rnum)); - } - setDeck(newDeck); + vector newDeck; + int rnum; + while (!deck.empty()) { + rnum = rand() % deck.size(); + newDeck.push_back(drawCard(rnum)); + } + setDeck(newDeck); } -Card Deck::drawCard(const unsigned& index) { - Card drawnCard = deck.at(index); - deck.erase(deck.begin()+index); - return drawnCard; +Card Deck::drawCard(const unsigned &index) { + Card drawnCard = deck[index]; + deck.erase(deck.begin() + index); + return drawnCard; } -void Deck::addCard(Card card){ - deck.push_back(card); +void Deck::addCard(const Card& card_) { + deck.push_back(card_); } -vector Deck::dealHand(const int& size){ - vector hand; - for(int i = 0; i < size; i++) - hand.push_back(drawCard(0)); - return hand; +vector Deck::dealHand(const int &size) { + vector hand; + for (int i = 0; i < size; ++i) + hand.push_back(drawCard(0)); + return hand; } string Deck::toString() { - string str = ""; - for(int i = 0; i < cardsRemaining(); i++) - str+=deck[i].toString() + "\n"; - return str; + string str = ""; + for (int i = 0; i < cardsRemaining(); ++i) + str += deck[i].toString() + "\n"; + return str; } -const vector& Deck::getDeck() const { - return deck; -} +const vector &Deck::getDeck() const { return deck; } -int Deck::cardsRemaining() { - return deck.size(); -} +int Deck::cardsRemaining() { return deck.size(); } + +Deck::~Deck() = default; -Deck::~Deck() { -} From 1fc7434e6540c2dc3b420acb80c5aa25c0365ffe Mon Sep 17 00:00:00 2001 From: Polev Alexey Date: Sat, 30 Apr 2022 23:09:57 +0300 Subject: [PATCH 10/24] fixed codestyle in Deck.h --- include/Deck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Deck.h b/include/Deck.h index 9bf0d5c..f0169e6 100644 --- a/include/Deck.h +++ b/include/Deck.h @@ -24,7 +24,7 @@ class Deck { int cardsRemaining(); vector dealHand(const int& size); Card drawCard(const unsigned& index = 0); - void addCard(Card card); + void addCard(const Card& card); string toString(); virtual ~Deck(); }; From 3f52bf0533cbe26221d3a5cbcbd5d86f41693e47 Mon Sep 17 00:00:00 2001 From: sergiokb Date: Sun, 1 May 2022 00:28:48 +0300 Subject: [PATCH 11/24] Description --- description/description.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 description/description.txt diff --git a/description/description.txt b/description/description.txt new file mode 100644 index 0000000..c6070bc --- /dev/null +++ b/description/description.txt @@ -0,0 +1,21 @@ +Pocker-ProjectTP- +Игра «Покер» + +Структура + +Имеется карточный стол. Игра ведется в Безлимитный Техасский Холдем, участников +двое. Игроки перед началом партии регистрируются. + +Детали реализации + +У всех игроков изначально равное количество денег. В начале игры игрокам случайным образом + раздаются по 2 карты. У каждой карты есть индивидуальные номинал и масть. Пользователи по очереди + ходят (делают ставки, повышают/уравнивают/сбрасывают), сменяются стадии игры (префлоп, флоп, + терн, ривер). Время на ход ограничено. В конце раунда, исходя из карт на столе и на руках у + игроков, определяется победитель, который забирает банк. После этого начинается новый раунд. + Игра ведется до тех пор, пока не останется один победитель. + +Полезные паттерны и хинты + +1. Strategy - разделение стратегий игры бота и игрока +2. Command - действия игрока From b1b27a9eb8069ed5dfbfdc03c59e0007d6ab26f4 Mon Sep 17 00:00:00 2001 From: sergiokb Date: Sun, 1 May 2022 19:28:38 +0300 Subject: [PATCH 12/24] Added Classic Poker --- description/ATP_POCKER.pdf | Bin 0 -> 44609 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 description/ATP_POCKER.pdf diff --git a/description/ATP_POCKER.pdf b/description/ATP_POCKER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c11e79e2ff7c806354027fd7dba215aeff112ba0 GIT binary patch literal 44609 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

_4jiU>FIktdBK9M0U0=?}k$2 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

r}GOx6BH7QE0j0{o$_DsS1>j57 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 S85H8;Fqk+6FYtXT>i+}KYTBa! literal 0 HcmV?d00001 From 961b745e54a40526f308ad8cd46f2206701e6af0 Mon Sep 17 00:00:00 2001 From: Krekhov Nikolai Date: Sun, 1 May 2022 19:56:04 +0300 Subject: [PATCH 13/24] CMakeList --- CMakeLists.txt | 2 +- README.md | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 637fd53..12ddb50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.20) +cmake_minimum_required(VERSION 3.17) project(Proj) set(CMAKE_CXX_STANDARD 17) diff --git a/README.md b/README.md index 97b21fb..cd99493 100644 --- a/README.md +++ b/README.md @@ -1 +1,32 @@ # Pocker-ProjectTP- + +Pocker-ProjectTP- + Игра «Покер» + + + Структура + + + Имеется карточный стол. Игра ведется в Безлимитный Техасский Холдем, идет турнир. + Перед началом партии игроки регистрируются. + + + Детали реализации + + + У всех игроков изначально равное количество денег, 100 условных единиц. В начале игры игрокам случайным образом раздаются по 2 карты. + У каждой карты есть индивидуальные номинал и масть. Пользователи по очереди ходят (делают ставки, повышают/уравнивают/сбрасывают), + сменяются стадии игры (префлоп, флоп, терн, ривер). Перед ходом каждого следующего игрока скрываются данные прошлого, + предлагаются варианты действий. + + В конце раунда, исходя из карт на столе и на руках у оставшихся игроков, определяется победитель, который забирает банк. + Игроки, у которых не осталось денег, выбывают, после чего начинается новый раунд. + Игра ведется до тех пор, пока не останется один победитель. + + + Полезные паттерны и хинты + + + 1. Observer + 2. Command - действия игрока + Мы старались максимально соответствовать принципам Solid. From c61830d502ba1125237403a0ff6d1bcab5dfb733 Mon Sep 17 00:00:00 2001 From: Krekhov Nikolai Date: Sun, 1 May 2022 19:56:42 +0300 Subject: [PATCH 14/24] description -> README --- description/description.txt | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 description/description.txt diff --git a/description/description.txt b/description/description.txt deleted file mode 100644 index c6070bc..0000000 --- a/description/description.txt +++ /dev/null @@ -1,21 +0,0 @@ -Pocker-ProjectTP- -Игра «Покер» - -Структура - -Имеется карточный стол. Игра ведется в Безлимитный Техасский Холдем, участников -двое. Игроки перед началом партии регистрируются. - -Детали реализации - -У всех игроков изначально равное количество денег. В начале игры игрокам случайным образом - раздаются по 2 карты. У каждой карты есть индивидуальные номинал и масть. Пользователи по очереди - ходят (делают ставки, повышают/уравнивают/сбрасывают), сменяются стадии игры (префлоп, флоп, - терн, ривер). Время на ход ограничено. В конце раунда, исходя из карт на столе и на руках у - игроков, определяется победитель, который забирает банк. После этого начинается новый раунд. - Игра ведется до тех пор, пока не останется один победитель. - -Полезные паттерны и хинты - -1. Strategy - разделение стратегий игры бота и игрока -2. Command - действия игрока From 829b71459dffbad357f0b613e60650a4e44ad12f Mon Sep 17 00:00:00 2001 From: Krekhov Nikolai Date: Sun, 1 May 2022 20:05:05 +0300 Subject: [PATCH 15/24] change UML (add classic Poker) --- description/ATP_POCKER.pdf | Bin 44609 -> 45531 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/description/ATP_POCKER.pdf b/description/ATP_POCKER.pdf index c11e79e2ff7c806354027fd7dba215aeff112ba0..01c7cf04e65f835dbb4c9b9aaeb6fd1e480c9035 100644 GIT binary patch delta 42396 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

Z7GatZD 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 b=z;*8BhTl=_cf#_oNVlzC?7sZDnkAjoY1_G delta 41541 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 wcUhE(I})_O+`Q_$a$^aD;e$OL{yUQ0+|6Cxy Date: Sun, 1 May 2022 20:40:54 +0300 Subject: [PATCH 16/24] Update README.md --- README.md | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index cd99493..ceb47e8 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,33 @@ -# Pocker-ProjectTP- +# Poker -Pocker-ProjectTP- - Игра «Покер» +### Structure of the game: - Структура + * There is a card tableю Player is up to choose one of the 2 modes of poker to play: [**Classical Poker**](https://en.wikipedia.org/wiki/Draw_poker) and [**No Limit Texas Holdem**](https://en.wikipedia.org/wiki/Texas_hold_%27em). + In the beginning of the game, players register by entering their names. - - Имеется карточный стол. Игра ведется в Безлимитный Техасский Холдем, идет турнир. - Перед началом партии игроки регистрируются. - - - Детали реализации - - - У всех игроков изначально равное количество денег, 100 условных единиц. В начале игры игрокам случайным образом раздаются по 2 карты. - У каждой карты есть индивидуальные номинал и масть. Пользователи по очереди ходят (делают ставки, повышают/уравнивают/сбрасывают), - сменяются стадии игры (префлоп, флоп, терн, ривер). Перед ходом каждого следующего игрока скрываются данные прошлого, - предлагаются варианты действий. +### Details of realization: - В конце раунда, исходя из карт на столе и на руках у оставшихся игроков, определяется победитель, который забирает банк. - Игроки, у которых не осталось денег, выбывают, после чего начинается новый раунд. - Игра ведется до тех пор, пока не останется один победитель. + * All players initially have the same amount of money, 100 conventional units. At the beginning of the game, players are randomly dealt 2 cards. + Each card has its own value and suit. Users take turns: _raising/calling/folding_, + while game stages consequently change in the following order: _preflop, flop, turn, river_. Before the move of next player, other players' moves are hidden, current best combination for this player is shown. - - Полезные паттерны и хинты + * At the end of the round, based on the cards on the table and in the hands of the remaining players, the winner is determined who takes all the pot. + Players with no money left are eliminated and new round begins. + The game is played until there is only **one winner** left. +### Useful patterns and hints used: 1. Observer - 2. Command - действия игрока - Мы старались максимально соответствовать принципам Solid. + 2. Command - players' actions + We tried our best to comply with the **Solid principles**. + +### Installation: + +> $ git clone git@github.com:tasticolly/Pocker-ProjectTP-.git +> $ cmake -B build +> $ cmake --build build + +### Run: + +> $ ./build/Proj From 55558a4f084cd0f5415d39bb7ea5d8fb2299eed2 Mon Sep 17 00:00:00 2001 From: limerentt <94709578+limerentt@users.noreply.github.com> Date: Sun, 1 May 2022 20:41:26 +0300 Subject: [PATCH 17/24] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ceb47e8..e2beb4d 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,10 @@ ### Installation: -> $ git clone git@github.com:tasticolly/Pocker-ProjectTP-.git -> $ cmake -B build -> $ cmake --build build +* > $ git clone git@github.com:tasticolly/Pocker-ProjectTP-.git +* > $ cmake -B build +* > $ cmake --build build ### Run: -> $ ./build/Proj +* > $ ./build/Proj From e5c1b827e03376650ef0ea709a0c47277b978581 Mon Sep 17 00:00:00 2001 From: limerentt <94709578+limerentt@users.noreply.github.com> Date: Sun, 1 May 2022 20:42:45 +0300 Subject: [PATCH 18/24] Update README.md --- README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e2beb4d..c007645 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,14 @@ ### Installation: -* > $ git clone git@github.com:tasticolly/Pocker-ProjectTP-.git -* > $ cmake -B build -* > $ cmake --build build +> $ git clone git@github.com:tasticolly/Pocker-ProjectTP-.git + + +> $ cmake -B build + + +> $ cmake --build build ### Run: -* > $ ./build/Proj +> $ ./build/Proj From f1176954c6bc9aa46b0662bc6d0509d58412e6e2 Mon Sep 17 00:00:00 2001 From: limerentt <94709578+limerentt@users.noreply.github.com> Date: Sun, 1 May 2022 20:43:27 +0300 Subject: [PATCH 19/24] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index c007645..854687c 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,8 @@ > $ git clone git@github.com:tasticolly/Pocker-ProjectTP-.git - > $ cmake -B build - > $ cmake --build build ### Run: From c17e6ca70a988a9552f68fdc675758d53d866b99 Mon Sep 17 00:00:00 2001 From: limerentt <94709578+limerentt@users.noreply.github.com> Date: Sun, 1 May 2022 20:43:56 +0300 Subject: [PATCH 20/24] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 854687c..759eff1 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ 1. Observer 2. Command - players' actions + + We tried our best to comply with the **Solid principles**. ### Installation: From 55b13bcba0f1042b28271ef7fff5af26cc80eea4 Mon Sep 17 00:00:00 2001 From: limerentt <94709578+limerentt@users.noreply.github.com> Date: Sun, 1 May 2022 20:45:11 +0300 Subject: [PATCH 21/24] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 759eff1..93f2975 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ 2. Command - players' actions - We tried our best to comply with the **Solid principles**. + We tried our best to comply with the **SOLID principles**. ### Installation: From 4567dc80ee21919681abbdc8e31a043dd6eef042 Mon Sep 17 00:00:00 2001 From: limerentt <94709578+limerentt@users.noreply.github.com> Date: Sun, 1 May 2022 22:39:18 +0300 Subject: [PATCH 22/24] Update PokerGame.cpp --- sources/PokerGame.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sources/PokerGame.cpp b/sources/PokerGame.cpp index 58341a7..6e990be 100644 --- a/sources/PokerGame.cpp +++ b/sources/PokerGame.cpp @@ -104,7 +104,9 @@ void PokerGame::classicGameLoop(int turns) { int discard; cout << playerHands[j].getOwnerName() << "'s hand: (" << playerHands[j].printEvaluation() << ")\n\n"; cout << playerHands[j].drawHand(); - for (int k = 0; k < playerHands[j].cardsRemaining(); ++k) cout << "╚═ " << k + 1 << " ═╝"; + for (int k = 0; k < playerHands[j].cardsRemaining(); ++k) { + cout << "╚═ " << k + 1 << " ═╝"; + } cout << '\n'; cout << "\nInput number of cards to discard (up to three): "; cin >> discard; From 89667af1c24115fd9bf99e39e3cf38954f939059 Mon Sep 17 00:00:00 2001 From: limerentt <94709578+limerentt@users.noreply.github.com> Date: Sun, 1 May 2022 22:40:40 +0300 Subject: [PATCH 23/24] Update PokerGame.h --- include/PokerGame.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/PokerGame.h b/include/PokerGame.h index c01874a..24599a8 100644 --- a/include/PokerGame.h +++ b/include/PokerGame.h @@ -23,10 +23,10 @@ class PokerGame { public: PokerGame(); unsigned short getNumOfPlayers() const; - void setNumOfPlayers(unsigned short numOfPlayers); unsigned short getGameType() const; - void setGameType(unsigned short gameType); const vector& getPlayerHands() const; + void setNumOfPlayers(unsigned short numOfPlayers); + void setGameType(unsigned short gameType); void setPlayerHands(const vector& playerHands); void discardFromHand(Hand& hand, int discard); void beginGame(); From eef80a1ff3b8f77b6056e530cdc6ac4d9043596d Mon Sep 17 00:00:00 2001 From: limerentt <94709578+limerentt@users.noreply.github.com> Date: Sun, 1 May 2022 23:24:06 +0300 Subject: [PATCH 24/24] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 93f2975..2b4ec54 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ ### Installation: > $ git clone git@github.com:tasticolly/Pocker-ProjectTP-.git - +> > $ cmake -B build - +> > $ cmake --build build ### Run: