将卡的等级和适合度编码为单个整数值

时间:2013-11-12 20:02:51

标签: c++

所以我必须基本上将卡的等级和套装编码为单个整数值。所以,例如,我必须让它说“七心”而不仅仅是“7”进入我正在制作的纸牌游戏中。

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

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

3 个答案:

答案 0 :(得分: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_from_card(int card)     {         return(Suit)(card&amp; 0x0000ffff);     }

Rank rank_from_card(int card)
{
    return (Rank) ((card & 0xffff0000) >> 16);
}

答案 1 :(得分:0)

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

Suit theSuit = cardValue & 0x03;
Rank theRank = cardValue >> 2;

答案 2 :(得分:0)

你可以用单个字节来完成。由于Rank有四种可能性,卡有13种可能性:例如

为Rank和。保留字节中的第一个半字节 为卡片保留第二个半字节。

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

Card的第二个半字节:由于有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)