德州持有直接止回阀值

Texas holdem straight check values

本文关键字:止回阀      更新时间:2023-10-16

我在评估七张牌的直牌时遇到了一个小问题,你想要得到最高的5张牌。

我可以直接拿到最高的5张牌,只要手里没有一对,例如:

孔卡:2h,3d
社区卡:4h、5s、6s、8d、9d、
输出:2 h、3 d、4 h, 5 s, 6 s

因为直线内没有对,所以它计数和输出都很好。当直线内有一对时,问题就出现了例如:

孔卡:2h, 3d,
社区卡:4h、4c、5s、6s、8d
输出:2 h、3 d、4 h, 4 c, 5 s

所以它是在直线上数成对的牌,我需要一种方法跳过一对牌中的一张,只选择一张。同样的情况也会发生。

它为什么这样做对我来说是完全有意义的,但是对于我的生命,我想不出一个方法来修复它。

函数如下:

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
}

代替

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++;
}