/** * This is a base to make up randomised decks of cards. * @author Pinkfish * @started Thu Dec 7 07:34:10 PST 2000 */ #include "card_base.h" #define CARD_NUM_MAX CARD_NUMBER_KING class playing_card* make_deck(int number_of_decks, int number_of_jokers) { class playing_card* deck; class playing_card card; int i; int suit; int num; for (i = 0; i < number_of_decks; i++) { for (suit = CARD_SUIT_HEARTS; suit <= CARD_SUIT_SPADES; suit++) { for (num = 1; num <= CARD_NUM_MAX; num++) { card = new(class playing_card); card->suit = suit; card->number = num; deck += ({ card }); } } } for (i = 0; i < number_of_jokers; i++) { card = new(class playing_card); card->suit = CARD_SUIT_JOKER; deck += ({ card }); } return deck; } /* make_deck() */ /** * This method scrabled the deck and shuffles it. * @param deck the deck to shuffle * @return a shuffled deck */ class playing_card* shuffle_deck(class playing_card* deck) { class playing_card* new_deck; int pos; int i; for (i = 0; i < 2; i++) { new_deck = ({ }); while (sizeof(deck)) { pos = random(sizeof(deck)); new_deck += deck[pos..pos]; deck = deck[0..pos - 1] + deck[pos+1..]; } deck = new_deck; } return deck; } /* shuffle_deck() */ /** * This method returns the three character string for the card. * @return the three character string for the card */ string query_card_string(class playing_card card) { string ret; ret = ""; switch (card->suit) { case CARD_SUIT_SPADES : ret = "S"; break; case CARD_SUIT_HEARTS : ret = "H"; break; case CARD_SUIT_DIAMONDS : ret = "D"; break; case CARD_SUIT_CLUBS : ret = "C"; break; case CARD_SUIT_JOKER : return "*J*"; } if (card->number > 10) { switch (card->number) { case CARD_NUMBER_JACK : ret = "J " + ret; break; case CARD_NUMBER_QUEEN : ret += "Q " + ret; break; case CARD_NUMBER_KING : ret += "K " + ret; break; } } else { ret = sprintf("%2d%s", card->number, ret); } return ret; } /* query_card_string() */ /** * This method determines if the card colour is red. * @param card the card to check * @return 1 if it is, 0 if not */ int is_card_red(class playing_card card) { return card->suit == CARD_SUIT_HEARTS || card->suit == CARD_SUIT_DIAMONDS; } /* is_card_red() */ /** * This method determines if the card colour is black. * @param card the card to check * @return 1 if it is, 0 if not */ int is_card_black(class playing_card card) { return card->suit == CARD_SUIT_SPADES || card->suit == CARD_SUIT_CLUBS; } /* is_card_black() */ /** * This method checks to see if the card is a joker. * @param card the card to check * @return 1 if it is, 0 if not */ int is_card_joker(class playing_card card) { return card->suit == CARD_SUIT_JOKER; } /* is_card_joker() */ /** * This method makes a array for a 3x3 card. * @param card the card to make 3x3 * @return the three line array */ string* query_card_three(class playing_card card) { string* lines; lines = allocate(3); switch (card->suit) { case CARD_SUIT_HEARTS : lines[0] = "H "; lines[2] = " H"; break; case CARD_SUIT_DIAMONDS : lines[0] = "D "; lines[2] = " D"; break; case CARD_SUIT_CLUBS : lines[0] = "C "; lines[2] = " C"; break; case CARD_SUIT_SPADES : lines[0] = "S "; lines[2] = " S"; break; case CARD_SUIT_JOKER : lines[0] = "J *"; lines[1] = " O "; lines[2] = "* K"; return lines; } if (card->number <= 10) { lines[1] = sprintf(" %2d", card->number); } else { switch (card->number) { case CARD_NUMBER_KING : lines[1] = " K "; break; case CARD_NUMBER_QUEEN : lines[1] = " Q "; break; case CARD_NUMBER_JACK : lines[1] = " J "; break; } } return lines; } /* query_card_three() */ /** * This method makes a array for a 2x2 card. * @param card the card to make 2x2 * @return the two line array */ string* query_card_two(class playing_card card) { string* lines; lines = allocate(2); switch (card->suit) { case CARD_SUIT_HEARTS : lines[0] = "H "; break; case CARD_SUIT_DIAMONDS : lines[0] = "D "; break; case CARD_SUIT_CLUBS : lines[0] = "C "; break; case CARD_SUIT_SPADES : lines[0] = "S "; break; case CARD_SUIT_JOKER : lines[0] = "J*"; lines[1] = "*O"; return lines; } if (card->number <= 10) { lines[1] = sprintf("%-2d", card->number); } else { switch (card->number) { case CARD_NUMBER_KING : lines[1] = " K"; break; case CARD_NUMBER_QUEEN : lines[1] = " Q"; break; case CARD_NUMBER_JACK : lines[1] = " J"; break; } } return lines; } /* query_card_three() */ /** * This method returns a string showing the hand. * @param hand the hand to show * @param three 1 for a 3x3, 0 for a 2x2 * @return a string representation of the hand */ string query_hand_string(class playing_card* hand, int flags) { string hand_str; int i; int j; string top; string line; string start; string end; mixed card_str; hand_str = ""; if (!(flags & CARD_HAND_NO_ADORNMENTS)) { if (flags & CARD_HAND_THREE || flags & CARD_HAND_SINGLE) { top = "+---+"; } else { top = "+--+"; } // // Make the top of the card. // line = ""; for (i = 0; i < sizeof(hand); i++) { line += top; } line += "\n"; hand_str += line; start = "|"; end = "|"; } else { line = ""; start = " "; end = " "; } hand_str += "\n"; if (flags & CARD_HAND_THREE) { card_str = map(hand, (: query_card_three :)); } else if (flags & CARD_HAND_SINGLE) { card_str = map(hand, (: ({ query_card_string($1) }) :)); } else { card_str = map(hand, (: query_card_two :)); } for (j = 0; j < sizeof(card_str[0]); j++) { for (i = 0; i < sizeof(card_str); i++) { card_str += start + (card_str[i][j]) + end; } } hand_str += line; return hand_str; } /* query_hand_string() */