Задача с колодой карт - 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
. - Результатом работы функции является инициализированная колода карт.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д