Задача с колодой карт - 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. - Результатом работы функции является инициализированная колода карт.