как заполнить, перемешать, сдать карточную игру - PullRequest
1 голос
/ 08 августа 2010

У меня кое-как получилось, но у меня все еще проблемы с сортировкой и составлением пар, чтобы я мог определить победителя.

Соедините их (пары - карты с одинаковым значением). Например, туз червей и туз пиков составляют пару. Затем я считаю эти пары. рука с самыми высокими парами выигрывает.

Это было то, что я пытался создать для пары, но ... я все еще застрял в том, как я начинаю сравнение для создания пары.

Я ожидаю, что результаты будут для каждой руки:

Рука 1: Шесть пиков, черный Семерка бриллиантов, красная Восемь пик, черный Десять Червей, Красный Пиковая дама, черная Количество пар: 0

Рука 2: Три пики черные Пять бриллиантов, это красный Пятерка треф, черная Девять бриллиантов, красный Королева бриллиантов, красная Количество пар: 1 Самая высокая пара: Пять

       #include <stdio.h>
       #include <stdlib.h>
        #include <time.h>

    struct card { 
      const char *face;
     const char *suit;
        const char *color;
         };

       typedef struct card Card;
       typedef unsigned char pairs;

        void fillDeck( Card * const, const char *[], const char *[] ,const char *[]);
        void shuffle( Card * const );
     void print( const Card * const );
     pairs findpairs(card *hand);  /* finds any pairs in a hand */

  int main()
   {
     int hand,cd,winner;
     card hands[5][5],handssorted[5][5];
      pairs numpairs[5],highest;
      Card deck[52];
       const char *face[] = { "Ace", "Two", "Three", "Four", "Five","Six", "Seven",
                              "Eight", "Nine", "Ten","Jack", "Queen", "King"};
       const char *suit[] = { "Hearts", "Diamonds", "Clubs", "Spades"};
       const char *color[]= {"Black","Red"};
       srand( time( NULL ) );
       fillDeck( deck, face, suit, color );
       print( deck );
       printf("\n ----------------------------------------------------------           \n");
       shuffle( deck );
       print( deck );
       for(cd=0;cd<5;cd++)
    {

    }

   for(hand=0;hand<5;hand++)
    {
        /* sort the hands here */
        numpairs[hand]=findpairs(handssorted[hand]);
        printf("Hand %i:\n",hand+1);
        /* print the hands here */
        /* print the number and value of any pairs here */
   }

   /* determine the winner and print it */
     system("pause");
     return 0;

  }
        //-----------------------------------------------------------------------------         void fillDeck( Card * const wDeck, const char * wFace[], const char * wSuit[],  
     const char * wColor[])
     {
       int i;
       for ( i = 0; i <= 51; i++ ) { 
          wDeck[i].face  = wFace[ i % 13 ];
          wDeck[i].suit  = wSuit[ i / 13 ];
          wDeck[i].color = wColor[i%2];
      //    if ()
             //           wDeck[i].suit = wSuit[ i / 13 ];
              }
         }
       //------------------------------------------------------------------
       void shuffle( Card * const wDeck )
            {
       int i, j;
       Card temp;
       for ( i = 0; i <= 51; i++ ) { 
          j = rand() % 52;
          temp = wDeck[ i ];
          wDeck[ i ] = wDeck[ j ];
          wDeck[ j ] = temp;
             }
        }
    //---------------------------------
     void print( const Card * const wDeck )
     {
       int i;
       for ( i = 0; i <= 51; i++ ){
          printf( "\t%s\t of \t%-8s is \t%s \n \t", wDeck[i].face, 
                  wDeck[i].suit,wDeck[i].color,
                 ( i + 1 ) % 2 ? '\t' : '\n' );}
        }
      //--------------------------------------------------------------------------
          pairs findpairs(card *hand)
           {
            pairs numpairs=0;  
            for ( int i = 0; i <= 5; i++ ){
            if (hand[i].face == )

             }

      return numpairs;

        }

Ответы [ 3 ]

1 голос
/ 08 августа 2010

Это не ответ на ваш вопрос (я не совсем уверен, что вы спрашиваете), но я укажу, что ваш алгоритм тасования не является случайным.

Во-первых, используя % ограничение rand диапазоном значений обычно является плохой идеей.(См. Q13.16 из FAQ по comp.lang.c .)

Во-вторых, похоже, вы пытаетесь реализовать алгоритм перетасовки Фишера-Йейтса , но ваша реализация неверна.Легко видеть, что ваш подход к обмену ранее замененными элементами проблематичен;рассмотрите возможность перетасовки колоды из трех элементов {0, 1, 2}:

First iteration     Second iteration
------------------------------------
{ 0, 1, 2 }         { 1, 0, 2 }
                    { 0, 1, 2 }
                    { 0, 2, 1 }
------------------------------------
{ 1, 0, 2 }         { 0, 1, 2 }
                    { 1, 0, 2 }
                    { 1, 2, 0 }
------------------------------------
{ 2, 1, 0 }         { 1, 2, 0 }
                    { 2, 1, 0 }
                    { 2, 0, 1 }

Первый столбец представляет возможные состояния колоды после первой итерации (где вы меняете deck[0] на deck[rand() % 3]).

Во втором столбце представлены возможные состояния колоды после второй итерации (где вы меняете deck[1] на deck[rand() % 3]).

Существует 9 одинаково вероятных состояний - но это, очевидно, неправильно, поскольку должно быть только 3!= 6 перестановок.И действительно, несколько состояний дублируются, что означает, что они имеют более высокую вероятность возникновения.(Обратите внимание, что даже если бы я перешел к третьей итерации, в результате вы получили бы 27 состояний только для 6 перестановок, а поскольку 27 не делится на 6, вы бы в итоге имели некоторые состояния, возникающие чаще, чем другие.)

1 голос
/ 08 августа 2010
  • У вас есть вызов print(deck) сразу после srand(), который использует неинициализированный массив deck.
  • numpairs, findpairs и handssorted не определены
  • вы печатаете весь deck для каждой руки. Это действительно то, что вы намерены?
  • onst недействительно (предположительно, вы имели в виду const)
  • fillDeck() не заполняет .color член каждого Card
  • ваш алгоритм случайного выбора подозрительный. См. Фишер-Йейтс шаффл
  • в print(), вы используете спецификатор формата %c с типом const char *
0 голосов
/ 08 августа 2010

Я ожидаю, что результаты будут для каждой руки

Затем статически назначьте на руки нужные карты. В вашей модели каждая карта уже имеет уникальный номер от 0 до 51. Если колода и рука - это набор чисел, то операция так же проста, как удаление номера из одного набора и добавление его к другому.

Возможно, вы захотите реализовать функции для работы с такими int наборами, представляющими колоду, руки и т. Д.

j = rand ()% 52;

Если вы серьезно относитесь к созданию игры, вы можете проверить как генерировать случайные числа из диапазона тоже .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...