2011-07-08 15 views
0

下面的程序假設要尋找「Pair's」和「Flush's」。它反覆進行10次由10,000手組成的試驗,每隻手由5張牌組成。結果應該(當然不是現在)由10行反映每個試驗的獨特結果。我卡住了...先謝謝了。C++需要幫助迭代通過卡片,找到對和沖洗的

#include "card.h" 
#include "deck.h" 
#include "game1.h" 
#include <iostream> 
#include <time.h> 
#include <stdlib.h> 

using namespace std; 


int main() { 

int pair = 0; 
int flush = 0; 
int h; //Hands 
int c; //Cards 
int t; //Trials 

const int MAXTRIALS = 10; 
const int MAXHANDS = 10000; 
const int MAXCARDS = 5; 
const int MAXSHUFFLE = 100; 

Deck myDeck; 
Card myCards[MAXCARDS]; 
myDeck.shuffle(MAXSHUFFLE);       //How often would you shuffle? 

srand((unsigned)time(NULL));      //Randon initilizer 

for (t = 0 ; t < MAXTRIALS; ++t)     //Outermost loop for the Trials 
{ 

    for (h = 0; h < MAXHANDS; ++h)     //InnerLoop for Hands 
    { 

     myCards[0] = myDeck.getCard(); 
     for (c = 1; c < MAXCARDS; ++c)    //InnerMost Loop for Cards 
     { 
      myCards[c] = myDeck.getCard(); 
      if (myCards[c].getValue() == myCards[0].getValue()) 
      { 
       pair++;     
      } 

      if (myCards[c].getSuit() == myCards[0].getSuit()) 
      { 
       flush++;       
      } 

      myDeck.addCard(myCards[c]); 
      c++; 

     } 
     myDeck.shuffle(MAXSHUFFLE); 
     h++; 
    } 

    cout << "pairs: " << pair << "\tflushes: " << flush << endl; 

} 
cin.get(); 
} 

enter image description here

+1

試過調試嗎? – littleadv

+2

我覺得如果使用幾個函數而不是三重嵌套的'for'循環,這將更容易解決 –

回答

0

有了很多猜測究竟會發生什麼的...

1)它確信,那myDeck.getCard()不畫在同一張卡的兩倍?或者對你的任務無關緊要?

2)什麼是myDeck.addCard(myCards[c])究竟在做什麼?

3)爲什麼你第二次增加循環計數器? c++

如果確定這一點,您只是比較第一張卡片。如果你想比較完整的手,你的代碼應該是這個樣子:

// first draw the complete hand 
for(int card = 0; card < MAX_CARDS; ++card) 
{ 
    myCards[card] = myDeck.getCard(); 
} 
// now that we have the full hand, compare each card against each other card 
for(int start = 0; start < MAXCARDS-1; ++start) 
{ 
    for(int compare = start+1; compare < MAXCARDS; ++compare) 
    { 
     if (myCards[start].getValue() == myCards[compare].getValue()) 
     { 
      pair++ 
     } 
     // do similar for flushs 
    } 
} 

我沒有測試這個代碼,但是這應該給你一個起點。

這將計算每一對,即使一隻手中有兩對。如果找到一對,它將需要額外的代碼來打破循環。

BTW:看起來像功課,我...

0

c++h++是一點點可疑的(你真的要只觸及每其他項目)?但是,如果沒有更多關於你所觀察的信息,就很難給出明確的答案。

此外,關於你的代碼稍作文體建議:

  1. 我建議推遲的「H」,「C」和「T」到需要在他們的第一個點的申報,所以我會在for循環中聲明它們(例如「for(int h = 0; h < ...; h ++)」)。
  2. 在C++代碼(即srand(static_cast(time(NULL))))中使用static_cast比使用C風格轉換更爲習慣,但兩種形式都是正確的。
1

如果我明白你的問題,「結果應該......由10行反映了每次試驗的獨特成果」,這個問題很簡單,你不在每次試驗之間重置pairflush計數器變量。像'試驗'for循環開始應該這樣做:

for (t = 0 ; t < MAXTRIALS; ++t) 
{ 
    pair = 0; 
    flush = 0; 

    // the remainder as is...