Задача с колодой карт - C (СИ)

Узнай цену своей работы

Формулировка задачи:

В колоде карт должно содержаться 52 карты .Масти и ранги карт должны быть заданы с помощью константных массивов.Сдача карт должна производиться случайным образом .Предусмотреть невозможность повторной сдачи одной и той же карты. программа выдает по 9 карт трем игрокам и подсчитывает количество последовательностей из трех и боле карт одной масти у каждого игрока -Не могу сделать так , что бы программа подсчитала количество последовательностей из трех и боле карт одной масти вот начало кода :
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <locale.h>
  5. #define NUM_SUITS 4
  6. #define NUM_RANKS 13
  7. int main()
  8. {
  9. int in_hand[NUM_SUITS][NUM_RANKS] = { 0 };
  10. int num_cards = 1, rank, suit;
  11. const char rank_code[] = { '2','3','4','5','6','7','8','9','t','j','q','k','a' };
  12. const char suit_code[] = { '\x03','\x04','\x05','\x06' };
  13. setlocale(LC_ALL, "Rus");
  14. //Инициализация генератора случайных чисел
  15. srand(time(0));
  16. printf("Ваши карты : \n");
  17. while (num_cards <= 27)
  18. {
  19. suit = rand() % NUM_SUITS; //Случайная масть
  20. rank = rand() % NUM_RANKS; //Случайный ранг
  21. //Подписываем карту как 1 и делаем шаг цикла
  22. if (!in_hand[suit][rank])
  23. {
  24.  
  25. if (num_cards <= 9)//Выдача карт первому игроку
  26. {
  27. if (num_cards == 1)
  28. {
  29. printf("Первый игрок: ");
  30. }
  31. printf("%c%c ", rank_code[rank], suit_code[suit]);
  32. if (num_cards == 9)
  33. {
  34. printf("\n");
  35. }
  36. }
  37.  
  38. if (num_cards >= 10 && num_cards <= 18) //Выдача карт второму игроку
  39. {
  40. if (num_cards == 10)
  41. {
  42. printf("Второй игрок: ");
  43. }
  44. printf("%c%c ", rank_code[rank], suit_code[suit]);
  45. if (num_cards == 18)
  46. {
  47. printf("\n");
  48. }
  49. }
  50.  
  51. if (num_cards>18) //Выдача карт третьему игроку
  52. {
  53. if (num_cards == 19)
  54. {
  55. printf("Третий игрок: ");
  56. }
  57. printf("%c%c ", rank_code[rank], suit_code[suit]);
  58. if (num_cards == 27)
  59. {
  60. printf("\n");
  61. }
  62. }
  63.  
  64. in_hand[suit][rank] = 1; //Карта выбрана
  65. num_cards++;
  66. }
  67. }
  68. printf("\n");
  69. return 0;
  70. }

Решение задачи: «Задача с колодой карт»

textual
Листинг программы
  1. void init_cards(Cards *cards)
  2. {
  3.   assert(cards != NULL);
  4.  
  5.   for (unsigned i = 0; i < ARRAY_SIZE(*cards); ++i)
  6.   {
  7.     unsigned j = rand() % (i + 1);
  8.     (*cards)[i] = (*cards)[j];
  9.     (*cards)[j].suit = i / N_RANKS;
  10.     (*cards)[j].rank = i % N_RANKS;
  11.   }
  12. }

Объяснение кода листинга программы

  1. В функции init_cards происходит инициализация колоды карт.
  2. Первая проверка на NULL адрес указывает на корректность передачи указателя на колоду карт.
  3. В цикле for происходит перебор карт в колоде.
  4. Случайным образом выбирается карта из колоды и помещается на текущую позицию.
  5. Значение переменной i делится на N_RANKS для определения масти карты.
  6. Значение переменной i берется по модулю N_RANKS для определения достоинства карты.
  7. Переменная j инициализируется случайным образом, используя функцию rand().
  8. Значение переменной j берется по модулю (i + 1) для определения индекса карты, которую необходимо поместить на текущую позицию.
  9. Карта, соответствующая индексу j, копируется на текущую позицию.
  10. Значения переменных suit и rank карты, находящейся на текущей позиции, присваиваются соответствующие значения.
  11. Карты в колоде перемешиваются в соответствии с алгоритмом Fisher-Yates.
  12. Результатом работы функции является инициализированная колода карт.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы