0

所以我必须基本上将一张牌的等级和花色都编码成一个整数值。例如,在我正在制作的纸牌游戏中,我必须让它说“红心七”而不是“7”。

enum Suit {Hearts, Diamonds, Clubs, Spades};
enum Rank {A, K, Q, J, _10, _9, _8, _7, _6, _5, _4, _3, _2};

所以我现在有了。我只是将它们放入枚举中。我不确定它是否会起作用。我将如何以某种方式基本上将这两个字符串组合成一个整数值?所以就像,我需要让它说“红心七”。我需要一个 for 循环来组合它们吗?

4

3 回答 3

0

你可以用单字节来做。由于Rank有四种可能性,而卡片有13种可能性:例如

为 Rank 保留第一个字节,为 Card 保留第二个字节。

Say: 0x1 << 0 = Hearts, 
     0x1 << 1 = Diamonds, 
     0x1 << 2 = Clubs, 
     0x1 << 3 = Spades.

卡片的第二个半字节:因为有 13 种可能性,所以用从 0x0 到 0xD 的数字表示它们。

 For example:
              ox1 = A, o2 = 2, ox3 = 3, and so on.

所以完整的图片看起来像:

For Seven of heart:    0001, 0111(0x17)
For Three of Diamonds: 0010, 0011(0x23) 
于 2013-11-12T20:29:51.620 回答
0

您可以在 int 中使用不同的位位置来表示 2 个部分。例如,您可以使低 2 位为花色,其余位为牌值。从名为的整数参数获取完整卡名的函数cardValue可能包含以下内容:

Suit theSuit = cardValue & 0x03;
Rank theRank = cardValue >> 2;
于 2013-11-12T20:21:08.643 回答
0

首先,没有必要。组合成一个整数不会节省太多空间。只需创建一个结构来表示一张卡片:

struct card {
    Suit m_suit;
    Rank m_rank;
};

如果你真的想组合成一个整数(或者只是为了学习如何去做),你可以使用整数的低 16 位来存储花色,使用高 16 位来存储等级。这当然假设 int 是 32 位:

int card_from_rank_and_suit(Suit suit, Rank rank)
{
    return ((int)suit) & ((int)rank << 16);
}

并读回花色和等级值: Suit suit_from_card(int card) { return (Suit) (card & 0x0000ffff); }

Rank rank_from_card(int card)
{
    return (Rank) ((card & 0xffff0000) >> 16);
}
于 2013-11-12T20:16:39.643 回答