德州扑克直接检查值

时间:2016-07-04 00:38:30

标签: c++ arrays

我有一个小问题,在七张牌手中评估一个直线,你想要获得最高的5张牌。

只要手中没有一对,我就可以获得最高的5张牌,例如:

洞牌:2小时,3d
社区卡:4h,5s,6s,8d,9d,
输出:2h,3d,4h,5s,6s

因为直线内没有对,所以它很好并且输出很好。 当直线内有一对时会出现问题 例如:

洞牌:2小时,3d,
社区卡:4h,4c,5s,6s,8d
输出:2h,3d,4h,4c,5s

所以它正在计算直线对,我需要一种方法来跳过其中一对配对卡并只选择一个。这也发生在3种情况中。

这对我来说完全有意义,为什么它这样做,但对于我的生活,我无法想出一种方法来解决它。

这是功能:

bool Player::checkForStraight()
{
//Loops through the ranks from greatest to least 0 is NONE is the enum class
for (int i = FACES; i >= 1; i--)
{
    //Checks to see if a straight exists (_checkNumfaces is an array[13] to
    //hold the amount of each card
    if ((_checkNumFaces[i - 1] >= 1) && (_checkNumFaces[i - 2] >= 1) &&
        (_checkNumFaces[i - 3] >= 1) && (_checkNumFaces[i - 4] >= 1) &&
        (_checkNumFaces[i - 5] >= 1))
    {
        //If a straight exists loop through the cards(sorted in another 
        //function from lowest to highest
        for (int j = 6; j >= 0; j--)
        {
                //if the face matches the enum value of i then we have a
                //straight there down because I checked if the straight
                //existed already
                if ((*p_playerHand[j])->face == (Face)(i))
                {
                    //PlayerHighCards out of the seven
                    p_playerHighFive[4] = p_playerHand[j];
                    p_playerHighFive[3] = p_playerHand[j - 1];
                    p_playerHighFive[2] = p_playerHand[j - 2];
                    p_playerHighFive[1] = p_playerHand[j - 3];
                    p_playerHighFive[0] = p_playerHand[j - 4];
                    return true;
                }
            }
    }
}
return false;
}

很抱歉底部的伪劣格式,但它只有花括号,我们的代码就可以了。

我知道如何检查A,2,3,4,5直接我刚刚编码,我真的很难过如何移过我所关注的一对。它不仅仅是成对,这也发生在3种类型中(因此如果在直线中有3种类型)或者多于一对,那么2对。不会在这之外发生,因为没有足够的卡可以关注它。

很抱歉,如果我的代码不那么优雅,如果有更好的方法,请告诉我。我已经学习了模板或stl,因为我刚开始使用这种语言,所以不使用这些的解决方案会很棒。

我试图尽可能地描述,但是,我是新手,所以如果你有任何问题,请问:)

这是计算牌组中不同牌的功能

    void Player::countNumFaces(const int& size)
{

for (int i = 0; i < (size); i++)
{
    switch((*p_playerHand[i])->face)
    {
    case Face::NONE:    std::cout << "Joker" << std::endl;
    case Face::TWO:     _checkNumFaces[0]  ++;  break;
    case Face::THREE:   _checkNumFaces[1]  ++;  break;
    case Face::FOUR:    _checkNumFaces[2]  ++;  break;
    case Face::FIVE:    _checkNumFaces[3]  ++;  break;
    case Face::SIX:     _checkNumFaces[4]  ++;  break;
    case Face::SEVEN:   _checkNumFaces[5]  ++;  break;
    case Face::EIGHT:   _checkNumFaces[6]  ++;  break;
    case Face::NINE:    _checkNumFaces[7]  ++;  break;
    case Face::TEN:     _checkNumFaces[8]  ++;  break;
    case Face::JACK:    _checkNumFaces[9]  ++;  break;
    case Face::QUEEN:   _checkNumFaces[10] ++;  break;
    case Face::KING:    _checkNumFaces[11] ++;  break;
    case Face::ACE:     _checkNumFaces[12] ++;  break;
    }
}

std::cout << "| 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 | 10 || J || Q || K || A |" << std::endl;      //Print for testing
for (int i = 0; i < FACES; i++) { std::cout << "| " << _checkNumFaces[i] << " |"; }                  //Print for testing
}

1 个答案:

答案 0 :(得分:0)

而不是

p_playerHighFive[4] = p_playerHand[j];
p_playerHighFive[3] = p_playerHand[j - 1];
p_playerHighFive[2] = p_playerHand[j - 2];
p_playerHighFive[1] = p_playerHand[j - 3];
p_playerHighFive[0] = p_playerHand[j - 4];
return true;

int k = 4;
int l = 0;

p_playerHighFive[k] = p_playerHand[j-l]; 
k--;
l++;

while(k>=0)
{
    if( isSameValue(p_playerHighFive[k+1], p_playerHand[j-l]) ) //check if card has same value
    {
        l++;
        continue;
    }

    p_playerHighFive[k] = p_playerHand[j-l];
    k--;
    l++;

}
相关问题