用pokerstove封圣双手并没有如预期的那样奏效

canonizing hands with pokerstove does not work as expected

本文关键字:pokerstove 双手 并没有      更新时间:2023-10-16

使用pokermove库时(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;
}

从手1的角度来看,另外两只手是相同的(它们都包含4c和一件西装2)。尽管如此,在对他们的手1进行封圣之后,他们都保持不变。这不是我所期望的。

事实上,我本以为(并打算)第二手保持原样,因为"俱乐部"不能像第二手出现的那样被替换,而"钻石"是第二手的下一套可用套装。但我原以为hand3会和hand2完全一样(用"钻石"替换"心形")。

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

有没有其他方法可以捕捉手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);
}