Выбрать 10 случайных неповторяющихся карт из колоды - C (СИ)

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

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

Добрый день, подскажите пожалуйста, где ошибка: у меня колода из 52 карт, где value - это числа от 1 до 13, suit - ч, б, к , п ( черви, буби, крести, пики)
Листинг программы
  1. struct card{
  2. int value;
  3. char suit;
  4. };
  5. struct board{
  6. struct card deck[52];
  7. };
я хочу выбрать 10 неповторяющихся карт, но не всегда они выходят правильно, что-то неверное в else -if
Листинг программы
  1. for(i=0; i<10; i++){
  2. temp = rand()%52+1;
  3. if(b.deck[temp].value != 0){
  4. a.deck[i].value = b.deck[temp].value;
  5. a.deck[i].suit = b.deck[temp].suit;
  6. b.deck[temp].value = 0;
  7. b.deck[temp].suit = 'X';
  8. }
  9. else
  10. break;
  11. }
спасибо!
иногда верно выходит, а иногда нет Card Value: 6 Suit: c Card Value: 10 Suit: d Card Value: 2 Suit: s Card Value: 1 Suit: s Card Value: 11 Suit: d Card Value: 2664756 Suit: 6 Card Value: 2665094 Suit: ▒ Card Value: 8662208 Suit: P Card Value: 2665094 Suit: . Card Value: 2665159 Suit:

Решение задачи: «Выбрать 10 случайных неповторяющихся карт из колоды»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5.  
  6. #define SUITS_COUNT 4
  7. #define VALUES_COUNT 13
  8. #define CARDS_IN_DECK (SUITS_COUNT * VALUES_COUNT)
  9. #define CARDS_PER_PLAYER 5
  10. #define NUMBER_OF_PLAYERS 4
  11.    
  12. typedef struct CARD {
  13.     const char * value;
  14.     const char * suit;
  15. } card_t;
  16.  
  17. /*S - Spades, C - Clubs, D - Diamonds, H - Hearts*/
  18. card_t deck[CARDS_IN_DECK] = {
  19.     {"2", "S"}, {"3", "S"}, {"4", "S"}, {"5", "S"}, {"6", "S"}, {"7", "S"}, {"8", "S"}, {"9", "S"}, {"10", "S"}, {"J", "S"}, {"Q", "S"}, {"K", "S"}, {"A", "S"},
  20.     {"2", "C"}, {"3", "C"}, {"4", "C"}, {"5", "C"}, {"6", "C"}, {"7", "C"}, {"8", "C"}, {"9", "C"}, {"10", "C"}, {"J", "C"}, {"Q", "C"}, {"K", "C"}, {"A", "C"},
  21.     {"2", "D"}, {"3", "D"}, {"4", "D"}, {"5", "D"}, {"6", "D"}, {"7", "D"}, {"8", "D"}, {"9", "D"}, {"10", "D"}, {"J", "D"}, {"Q", "D"}, {"K", "D"}, {"A", "D"},
  22.     {"2", "H"}, {"3", "H"}, {"4", "H"}, {"5", "H"}, {"6", "H"}, {"7", "H"}, {"8", "H"}, {"9", "H"}, {"10", "H"}, {"J", "H"}, {"Q", "H"}, {"K", "H"}, {"A", "H"}
  23. };
  24. int top;
  25.  
  26. /* бестолковая функция для перемешивания карт */
  27. int rndcmp(const void * a, const void * b) {
  28.     return rand() - rand();
  29. }
  30. /* перемешивание колоды + установка на первую карту значения вершины */
  31. void shuffle_deck(void) {
  32.     top = 0;
  33.     qsort(deck, CARDS_IN_DECK, sizeof(card_t), rndcmp);
  34. }
  35.  
  36. /* выдача карты из колоды */
  37. card_t * get_card(void) {
  38.     return ( top < 0 || top >= CARDS_IN_DECK ) ? NULL : &deck[top++];
  39. }
  40.  
  41. /* печать карты */
  42. void print_card(const card_t * card) {
  43.     printf("|%2s %s| ", card->value, card->suit);
  44. }
  45.  
  46. /* функции для сравнения карт */
  47. /* по значению */
  48. int compare_by_value(const card_t * a, const card_t * b) {
  49.     static const char values[] = "2345678910JQKA";
  50.     return strstr(values, a->value) - strstr(values, b->value);
  51. }
  52. /* по масти (в покере вещь ненужная, только для красивости вывода) */
  53. int compare_by_suit(const card_t * a, const card_t * b) {
  54.     static const char suits[] = "SCDH";
  55.     return strstr(suits, a->suit) - strstr(suits, b->suit);
  56. }
  57. /* по значению, за тем по масти, подходит для qsort */
  58. int compare_cards(const void * a, const void * b) {
  59.     card_t * ca = *(card_t**)a;
  60.     card_t * cb = *(card_t**)b;
  61.     int diff = compare_by_value(ca, cb);
  62.    
  63.     return ( diff ) ? diff : compare_by_suit(ca, cb);
  64. }
  65.  
  66. #define PLAYER_NAME_LENGTH 64
  67. typedef struct PLAYER {
  68.     char name[PLAYER_NAME_LENGTH];
  69.     card_t * cards[CARDS_PER_PLAYER];
  70. } player_t;
  71.  
  72. int main(void) {
  73.     player_t players[NUMBER_OF_PLAYERS];
  74.     int nPlayer, nCard;
  75.    
  76.     srand(time(NULL));
  77.    
  78.     /* Имена для наглядности */
  79.     for ( nPlayer = 0; nPlayer < NUMBER_OF_PLAYERS; ++nPlayer )
  80.         sprintf(players[nPlayer].name, "Player #%d", nPlayer + 1);
  81.    
  82.     /* Раздача карт */
  83.     shuffle_deck();
  84.     for ( nCard = 0; nCard < CARDS_PER_PLAYER; ++nCard ) {
  85.         for ( nPlayer = 0; nPlayer < NUMBER_OF_PLAYERS; ++nPlayer ) {
  86.             if ( ! ( players[nPlayer].cards[nCard] = get_card() ) ) {
  87.                 fprintf(stderr, "ERROR! No more cards in deck!\n");
  88.                 exit(1);
  89.             }
  90.         }
  91.     }
  92.    
  93.     /* Сортировка и вывод карт у игроков до обмена + обмен */
  94.     printf("\nEnter string in form 00101 where 0 to keep card, 1 to change.\n\n");
  95.     for ( nPlayer = 0; nPlayer < NUMBER_OF_PLAYERS; ++nPlayer ) {
  96.         int cardsToChange;
  97.         printf("%s\n", players[nPlayer].name);
  98.         qsort(players[nPlayer].cards, CARDS_PER_PLAYER, sizeof(card_t*), compare_cards);
  99.         for ( nCard = 0; nCard < CARDS_PER_PLAYER; ++nCard )
  100.             print_card(players[nPlayer].cards[nCard]);
  101.         printf("\n> ");
  102.         scanf("%d", &cardsToChange);
  103.         for ( nCard = CARDS_PER_PLAYER - 1; nCard >= 0; --nCard, cardsToChange /= 10 ) {
  104.             if ( cardsToChange % 10 ) {
  105.                 if ( ! ( players[nPlayer].cards[nCard] = get_card() ) ) {
  106.                     fprintf(stderr, "ERROR! No more cards in deck!\n");
  107.                     exit(1);
  108.                 }
  109.             }
  110.         }
  111.         printf("\n");
  112.     }
  113.    
  114.     printf("\n\nAfter exchange:\n");
  115.     for ( nPlayer = 0; nPlayer < NUMBER_OF_PLAYERS; ++nPlayer ) {
  116.         int cardsToChange;
  117.         printf("%s\n", players[nPlayer].name);
  118.         qsort(players[nPlayer].cards, CARDS_PER_PLAYER, sizeof(card_t*), compare_cards);
  119.         for ( nCard = 0; nCard < CARDS_PER_PLAYER; ++nCard )
  120.             print_card(players[nPlayer].cards[nCard]);
  121.         printf("\n\n");
  122.     }
  123.    
  124.     exit(0);
  125. }

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

В данном коде реализована игра в покер. Изначально задаются параметры: количество игроков (не более 4), количество карт на каждого игрока (не более 5), количество карт в колоде (не более 52). Далее идет работа с картами. Код содержит функции для перемешивания колоды, получения карты из колоды, печати карты, а также функции для сравнения карт по значению и по масти. Затем идет работа с игроками. Каждый игрок имеет имя и массив карт. Карты раздаются игрокам случайным образом. После этого идет обмен карт между игроками. В конце программы происходит вывод карт каждого игрока и сообщение об успешном завершении игры.

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


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

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

9   голосов , оценка 4 из 5

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

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

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