Reactos
at master 235 lines 4.4 kB view raw
1// 2// CardLib - CardStack class 3// 4// Freeware 5// Copyright J Brown 2001 6// 7 8#include "cardlib.h" 9 10Card &CardStack::operator[] (size_t index) 11{ 12 if(index >= (size_t)nNumCards) index = nNumCards - 1; 13 return cardlist[nNumCards - index - 1]; 14} 15 16const Card &CardStack::operator[] (size_t index) const 17{ 18 if(index >= (size_t)nNumCards) index = nNumCards - 1; 19 return cardlist[nNumCards - index - 1]; 20} 21 22// Subscripting operator for a constant sequence 23// 24/*Card CardStack::operator[] (size_t index) const 25{ 26 return cardlist[index]; 27}*/ 28 29// 30// Subscripting operator for a non-const sequence 31// 32/*CardStack::ref CardStack::operator[] (size_t index) 33{ 34 return ref(this, index); 35}*/ 36 37void CardStack::Clear() 38{ 39 nNumCards = 0; 40} 41 42void CardStack::NewDeck() 43{ 44 nNumCards = 52; 45 46 for(int i = 0; i < 52; i++) 47 cardlist[i].nValue = i; 48} 49 50void CardStack::Shuffle() 51{ 52 int src, dest; 53 Card temp; 54 55 //shuffle 8 times.. 56 for(int i = 0; i < 8; i++) 57 for(dest = nNumCards - 1; dest > 0; dest--) 58 { 59 //want to do this: 60 // bad: src = rand() % (dest + 1) 61 // good: src = rand() / (RAND_MAX / (dest+1) + 1) 62 63 //positions from 0 to dest 64 src = rand() / (RAND_MAX / (dest+1) + 1); 65 66 //swap the cards 67 temp = cardlist[src]; 68 cardlist[src] = cardlist[dest]; 69 cardlist[dest] = temp; 70 } 71} 72 73void CardStack::Reverse() 74{ 75 for(int i = 0; i < nNumCards / 2; i++) 76 { 77 Card temp = cardlist[i]; 78 cardlist[i] = cardlist[nNumCards - i - 1]; 79 cardlist[nNumCards - i - 1] = temp; 80 } 81} 82 83void CardStack::Push(const Card card) 84{ 85 if(nNumCards < MAX_CARDSTACK_SIZE) 86 cardlist[nNumCards++] = card; 87} 88 89void CardStack::Push(const CardStack &cardstack) 90{ 91 if(nNumCards + cardstack.nNumCards < MAX_CARDSTACK_SIZE) 92 { 93 int num = cardstack.NumCards(); 94 95 for(int i = 0; i < num; i++) 96 cardlist[nNumCards++] = cardstack.cardlist[i]; 97 } 98} 99 100CardStack& CardStack::operator += (Card card) 101{ 102 Push(card); 103 return *this; 104} 105 106CardStack& CardStack::operator += (CardStack &cs) 107{ 108 Push(cs); 109 return *this; 110} 111 112CardStack CardStack::operator + (Card card) 113{ 114 CardStack poo = *this; 115 poo.Push(card); 116 return poo; 117} 118 119CardStack CardStack::operator + (CardStack &cs) 120{ 121 CardStack poo = *this; 122 poo.Push(cs); 123 return poo; 124} 125 126 127Card CardStack::Pop() 128{ 129 if(nNumCards > 0) 130 return cardlist[--nNumCards]; 131 else 132 return 0; 133} 134 135CardStack CardStack::Pop(int items) 136{ 137 if(items <= nNumCards && nNumCards > 0) 138 { 139 CardStack cs(*this, nNumCards - items); 140 141 nNumCards -= items; 142 143 return cs; 144 } 145 else 146 { 147 return CardStack(); 148 } 149} 150 151Card CardStack::Top() 152{ 153 if(nNumCards > 0) 154 return cardlist[nNumCards - 1]; 155 else 156 return 0; 157} 158 159CardStack CardStack::Top(int items) 160{ 161 if(items <= nNumCards && nNumCards > 0) 162 { 163 return CardStack (*this, nNumCards - items); 164 } 165 else 166 { 167 return CardStack(); 168 } 169 170} 171 172Card CardStack::RemoveCard(size_t index) 173{ 174 if(nNumCards == 0 || index >= (size_t)nNumCards) 175 return 0; 176 177 //put index into reverse range.. 178 index = nNumCards - index - 1; 179 180 Card temp = cardlist[index]; 181 182 nNumCards--; 183 184 for(size_t i = index; i < (size_t)nNumCards; i++) 185 { 186 cardlist[i] = cardlist[i+1]; 187 } 188 189 return temp; 190} 191 192void CardStack::InsertCard(size_t index, Card card) 193{ 194 if(nNumCards == MAX_CARDSTACK_SIZE) 195 return; 196 197 if(index > (size_t)nNumCards) 198 return; 199 200 if((size_t)nNumCards == index) 201 { 202 cardlist[nNumCards] = card; 203 nNumCards++; 204 return; 205 } 206 207 //put index into reverse range.. 208 index = nNumCards - index - 1; 209 210 nNumCards++; 211 212 //make room for the card 213 for(size_t i = nNumCards; i > index; i--) 214 { 215 cardlist[i] = cardlist[i - 1]; 216 } 217 218 cardlist[index] = card; 219} 220 221 222void CardStack::Print() 223{ 224// for(int i = 0; i < nNumCards; i++) 225// cout << cardlist[i].HiVal() << " "; 226} 227 228CardStack::CardStack(CardStack &copythis, size_t fromindex) 229{ 230 nNumCards = copythis.nNumCards - fromindex; 231 232 for(int i = 0; i < nNumCards; i++) 233 cardlist[i] = copythis.cardlist[fromindex + i]; 234} 235