卡片组,无法弄清楚如何洗牌

时间:2013-02-26 20:40:51

标签: c++

我的代码已经制作了一副牌,但我该如何改变呢?我的随机播放功能似乎无法正常工作。 我可能在其他地方也有一些错误,如果你能看到它们,请告诉我。它编译并运行,但它按顺序列出了卡片。

#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;
}

3 个答案:

答案 0 :(得分: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();

为了记录,我真的不喜欢你,你把你的套牌安排为2D阵列。绝对没有必要这样做。我更喜欢DeckOfCards继承自Card

由于我在挑剔,你不需要一个整个甲板大小的数组用于你的临时交换变量。你只需要一个Card。实际上,您应该使用std::swap代替。

答案 1 :(得分:1)

除了其他答案之外,我认为您对套牌的初始分配不起作用。

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

您将每张卡片设置为'(脸,套装)'。那时候那是什么?我认为你的意思是将它们设置为'(i,j)'。我很惊讶这个编译,因为face和suit只被声明为卡片对象的属性。

答案 2 :(得分: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;
}