Aby uzupełnić doskonałe odpowiedzi na to pytanie, które już otrzymałem, pomyślałem, że pomocne byłoby zaoferowanie jednego z najprostszych sposobów porównywania rąk po zastosowaniu podstawowej techniki klasyfikacji. Przede wszystkim będziesz chciał oznaczyć ręce klasą , jak sugeruje wiele odpowiedzi - większość twoich porównań „czy ręka X jest lepsza niż ręka Y?” można to zrobić po prostu porównując klasy obu rąk i sprawdzając, która klasa jest lepsza. Co do reszty, będziesz musiał porównać karty po karcie, i okazuje się, że nieco więcej pracy w klasyfikacji ułatwi to.
Jako podstawowy przypadek rozważ sytuację, w której obie ręce są rękami „z wysoką kartą”; w takim przypadku najpierw porównujesz dwie najwyższe karty, a następnie (jeśli pasują do siebie) kolejne dwie karty itp. Jeśli założymy, że każda ręka wejściowa jest posortowana od najwyższej do najniższej karty, takie podejście prowadzi do kodu, który wygląda jak to:
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;
}
Dobra wiadomość: okazuje się, że to uporządkowanie leksykograficzne , odpowiednio poprawione, służy do porównania dwóch rąk w dowolnymklas, o ile ich klasa jest taka sama. Na przykład, ponieważ sposobem porównywania par jest najpierw porównanie par, a następnie pozostałych trzech kart, możesz posortować rękę, aby najpierw umieścić parę (lub nawet jedną kartę pary!) I przeprowadzić to samo porównanie. (Na przykład, ręka taka jak A9772 byłaby przechowywana jako 77A92 lub, jeszcze lepiej, 7A927; ręka A9972 byłaby przechowywana jako 9A729, i porównując z powyższym kodem zacząłbyś od umieszczenia 7 na 9 i okazało się, że A9972 wygrał). Ręka dwóch par byłaby przechowywana najpierw z wyższą z dwóch par, potem niższą, a następnie „kickerem” (tak więc np. A9977 zapisałby jako 97A97); trójka byłaby przechowywana z jedną kartą trzech, najpierw kopaczy, a następnie innych kart (np. A7772 to 7A277); pełny dom byłby przechowywany z jednym z trzech, a następnie z jednym z dwóch (np. 99777 byłby przechowywany jako 79779); zarówno strity, jak i kolory mogą być przechowywane w „bezpośrednim porządku leksykograficznym”, ponieważ oba są porównywane tak jak ręce z wysoką kartą. Prowadzi to do prostej zewnętrznej funkcji komparatora, która działa dla wszystkich klas rąk z już podaną funkcją:
// 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);
}
}
Mam nadzieję, że będzie to pomocne!