Задача с колодой карт - C (СИ)
Формулировка задачи:
В колоде карт должно содержаться 52 карты .Масти и ранги карт должны быть заданы с помощью константных массивов.Сдача карт должна производиться случайным образом .Предусмотреть невозможность повторной сдачи одной и той же карты.
программа выдает по 9 карт трем игрокам и подсчитывает количество последовательностей из трех и боле карт одной масти у каждого игрока
-Не могу сделать так , что бы программа подсчитала количество последовательностей из трех и боле карт одной масти
вот начало кода :
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <locale.h>
- #define NUM_SUITS 4
- #define NUM_RANKS 13
- int main()
- {
- int in_hand[NUM_SUITS][NUM_RANKS] = { 0 };
- int num_cards = 1, rank, suit;
- const char rank_code[] = { '2','3','4','5','6','7','8','9','t','j','q','k','a' };
- const char suit_code[] = { '\x03','\x04','\x05','\x06' };
- setlocale(LC_ALL, "Rus");
- //Инициализация генератора случайных чисел
- srand(time(0));
- printf("Ваши карты : \n");
- while (num_cards <= 27)
- {
- suit = rand() % NUM_SUITS; //Случайная масть
- rank = rand() % NUM_RANKS; //Случайный ранг
- //Подписываем карту как 1 и делаем шаг цикла
- if (!in_hand[suit][rank])
- {
- if (num_cards <= 9)//Выдача карт первому игроку
- {
- if (num_cards == 1)
- {
- printf("Первый игрок: ");
- }
- printf("%c%c ", rank_code[rank], suit_code[suit]);
- if (num_cards == 9)
- {
- printf("\n");
- }
- }
- if (num_cards >= 10 && num_cards <= 18) //Выдача карт второму игроку
- {
- if (num_cards == 10)
- {
- printf("Второй игрок: ");
- }
- printf("%c%c ", rank_code[rank], suit_code[suit]);
- if (num_cards == 18)
- {
- printf("\n");
- }
- }
- if (num_cards>18) //Выдача карт третьему игроку
- {
- if (num_cards == 19)
- {
- printf("Третий игрок: ");
- }
- printf("%c%c ", rank_code[rank], suit_code[suit]);
- if (num_cards == 27)
- {
- printf("\n");
- }
- }
- in_hand[suit][rank] = 1; //Карта выбрана
- num_cards++;
- }
- }
- printf("\n");
- return 0;
- }
Решение задачи: «Задача с колодой карт»
textual
Листинг программы
- void init_cards(Cards *cards)
- {
- assert(cards != NULL);
- for (unsigned i = 0; i < ARRAY_SIZE(*cards); ++i)
- {
- unsigned j = rand() % (i + 1);
- (*cards)[i] = (*cards)[j];
- (*cards)[j].suit = i / N_RANKS;
- (*cards)[j].rank = i % N_RANKS;
- }
- }
Объяснение кода листинга программы
- В функции
init_cards
происходит инициализация колоды карт. - Первая проверка на
NULL
адрес указывает на корректность передачи указателя на колоду карт. - В цикле
for
происходит перебор карт в колоде. - Случайным образом выбирается карта из колоды и помещается на текущую позицию.
- Значение переменной
i
делится наN_RANKS
для определения масти карты. - Значение переменной
i
берется по модулюN_RANKS
для определения достоинства карты. - Переменная
j
инициализируется случайным образом, используя функциюrand()
. - Значение переменной
j
берется по модулю(i + 1)
для определения индекса карты, которую необходимо поместить на текущую позицию. - Карта, соответствующая индексу
j
, копируется на текущую позицию. - Значения переменных
suit
иrank
карты, находящейся на текущей позиции, присваиваются соответствующие значения. - Карты в колоде перемешиваются в соответствии с алгоритмом
Fisher-Yates
. - Результатом работы функции является инициализированная колода карт.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д