diff options
Diffstat (limited to 'game.cpp')
-rw-r--r-- | game.cpp | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/game.cpp b/game.cpp new file mode 100644 index 0000000..390fd82 --- /dev/null +++ b/game.cpp @@ -0,0 +1,195 @@ +/* + * game.cpp + * + * + */ + +#include "game.h" +#include <cstdlib> + +/* forward declaration of hands array, very interesting, I didn't know C++ needs this */ +string *Game::hands[10]; + +Game::Game(void) +{ + hands[0] = new string("Royal Flush"); + hands[1] = new string("Straight Flush"); + hands[2] = new string("Four of a Kind"); + hands[3] = new string("Full House"); + hands[4] = new string("Flush"); + hands[5] = new string("Straight"); + hands[6] = new string("Three of a Kind"); + hands[7] = new string("Two Pair"); + hands[8] = new string("One Pair"); + hands[9] = new string("High Card"); +} + +void Game::shufflePile(void) +{ + /* interesting algorithm that was discussed in the class */ + Card *tmp; + int i, j; + for (i = 0; i < 52; i++) + { + j = rand() % 52; + tmp = getCardFromDeck(i); + + putCardToDeck(i, getCardFromDeck(j)); + putCardToDeck(j, tmp); + } +} + +int Game::parseInt(string *msg, int rangeA, int rangeB) +{ + int tmp; + bool continueAsking = true; + + while (continueAsking) + { + if (msg) + cout << *msg; + + if (!(cin >> tmp)) + { + cin.clear(); + cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); + PRINT_COLOR(ANSI_COLOR_RED, "Invalid input!\n"); + continue; + } + + if ((tmp >= rangeA) && (tmp <= rangeB)) + continueAsking = false; + else + PRINT_COLOR(ANSI_COLOR_YELLOW, "Number not in the range!\n"); + } + + return tmp; +} + +void Game::askForNumberOfOpponents(void) +{ + bool continueAsking = true; + while (continueAsking) + { + cout << "Enter the amount of opponents between 1 to 3: "; + + if (!(cin >> numOfOpponents)) + { + cin.clear(); + cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); + PRINT_COLOR(ANSI_COLOR_RED, "Invalid character(s)!\n"); + continue; + } + + if ((numOfOpponents >= 1) && (numOfOpponents <= 3)) + continueAsking = false; + else + PRINT_COLOR(ANSI_COLOR_YELLOW, "Number not in the range!\n"); + } +} + +void Game::repeatGame(bool *quit) +{ + bool continueAsking = true; + char play_again; + cout << endl; + while (continueAsking) + { + cout << "Play again? (y/n) "; + cin >> play_again; + play_again = tolower(play_again); + + if (play_again == 'y') + continueAsking = false; + + else if (play_again == 'n') + { + continueAsking = false; + *quit = true; + } + } +} + +int Game::howManyCardsOfSameSuit(Card **cards) +{ + char c, l; + l = cards[0]->getType()[1]; + + int i; + for (i = 1; i < 5; i++) + { + c = cards[i]->getType()[1]; + if (c != l) + break; + } + + return i; +} + +bool Game::pairOrBetter(Card **cards) +{ + char c1, c2; + int ret = 0; + + int i, j; + for (i = 0; i < 5; i++) + { + c1 = cards[i]->getType()[0]; + + for (j = i+1; j < 5; j++) + { + c2 = cards[j]->getType()[0]; + if (c1 == c2) + { + ret++; + break; + } + } + } + + return (ret != 0); +} + +/* returns max number of same cards, returns 0 when all cards are different */ +int Game::numOfSameCards(Card **cards) +{ + char c1, c2; + int same = 0; + int max = 0; + + int i, j; + for (i = 0; i < 5; i++) + { + c1 = cards[i]->getType()[0]; + + for (j = i+1; j < 5; j++) + { + c2 = cards[j]->getType()[0]; + same = 1; + + if (c1 == c2) + { + same++; + if (same > max) + max = same; + } + else + { + same = 0; + c1 = c2; + } + } + } + + return max; +} + +void Game::opponentAI(Card **cards) +{ + if (pairOrBetter(cards)) + { + /* discard 4 other cards*/ + return; + } +} + |