1

似乎有两种方法可以在 C++ 中表示一张卡片。

显而易见的方法是:

const int numCards = 52;
const int numRanks = 13;
const int numSuits = 4;

enum Suit {
    HEARTS  = 1;
    DIAMOND = 2;
    SPADES  = 3;
    CLUBS   = 4;
}

card Class {
    private:
        const Suit suit;
        const int rank;

    public:
        /// Constructor
        Card(int rank, Suit suit)

        /// Get rank between 1 and 13
        int getRank();

        /// Get suit
        Suit getSuit();

        /// Get string representation
        std::string toString();
};

还有另一种方法是用一个字节表示整张卡片。

namespace Cards {
    typedef byte Card;

    /// Constructor
    Card getCard(int rank, Suit suit); // return (rank - 1) + numRanks * (suit - 1);

    /// Validity check
    boolean isValid(Card);

    /// Get a rank between 1 and 13
    int getRank(Card); // return 1 + (card % numRanks);

    /// Get suit
    Suit getSuit(Card); // return 1 + (card // numSuits)

    /// Get string representation
    std::string toString(Card);
};
typedef Cards::Card Card;

第一个似乎更明显,优点是卡有自己的类型。这使它更安全,因为它不能与其他类型混淆。另一方面,第二种表示是内存高效的,并且使一些操作相对容易。例如,创建甲板可以通过

void initializeDeck(Card[] deck) {
    // Pre: sizeof(deck) >= 52!!!

    // No need to iterate over both rank and suit!!!
    for(Card card = 0; card < numCards; card++) {
        deck[card] = card;
    }
}

我应该仍然使用第一种方式还是有办法获得两者的优势?

4

1 回答 1

5

另一种选择是使用位域。

struct Card {
    unsigned char suit:2;
    unsigned char rank:6;
};

然后,您可以像访问任何其他成员变量一样访问组件。

Card card;
card.suit = HEARTS;
card.rank = 5;

您还可以添加其他方法Cardstruct 来添加字符串序列化等内容。

作为一个简短的说明,我会将你的西装从 0 到 3 编号,这样它们就可以适合 2 位而不是 3 位。

于 2014-05-27T18:09:25.197 回答