用 C++ 编写扑克手数计算器

Programming a Poker Hand Calculator in C++

我已经用 C++ 为 5 张扑克手牌计算器编写了几百行代码来练习使用 类。这是我编写的成员函数的一部分,用于比较两个都是 TwoPairs 的两只手。我已经彻底测试了我所有的布尔函数,除了用于比较 TwoPairs、OnePairs 和 HighCard 手牌的函数外,它们都能正常工作。

// If both hands are TwoPairs, the highest value pairs are compared.
else if (m_rank == TwoPair) {
  if (m_firstPairPoints > otherHand.m_firstPairPoints) {
    return 1;
  }
  else if (m_firstPairPoints < otherHand.m_firstPairPoints) {
    return -1;
  }
  // If the highest pairs are equal, the next lowest pairs are
  // compared.
  else if (m_firstPairPoints == otherHand.m_firstPairPoints) {
    if (m_secondPairPoints > otherHand.m_firstPairPoints) {
      return 1;
    }
    else if (m_secondPairPoints < otherHand.m_secondPairPoints) {
      return -1;
    }
    // If both pairs are equal, the kickers are compared.
    else if (m_secondPairPoints == otherHand.m_secondPairPoints) {
      if (m_lastCardPoints > otherHand.m_lastCardPoints) {
        return 1;
      } 
      else if (m_lastCardPoints < otherHand.m_lastCardPoints) {
        return -1;
      }
      else {
        return 0;
      }
    }
  }  
}

这是布尔函数本身,它为我在上面输入的比较函数片段中使用的成员变量设置值:

// Implementation of the isTwoPair bool function.
bool PokerHand::isTwoPair(){
  bool checkVar = true;

  // If the single card is the first element.
  if (m_cards[0].points() != m_cards[1].points() &&
      m_cards[0].points() != m_cards[3].points() &&
      m_cards[1].points() == m_cards[2].points() &&
      m_cards[3].points() == m_cards[4].points()) {
    m_rank = TwoPair;
    m_firstPairPoints = m_cards[3].points();
    m_secondPairPoints = m_cards[1].points();
    m_lastCardPoints = m_cards[0].points();
  }

  // If the single card is in the middle.
  else if (m_cards[0].points() == m_cards[1].points() &&
      m_cards[2].points() != m_cards[0].points() &&
      m_cards[2].points() != m_cards[3].points() &&
      m_cards[3].points() == m_cards[4].points()) {
    m_rank = TwoPair;
    m_firstPairPoints = m_cards[3].points();
    m_secondPairPoints = m_cards[0].points();
    m_lastCardPoints = m_cards[2].points();
  }

  //If the single card is the last element.
  else if (m_cards[0].points() == m_cards[1].points() &&
      m_cards[2].points() == m_cards[3].points() &&
      m_cards[4].points() != m_cards[0].points() &&
      m_cards[4].points() != m_cards[2].points()) {
    m_rank = TwoPair;
    m_firstPairPoints = m_cards[2].points();
    m_secondPairPoints = m_cards[0].points();
    m_lastCardPoints = m_cards[4].points();
  }
  else {
    checkVar = false;
  }
  return checkVar;
}

所以现在我的问题是,对于 TwoPair、OnePair 和 HighCard 手牌,无论我做什么,我的测试 cpp 文件总是输出同一手牌获胜(总是 returns 1)当他们属于这三个等级之一。可以这么说,即使我公然堆放甲板。几个小时以来一直在尝试不同的东西,我不太确定发生了什么。我什至尝试从头开始多次重写这三个等级的比较函数的 3 个片段。非常欢迎大家提供任何提示。另外,请记住,如果不是很明显,我仍然是一个新手,并且我被允许用于该项目的内置函数有限制。

你让自己太难了。你错过了一个中间步骤:计算你在每个等级中有多少张牌,忽略花色。所以你得到一个 std::array<int, 13> ranktotal(或者 int [13] 如果你的 teacher/book 已经过时)。

一旦你有了它,“2 对”手牌就是 2-2-1 的排列模式,你可以很容易地找到前 2 个。同样,葫芦是 2-3。顺子是一系列 5 个,中间没有 0。