imported catch-22 sol clone with authors permission
[reactos.git] / rosapps / games / solitaire / cardlib / cardstack.cpp
diff --git a/rosapps/games/solitaire/cardlib/cardstack.cpp b/rosapps/games/solitaire/cardlib/cardstack.cpp
new file mode 100644 (file)
index 0000000..147c096
--- /dev/null
@@ -0,0 +1,237 @@
+//\r
+//     CardLib - CardStack class\r
+//\r
+//     Freeware\r
+//     Copyright J Brown 2001\r
+//\r
+#include <windows.h>\r
+#include <stdlib.h>\r
+\r
+#include "cardstack.h"\r
+\r
+Card &CardStack::operator[] (size_t index)\r
+{\r
+       if(index >= (size_t)nNumCards) index = nNumCards - 1;\r
+       return cardlist[nNumCards - index - 1];\r
+}\r
+\r
+const Card &CardStack::operator[] (size_t index) const\r
+{\r
+       if(index >= (size_t)nNumCards) index = nNumCards - 1;\r
+       return cardlist[nNumCards - index - 1];\r
+}\r
+\r
+//     Subscripting operator for a constant sequence\r
+//\r
+/*Card CardStack::operator[] (size_t index) const\r
+{\r
+       return cardlist[index];\r
+}*/\r
+\r
+//\r
+//     Subscripting operator for a non-const sequence\r
+//\r
+/*CardStack::ref  CardStack::operator[] (size_t index)\r
+{\r
+       return ref(this, index);\r
+}*/\r
+\r
+void CardStack::Clear()\r
+{\r
+       nNumCards = 0;\r
+}\r
+\r
+void CardStack::NewDeck()\r
+{\r
+       nNumCards = 52;\r
+\r
+       for(int i = 0; i < 52; i++)\r
+               cardlist[i].nValue = i;\r
+}\r
+\r
+void CardStack::Shuffle()\r
+{\r
+       int src, dest;\r
+       Card temp;\r
+\r
+       //shuffle 8 times..\r
+       for(int i = 0; i < 8; i++)\r
+               for(dest = nNumCards - 1; dest > 0; dest--)\r
+               {\r
+                       //want to do this:\r
+                       //  bad:   src = rand() % (dest + 1)\r
+                       //  good:  src = rand() / (RAND_MAX / (dest+1) + 1)\r
+                       \r
+                       //positions from 0 to dest\r
+                       src = rand() / (RAND_MAX / (dest+1) + 1);\r
+                       \r
+                       //swap the cards\r
+                       temp           = cardlist[src];\r
+                       cardlist[src]  = cardlist[dest];\r
+                       cardlist[dest] = temp;\r
+               }\r
+}\r
+\r
+void CardStack::Reverse()\r
+{\r
+       for(int i = 0; i < nNumCards / 2; i++)\r
+       {\r
+               Card temp                   = cardlist[i];\r
+               cardlist[i]                 = cardlist[nNumCards - i - 1];\r
+               cardlist[nNumCards - i - 1] = temp;\r
+       }\r
+}\r
+\r
+void CardStack::Push(const Card card)\r
+{\r
+       if(nNumCards < MAX_CARDSTACK_SIZE)\r
+               cardlist[nNumCards++] = card;\r
+}\r
+\r
+void CardStack::Push(const CardStack &cardstack)\r
+{\r
+       if(nNumCards + cardstack.nNumCards < MAX_CARDSTACK_SIZE)\r
+       {\r
+               int num = cardstack.NumCards();\r
+               \r
+               for(int i = 0; i < num; i++)\r
+                       cardlist[nNumCards++] = cardstack.cardlist[i];\r
+       }\r
+}\r
+\r
+CardStack& CardStack::operator += (Card card)\r
+{\r
+       Push(card);\r
+       return *this;\r
+}\r
+\r
+CardStack& CardStack::operator += (CardStack &cs)\r
+{\r
+       Push(cs);\r
+       return *this;\r
+}\r
+\r
+CardStack CardStack::operator +  (Card card)\r
+{\r
+       CardStack poo = *this;\r
+       poo.Push(card);\r
+       return poo;\r
+}\r
+\r
+CardStack CardStack::operator + (CardStack &cs)\r
+{\r
+       CardStack poo = *this;\r
+       poo.Push(cs);\r
+       return poo;\r
+}\r
+\r
+\r
+Card CardStack::Pop()\r
+{\r
+       if(nNumCards > 0)\r
+               return cardlist[--nNumCards];\r
+       else\r
+               return 0;\r
+}\r
+\r
+CardStack CardStack::Pop(int items)\r
+{\r
+       if(items <= nNumCards && nNumCards > 0)\r
+       {\r
+               CardStack cs(*this, nNumCards - items);\r
+\r
+               nNumCards -= items;\r
+\r
+               return cs;\r
+       }\r
+       else\r
+       {\r
+               return CardStack();\r
+       }\r
+}\r
+\r
+Card CardStack::Top()\r
+{\r
+       if(nNumCards > 0)\r
+               return cardlist[nNumCards - 1];\r
+       else\r
+               return 0;\r
+}\r
+\r
+CardStack CardStack::Top(int items)\r
+{\r
+       if(items <= nNumCards && nNumCards > 0)\r
+       {\r
+               return CardStack (*this, nNumCards - items);\r
+       }\r
+       else\r
+       {\r
+               return CardStack();\r
+       }\r
+\r
+}\r
+\r
+Card CardStack::RemoveCard(size_t index)\r
+{\r
+       if(nNumCards == 0 || index >= (size_t)nNumCards)\r
+               return 0;\r
+\r
+       //put index into reverse range..\r
+       index = nNumCards - index - 1;\r
+\r
+       Card temp = cardlist[index];\r
+\r
+       nNumCards--;\r
+\r
+       for(size_t i = index; i < (size_t)nNumCards; i++)\r
+       {\r
+               cardlist[i] = cardlist[i+1];\r
+       }\r
+\r
+       return temp;\r
+}\r
+\r
+void CardStack::InsertCard(size_t index, Card card)\r
+{\r
+       if(nNumCards == MAX_CARDSTACK_SIZE)\r
+               return;\r
+\r
+       if(index > (size_t)nNumCards)\r
+               return;\r
+\r
+       if((size_t)nNumCards == index)\r
+       {\r
+               cardlist[nNumCards] = card;\r
+               nNumCards++;\r
+               return;\r
+       }\r
+\r
+       //put index into reverse range..\r
+       index = nNumCards - index - 1;\r
+\r
+       nNumCards++;\r
+\r
+       //make room for the card\r
+       for(size_t i = nNumCards; i > index; i--)\r
+       {\r
+               cardlist[i] = cardlist[i - 1];\r
+       }\r
+\r
+       cardlist[index] = card;\r
+}\r
+\r
+\r
+void CardStack::Print()\r
+{\r
+//     for(int i = 0; i < nNumCards; i++)\r
+//             cout << cardlist[i].HiVal() << " ";\r
+}\r
+\r
+CardStack::CardStack(CardStack &copythis, size_t fromindex)\r
+{\r
+       nNumCards = copythis.nNumCards - fromindex;\r
+\r
+       for(int i = 0; i < nNumCards; i++)\r
+               cardlist[i] = copythis.cardlist[fromindex + i];\r
+}\r
+\r