/* dealer3-v2.cpp From CPP w/o Fear, by Overland. Remembers which card has been drawn. */ #include #include #include #include using namespace std; int rand_0toN1(int n); string draw_a_card(); int select_next_available(int n); string suits[4] = {"hearts", "diamonds", "spades", "clubs"}; string ranks[13] = {"ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king" }; //Global variables //flags for drawn cards bool card_drawn[52]; //undealt cards remain in deck int cards_remaining = 52; int main() { int n, i; string card; srand(time(NULL)); // Set seed for random numbers. cout << "Enter no. of cards to draw (c-d to exit): "; cin >> n; while(cin) { for (int i = 1; i <= n; i++){ card = draw_a_card(); cout << card << endl; } cout << "Enter no. of cards to draw (c-d to exit): "; cin >> n; } //exit cout << endl << "Exiting.." << endl; return 0; } // Draw-a-card function // Performs one card-draw by getting a random 0-4 and a random // 0-12. These are then used to index the string arrays, ranks // and suits. // string draw_a_card() { int r; // Random index (0 thru 12) into ranks array int s; // Random index (0 thru 3) into suits array int n, card; n = rand_0toN1(cards_remaining--); card = select_next_available(n); r = card % 13; // r = random 0 to 12 s = card / 13; // s = random 0 to 3 return( ranks[r] + " of " + suits[s]); } // Select-next-available-card function. // Find the Nth element of card_drawn, skipping over all those // elements already set to true. // int select_next_available(int n) { int i = 0; // At beginning of deck, skip past cards already drawn. while (card_drawn[i]) i++; while (n-- > 0) { // Do the following n times: i++; // Advance to next card while (card_drawn[i]) // Skip past cards i++; // already drawn. } card_drawn[i] = true; // Note card to be drawn return i; // Return this number. } // Random 0-to-N1 Function. // Generate a random integer from 0 to N-1. // int rand_0toN1(int n) { return rand() % n; }