【问题标题】:how to fill, shuffle, deal the card game如何填充,洗牌,发牌游戏
【发布时间】:2011-03-26 20:29:52
【问题描述】:

我知道它是如何工作的,但我仍然对排序和配对有问题,以便我可以确定获胜者。

将它们配对(对是具有相同价值的牌。)例如,红桃 A 和黑桃 A 组成一对。 然后我数那些对。拥有最高对子的手获胜。

这是我为配对而尝试的,但.. 我仍然坚持我如何开始比较以进行配对。

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

第一手: 黑桃六,是黑色的 钻石七,是红色的 黑桃八,是黑色 红心十,是红色的 黑桃皇后是黑色的 对数: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;

        }

【问题讨论】:

  • 西装和颜色不是独立的。
  • 请了解如何正确格式化您的帖子。 stackoverflow.com/editing-help
  • 您告诉了我们预期的结果,但没有告诉我们实际结果。
  • 这是您的完整代码吗? handssorted 是什么?而“方块黑七”、“黑桃红八”等就没有意义了。
  • 我建议你再抽象一个层次,即 CardDeck 然后在 CardDeck 上有方法来初始化和洗牌等。最好使用 std::string 而不是指向带有卡名等的字符串的指针.

标签: c


【解决方案1】:
  • 在使用未初始化的deck 数组的srand() 之后立即调用print(deck)
  • numpairsfindpairshandssorted 未定义
  • 您正在为每只手打印整个deck。这真的是你想要的吗?
  • onst 无效(大概你的意思是const
  • fillDeck() 没有填写每个Card.color 成员
  • 您的随机播放算法有问题。见Fisher-Yates shuffle
  • print() 中,您使用%c 格式说明符和const char * 类型

【讨论】:

    【解决方案2】:

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

    首先,使用%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 个排列。事实上,有几个状态是重复的,这意味着它们发生的概率更高。 (请注意,即使我已经进行了第三次迭代,你最终会得到 27 个状态,但只有 6 个排列,并且由于 27 不能被 6 整除,你显然最终会出现一些状态比其他状态更多。)

    【讨论】:

      【解决方案3】:

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

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

      您可能希望实现函数来处理此类int 集合,代表牌组、手牌等。

      j = rand() % 52;

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

      【讨论】:

        猜你喜欢
        • 2018-04-02
        • 2020-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        相关资源
        最近更新 更多