用 pokerstove 圣化手不能按预期工作

canonizing hands with pokerstove does not work as expected

在使用 pokerstove 库 (https://github.com/andrewprock/pokerstove) 时,我 运行 遇到了以下关于卡组规范化的问题。

这里有一段简短的代码片段可以说明我的情况:

#include <iostream>
#include <pokerstove/peval/CardSet.h>

using namespace std;
using namespace pokerstove;

int main() {
  CardSet hand1("2c3c"), hand2("2d4c"), hand3("2h4c");
  cout << hand1.str() << endl;

  hand2 = hand2.canonize(hand1);
  hand3 = hand3.canonize(hand1);

  cout << hand2.str() << endl;
  cout << hand3.str() << endl;

  return 0;
}

从 hand1 的角度来看,其他两手牌是相同的(它们都包含 4c 和 off-suit 2)。尽管如此,在关于 hand1 对它们进行经典化之后,它们都保持不变。这不是我所期望的。

实际上,我会认为(并且打算)hand2 保持原样 - 因为 'clubs' 不能像它们出现在 hand1 中那样排列,而 'diamonds' 是下一个可用的花色-suit 2. 但我预计 hand3 会变得与 hand2 相同(通过将 'hearts' 切换为 'diamonds')。

你们中有人知道为什么这没有按预期工作吗?

是否有另一种方式来捕捉第 2 手和第 3 手相同的事实(从第 1 手的角度来看)?

如有任何帮助,我们将不胜感激!

对于那些可能感兴趣的人 - 我刚刚自己找到了解决问题的方法。以下是诀窍:

hand1.canonize();

if (!hand2.suitMask(Suit::Hearts())) {
    hand2 = hand2.rotateSuits(0, 1, 3, 2);
}
if (!hand2.suitMask(Suit::Diamonds()) && !hand1.suitMask(Suit::Diamonds())) {
    hand2 = hand2.rotateSuits(0, 3, 1, 2);
}