2010-08-08 96 views
1

我有些如何得到它的工作,但我仍然有排序和製作對的問題,以便我可以確定贏家。如何填充,洗牌,處理紙牌遊戲

將它們配對(對具有相同價值的卡片)。例如心形王牌&黑桃王牌成對。 然後我計算這些對。最高雙手勝。

這就是我正在嘗試配對,但..我仍然rellyy堅持我如何開始比較,使配對。

這是我所期望的結果是,每手的方式:

手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; 

     } 
+1

西裝和顏色不是獨立的。 – 2010-08-08 01:32:46

+0

請了解如何正確設置您的文章的格式。 http://stackoverflow.com/editing-help – spender 2010-08-08 01:33:31

+0

你告訴我們預期的結果,但不是什麼實際結果。 – zneak 2010-08-08 01:41:47

回答

1
  • 你必須print(deck)來電有srand()它使用未初始化deck陣列之後。
  • numpairsfindpairshandssorted是不確定的
  • 要打印每手整個deck。那真的是你想要的嗎?
  • onst是無效的(假設你的意思const
  • fillDeck()每個Card
  • 您的洗牌算法的.color成員未完全填滿的嫌疑。見Fisher-Yates shuffle
  • print()
  • ,您使用的是%c格式說明與const char *
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整除,所以最終會出現比其他狀態更多的狀態。)

0

這是我所期望的結果是,每手

然後靜態分配到手上所需卡的方式。在你的模型中,每張卡片都有從0到51的唯一數字。如果卡片和手都是數字組,那麼操作就像從一組中刪除數字並將其添加到另一組一樣簡單。

你可能想實現的功能與這樣int套,佔甲板,手等工作

J =蘭特()%52;

如果您認真製作遊戲,您可能需要檢查how to generate random numbers from a range too