Определение комбинаций в карточной колоде (программа на C)
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Программа псевдослучайным образом выбирает из колоды в 54 карты (2–10, валет, дама, король, туз в мастях пики, трефы, бубны, червы + 2 джокера) пять карт и отображает свой выбор. После этого определяется, есть ли в сданных картах одна из комбинаций:
(a) Пара: две карты одного значения;
(b) Сет: три карты одного значения;
(c) Флэш: пять карт одной масти.
помогите пожалуйста,нужно срочно..
Я так понимаю, джокеры также должны учитываться при определении комбинаций?
#include <stdio.h> #include <stdlib.h> #include <math.h> /* * Программа псевдослучайным образом выбирает из колоды в 54 карты * (2–10, валет, дама, король, туз в мастях пики, трефы, бубны, червы + 2 джокера) * пять карт и отображает свой выбор. * * После этого определяется, есть ли в сданных картах одна из комбинаций: * (a) Пара: две карты одного значения; * (b) Сет: три карты одного значения; * (c) Флэш: пять карт одной масти. */ // Размер колоды #define DECK_SIZE 54 // Количество карт у игрока #define HAND_SIZE 5 // Валет #define JACK 11 // Дама #define QUEEN 12 // Король #define KING 13 // Туз #define ACE 14 // Джокер #define JOKER 15 // Трефы #define CLUB 1 // Пики #define SPADE 2 // Черви #define HEART 3 // Буби #define DIAMOND 4 // Цвета для джокеров // Черный #define BLACK 5 // Красный #define RED 6 typedef struct { // Карта unsigned short int value; // Масть unsigned short int lear; } poker_card; // Получить псевдо-случайное число unsigned int get_pseudo_random_number(unsigned int begin, unsigned int end, int additional_entropy) { // Временная энтропия для псевдо-рандома srand(time(NULL) * additional_entropy); return rand() % end + begin; } // Инициализация карточной колоды void init_card_deck(poker_card deck[]) { int i, j; int x = 0; poker_card card; for (i = CLUB; i <= DIAMOND; i++) { for (j = 2; j <= ACE; j++) { card.lear = i; card.value = j; deck[x] = card; x++; } } // Добавление двух джокеров в колоду card.value = JOKER; card.lear = BLACK; deck[x] = card; x++; card.lear = RED; deck[x] = card; } // Раздать 5 случайных карт void deal_the_cards(poker_card hand[], poker_card deck[], unsigned int hand_size) { int i, x; for (i = 0; i < hand_size; i++) { x = get_pseudo_random_number(0, DECK_SIZE - 1, i + 1); hand[i] = deck[x]; } } // Перевести масть в человеческий формат и вывести на экран char* print_tr_card_lear(unsigned short int lear) { char* s; switch(lear) { case CLUB: // черви s = "clubs"; break; case SPADE: // пики s = "spades"; break; case HEART: // черви s = "hearts"; break; case DIAMOND: // бубны s = "diamonds"; break; case BLACK: // черный джокер s = "black"; break; case RED: // красный джокер s = "red"; break; default: s = ""; break; } printf("%s", s); } // Перевести номинал карты в человеческий формат и вывести на экран void print_tr_card_value(unsigned short int value) { char* s; if (value <= 10) { printf("%d", value); } switch (value) { case JACK: // валет s = "jack"; break; case QUEEN: // дама s = "queen"; break; case KING: // король s = "king"; break; case ACE: // туз s = "ace"; break; case JOKER: // джокер s = "joker"; break; default: s = ""; break; } printf("%s", s); } void sort_hand(poker_card hand[], unsigned int size) { int i, j; poker_card sort_buf; for (j = 0; j < size - 1; j++) { for (i = 0; i < size - j - 1; i++) { if (hand[i].value > hand[i + 1].value) { sort_buf = hand[i]; hand[i] = hand[i + 1]; hand[i + 1] = sort_buf; } } } } void print_detected_combination(poker_card hand[], unsigned int size) { // Количество карт одного значения int repeat_value = 1; // Количество карт одной масти int repeat_lear = 1; int i; for (i = 0; i < size - 1; i++) { if (hand[i].value == hand[i + 1].value || hand[i].value == JOKER || hand[i + 1].value == JOKER) { repeat_value++; } if (hand[i].lear == hand[i + 1].lear || hand[i].value == JOKER || hand[i + 1].value == JOKER) { repeat_lear++; } } if (repeat_value == 2) { // Пара printf("Pair detected!\n"); } else if (repeat_value == 3) { // Сет printf("Set detected!\n"); } else if (repeat_value == 4) { // Покер printf("Poker detected\n"); } // Флеш if (repeat_lear == size) { printf("Flash detected!\n"); } else if (repeat_value < 2) { printf("No combinations detected...\n"); } } // Перевести карту в человеческий формат и вывести на экран void print_tr_card(poker_card card) { print_tr_card_lear(card.lear); printf(" "); print_tr_card_value(card.value); printf("\n"); } int main(int argc, char* argv[]) { poker_card deck[DECK_SIZE]; init_card_deck(deck); // Карточная рука poker_card hand[5]; // Раздать карты одному игроку deal_the_cards(hand, deck, HAND_SIZE); sort_hand(hand, HAND_SIZE); int i; for (i = 0; i < HAND_SIZE; i++) { print_tr_card(hand[i]); } printf("\nCombinations:\n"); print_detected_combination(hand, HAND_SIZE); return 0; }