似乎有两种方法可以在 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;
}
}
我应该仍然使用第一种方式还是有办法获得两者的优势?