2013-02-26 2 views
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; 
} 
+2

'std :: random_shuffle()' обычно является сильной возможностью. – WhozCraig

+4

Что значит «это не работает»? Карты не в случайном порядке? Карты вообще не существуют? Дублированные карты? Сбой программы? – chrisaycock

+0

Инициализация вашей колоды также неверна, а также ваш член Card :: toString(). – WhozCraig

ответ

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 функцию без параметров и пусть использовать его face и suit членов.

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

Для записи, я действительно не люблю вас, вы устроили свою колоду как 2D-массив. Абсолютно не нужно этого делать. И мне нравится еще меньше того, что DeckOfCards наследует от Card.

Поскольку я ничтожный, вам не нужен массив размером в колоду для вашей временной переменной swap. Вам просто нужен один Card. Фактически, вместо этого вы должны использовать std::swap.

+1

Спасибо, что много помогли, извините, если мой код разочаровал вас. Я не очень разбираюсь в компьютерах – user2112867

+0

Нет проблем. Придерживайтесь этого, и вы в конечном итоге сделаете меньше ошибок или, по крайней мере, разработаете абстиненцию, чтобы найти и исправить ошибки самостоятельно. Счастливое кодирование! – paddy

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

Мой профессор еще не научил нас использовать векторы, но это греческий для меня LOL. Спасибо anyways хотя – user2112867

1

В дополнение к другим ответам, я думаю, что ваше первоначальное назначение палубы не работает.

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

Вы устанавливаете каждую карту на «(лицо, костюм)». Что это такое? Я думаю, вы хотите установить их на «(i, j)». Я удивлен, что это компилируется, потому что лицо и костюм объявляются только как свойства объекта карты.

+0

Спасибо, что заставило меня почувствовать себя действительно глупым lol. Но теперь я работаю. – user2112867

Смежные вопросы