2013-02-26 63 views
0

我的代碼已經使得撲克牌,但我怎麼洗牌呢?我的shuffle功能似乎不起作用。 我可能在其他地方也有一些錯誤,如果你能看到它們,請讓我知道。它編譯並運行,但它按順序列出了卡片。甲板的卡,不能弄清楚如何洗牌

#include <iostream> 
#include <string> 
#include <ctime> 
#include <vector> 
using namespace std; 

class Card{ 
public: 
    int face; 
    int suit; 
    void setData(int f, int s){ 
     face = f; 
     suit = s; 
    } 
    string toString(int F, int S){ 
     static string faces[13] = {"Two", "Three", "Four", "Five", "Six", "Seven",  "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace"}; 
     static string suits[4] = {"Clubs", "Spades", "Diamonds", "Hearts"}; 
     string FandS = faces[F] + " of " + suits[S] + "\n"; 
     return FandS; 
    } 
}; 

class DeckOfCards:public Card{ 
public: 
    Card deck[13][4]; 
    int currentCard; 

    void shuffle(){ 
     srand (time(0)); 
     Card temp[13][4]; int R, r; 
     for(int shuf=0; shuf<52; shuf++){ 
      for(int i=0; i<13; i++){ 
       for(int j=0; j<4; j++){ 
        R = rand()%13; 
        r = rand()%4; 
        temp[i][j] = deck[i][j]; 
        deck[i][j] = deck[R][r]; 
        deck[R][r] = temp[i][j]; 
       } 
      } 
     } 
    } 

    bool moreCards(){ 
     currentCard=52; 
     currentCard--; 
     if(currentCard>0){ 
      return true; 
     }else 
      return false; 
    } 

    void dealCard(){ 
     for(int i=0; i<13; i++){ 
      for(int j=0; j<4; j++){ 
       cout << toString(i, j); 
      } 
     } 
    } 

    DeckOfCards(){ 
     for(int i=0; i<13; i++){ 
      for(int j=0; j<4; j++){ 
       deck[i][j].setData(face, suit); 
      } 
     } 
    } 

}; 

int main(){ 
    DeckOfCards myDeck; 
    myDeck.shuffle(); 
    myDeck.dealCard(); 
    return 0; 
} 
+2

'的std :: random_shuffle()'通常是一個很大的可能性。 – WhozCraig 2013-02-26 20:41:56

+4

你是什麼意思「它不工作」?這些卡片不是隨機排列的?這些卡片根本不存在?重複卡​​片?程序崩潰? – chrisaycock 2013-02-26 20:43:10

+0

你的卡片初始化不正確,也不是你的Card :: toString()成員。 – WhozCraig 2013-02-26 20:51:09

回答

2

這是你的卡是爲了「處理」的原因:

void dealCard(){ 
    for(int i=0; i<13; i++){ 
     for(int j=0; j<4; j++){ 
      cout << toString(i, j); 
     } 
    } 
} 

不要使用甲板上的。您只需按順序打印出來。

試試這個:

cout << toString(deck[i][j].face, deck[i][j].suit); 

你真的應該寫一個Card::toString函數不帶任何參數,讓它使用其facesuit成員。

cout << deck[i][j].toString(); 

爲了記錄在案,我真的不喜歡你,你安排你的甲板作爲一個二維數組。絕對沒有必要這樣做。我更喜歡DeckOfCards繼承自Card

由於我挑剔,你並不需要爲您的臨時交換可變整個甲板大小的數組。你只需要一個Card。事實上,你應該使用std::swap來代替。

+1

非常感謝,幫助了很多,對不起,如果我的代碼讓你失望大聲笑。我不是很懂電腦的人 – user2112867 2013-02-26 21:15:26

+0

沒問題。堅持下去,你最終會減少錯誤,或者至少培養自己找到和糾正錯誤的能力。快樂的編碼! – paddy 2013-02-26 23:26:47

0

我建議你避免使用數組並使用std::vector,並且使用std::random_shuffle來洗牌。

這裏是快速編輯我對你的代碼做給你看它是如何做

#include <ctime> 
#include <vector> 
#include <algorithm> 

using namespace std; 

class Card{ 
public: 
    int face; 
    int suit; 
    void setData(int f, int s){ 
     face = f; 
     suit = s; 
    } 
}; 

class DeckOfCards:public Card{ 
public: 
    std::vector<Card> deck; 

    void shuffle(){ 
     srand (time(0)); 
     std::random_shuffle(deck.begin(), deck.end()); 
    } 

    DeckOfCards(){ 
     deck.reserve(13 * 4); 
     for(int i=0; i<13; i++){ 
      for(int j=0; j<4; j++){ 
       Card card; 
       card.setData(i, j); 
       deck.push_back(card); 
      } 
     } 
    } 

}; 

int main(){ 
    DeckOfCards myDeck; 
    myDeck.shuffle(); 
    return 0; 
} 
+0

我的教授還沒有教導我們使用矢量,所以這是希臘人對我哈哈。謝謝,雖然 – user2112867 2013-02-26 21:16:28

1

除了其他的答案,我覺得你在甲板上的初始分配不工作。

DeckOfCards(){ 
    for(int i=0; i<13; i++){ 
     for(int j=0; j<4; j++){ 
      deck[i][j].setData(face, suit); 
     } 
    } 
} 

您正在將每張卡設置爲'(face,suit)'。這是什麼?我想你的意思是把它們設置爲'(i,j)'。我很驚訝這個編譯,因爲面和西裝只被宣佈爲卡對象的屬性。

+0

謝謝,這讓我感到非常愚蠢的笑聲。儘管我現在已經開始工作了。 – user2112867 2013-02-26 21:15:47