如何在c ++中生成一副牌?

时间:2014-11-03 00:40:57

标签: c++

我正在尝试用C ++制作卡片组。我这样做的方法如下: - 每张卡都需要套装和价值 - 每套西装需要13张卡

所以我决定做的是有一个前缀(套装)和一个后缀(值)。然后我会为每个套装生成13个值,并将值存储在数组中。我的问题是我目前的设置只输出" T"。这是当前的代码:

的main.cpp

#include <iostream>
#include <string>

enum cardValues{joker, ace, two, three, four, five, six, seven, eight, nine, ten};

struct card
{
    int value;
    char suit;
};

class CardDeck
{
    public:
        void create_deck(char prefix, int suffix);
        std::string deckOfCards[51];
};

void CardDeck::create_deck(char prefix, int suffix)
{
    char cardPrefix = prefix;
    int cardSuffix = suffix;

    std::string finalCard;

    for(int numberOfCardsProcessed = 0; numberOfCardsProcessed < sizeof(cardValues); numberOfCardsProcessed++){
        finalCard = cardPrefix + cardSuffix;
        deckOfCards[numberOfCardsProcessed] = finalCard;
    }
}

int main()
{
    CardDeck CD;

    card spades;
    card diamonds;
    card clubs;
    card hearts;

    spades.suit = 'S';
    diamonds.suit = 'D';
    clubs.suit = 'C';
    hearts.suit = 'H';

    CD.create_deck(spades.suit, 1);
    std::cout << CD.deckOfCards[0];
}

最终结果是我希望能够将枚举值传递给函数。现在这样做会产生错误&#34;预期的主要表达式在&#39;)之前#39;令牌&#34 ;.知道我做错了什么吗?

3 个答案:

答案 0 :(得分:2)

向char添加整数时,将字符更改为其他字符。我认为你正在尝试连接,这需要某种字符串。

答案 1 :(得分:0)

您可以将卡片编号从0到53。 pack是一个包含0到53之间所有数字的向量。每个数字只允许一次。

现在我们拿卡n

如果n是52或53则是小丑

剩余的卡片:

卡值应该是n % 13

的结果

您获得的数字应该为数组{2,3,4,5,6,7,8,9,10,J,Q,K,A}

提供索引

卡片类型应该是n / 13

的结果

您获得的数字应该为数组{spade,heart,diamond,club}

提供索引

答案 2 :(得分:0)

使用整数表示卡的数据必须更简单。将其转换为数字或名称很容易。

#include <iostream>
#include <random>
#include <algorithm>
#include <chrono>

class Card {
public:
  static const int NUMSUITS = 4;
  static const int NUMVALUES = 13;
  Card() { num = nextNum++; }
  int   nSuit()  { return num / NUMVALUES; }
  int   nValue() { return num % NUMVALUES + 1; }
  const char *sSuit()  { return suits[nSuit()]; }
  const char *sValue() { return values[nValue() - 1]; }
  void  print()  { std::cout << sValue() << " of " << sSuit(); }
  void  set(int n) { num = n; }
private:
  int num;
  static int nextNum;
  static const char *suits[NUMSUITS];
  static const char *values[NUMVALUES];
};

int Card::nextNum = 0;

const char *Card::suits[Card::NUMSUITS] = {
    "Clubs", "Hearts", "Diamonds", "Spades"
};
const char *Card::values[Card::NUMVALUES] = {
    "Ace", "Two", "Three", "Four", "Five", "Six", "Seven",
    "Eight", "Nine", "Ten", "Jack", "Queen", "King"
};

class Deck {
public:
  static const int NUMCARDS = Card::NUMSUITS * Card::NUMVALUES;
  Deck() : top(0) {
    seed = std::chrono::system_clock
              ::now().time_since_epoch().count();
  }
  void shuffle() {
    std::shuffle(cards, cards + NUMCARDS,
                 std::default_random_engine(seed));
  }
  Card nextCard() {
    if (top >= NUMCARDS) {;} // error
    return cards[top++];
  }
private:
  Card cards[NUMCARDS];
  int top;
  unsigned seed;
};

int main() {
  Deck deck;
  deck.shuffle();
  for (int i=0; i<Deck::NUMCARDS; i++) {
    Card c = deck.nextCard();
    c.print();
    std::cout << '\n';
  }
  return 0;
}