如何填充,洗牌,处理纸牌游戏

时间:2010-08-08 01:27:31

标签: c

我有些工作如何,但我仍然有排序和制作对的问题,以便我可以确定胜利者。

配对它们(对是具有相同值的卡片)。例如,心灵之王&黑桃王牌搭配一对。 我然后计算那些对。最高配对的胜利。

这就是我试图配对的原因,但是我仍然坚持不懈地开始比较以进行配对。

这是我期望结果为每一手牌的方式:

手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 个答案:

答案 0 :(得分:1)

  • 在使用未初始化的print(deck)数组的srand()之后,您立即致电deck
  • numpairsfindpairshandssorted未定义
  • 您正在为每只手打印整个deck。这真的是你想要的吗?
  • onst无效(可能是您的意思const
  • fillDeck()未填写每个.color
  • Card成员
  • 您的随机播放算法很可疑。请参阅Fisher-Yates shuffle
  • print()中,您使用%c格式说明符const char *类型

答案 1 :(得分:1)

这不是你问题的答案(我实际上不确定你在问什么),但我会指出你的改组算法不是随机的。

首先,使用%rand限制为一系列值通常是一个坏主意。 (见Q13.16 from the comp.lang.c FAQ。)

其次,看起来您可能正在尝试实施Fisher-Yates shuffling algorithm,但您的实施是错误的。很容易看出你使用以前交换元素进行交换的方法存在问题;考虑改组三个元素{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个排列。事实上,有几个州是重复的,这意味着他们有更高的发生概率。 (请注意,即使我已经进行了第三次迭代,你最终只有6个状态的27个状态,并且因为27不能被6整除,所以你最终会看到一些状态比其他状态更多。)

答案 2 :(得分:0)

  

这是我期望每只手的结果的方式

然后静态分配所需的牌。在你的模型中,每张卡片都有从0到51的唯一编号。如果牌组和手牌都是一组数字,那么操作就像从一组中删除数字并将其添加到另一组中一样简单。

您可能希望实现函数以使用此类int集合,代表套牌,手牌等。

  

j = rand()%52;

如果您认真制作游戏,可能需要查看how to generate random numbers from a range too