summaryrefslogtreecommitdiffstats
path: root/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game.cpp')
-rw-r--r--game.cpp195
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;
+ }
+}
+