この質問がすでに得ている優れた答えを補うために、基本的な分類手法が整ったら、手を比較する最も簡単な方法の1つを提供することが役立つと思いました。まず、クラスに手をタグ付けします多くの答えが示唆しているようにに -「ハンドXよりハンドXの方が良い」という比較のほとんどです。2つの手のクラスを比較して、どちらのクラスが優れているかを確認するだけで実行できます。残りについては、実際にカードごとに比較する必要がありますが、分類の作業をもう少し行うとこれが簡単になることがわかります。
ベースラインのケースとして、両手が「ハイカード」の手である状況を考えてください。この場合、最初に最高の2枚のカードを比較し、次に(一致した場合)次の2枚のカードなどを比較します。各入力ハンドが最高のカードから最低のカードにソートされると仮定すると、このアプローチはこの:
int CompareHandsOfSameClass(Hand h1, Hand h2) {
for ( int i = 0; i < 5; i++ ) {
if ( h1[i].rank > h2[i].rank ) {
return -1;
} else if ( h1[i].rank < h2[i].rank ) {
return 1;
}
}
return 0;
}
さて、朗報:適切に調整されたこの辞書編集の順序は、任意のクラスが同じである限り。たとえば、ペアを比較する方法は最初にペアを比較し、次に他の3枚のカードを比較することなので、手を並べ替えてペアを最初に(またはペアの1枚のカードでも!)最初にこの同じ比較を実行できます。(たとえば、A9772のようなハンドは77A92または7A927として保存され、ハンドA9972は9A729として保存され、上記のコードと比較して、7を9にピットして、 A9972ウォン)。2ペアのハンドは、最初に2ペアのうち高い方、次に低い方、「キッカー」の順に格納されます(たとえば、A9977は97A97として格納されます)。種類の3つは、最初の3つのカードのうち1枚、次にキッカー、他のカードの順に格納されます(たとえば、A7772は7A277になります)。満員の家は3つのうちの1つ、2つのうちの1つで保管されます(たとえば、99777は79779として保管されます)。また、ストレートとフラッシュはどちらも「直接辞書編集」の順序で保存できます。両方ともハイカードハンドと同じように比較されるためです。これにより、すでに与えられた機能を備えたすべての手のクラスで機能する簡単な外部コンパレーター機能が実現します。
// Compare two hands, returning -1/0/+1 as hand 1 is less than, equal to,
// or greater than hand 2. Note that this function assumes the hands have
// already been classified and sorted!
int CompareHands(Hand h1, Hand h2) {
if ( h1.handClass > h2.handClass ) {
return -1;
} else if ( h1.handClass < h2.handClass ) {
return 1;
} else {
return CompareHandsOfSameClass(h1, h2);
}
}
うまくいけば、これが助けになるでしょう!