0

私のコードはすでにカードのデッキを作成していますが、どうすればそれをシャッフルできますか? シャッフル機能が動作していないようです。他にも間違いがあるかもしれませんが、見れたら教えてください。コンパイルして実行しますが、カードを順番にリストします。

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

3 に答える 3

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

私は細かいことを考えているので、一時的なスワップ変数にデッキサイズの配列全体は必要ありません。必要なのは 1 つだけですCard。実際、std::swap代わりに使用する必要があります。

于 2013-02-26T20:48:15.143 に答える
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 はカード オブジェクトのプロパティとしてのみ宣言されているため、これがコンパイルされることに驚きました。

于 2013-02-26T20:58:08.720 に答える
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;
}
于 2013-02-26T20:49:55.017 に答える