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

How to generate a deck of cards in c++?

本文关键字:一副 c++      更新时间:2023-10-16

我正在尝试用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];
}

最终的结果是,我希望能够将值的枚举传递给函数。这样做现在会产生错误"在')'标记之前需要主表达式"。你知道我做错了什么吗?

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

您可以将卡片编号从0到53。包是包含从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} 提供索引

只对卡的数据使用整数一定更简单。很容易将其转换为数字或名称。

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