В дополнение к отличным ответам на этот вопрос уже получен, я подумал, что было бы полезно предложить один из самых простых способов сравнения рук после того, как базовый метод классификации на месте. Прежде всего, вы захотите пометить руки своим классом , как подсказывают многочисленные ответы - большинство ваших сравнений «рука X лучше руки Y?» тогда можно сделать это, просто сравнив классы двух рук и увидев, какой класс лучше. В остальном вам действительно нужно сравнивать по карточкам, и оказывается, что немного больше работы в классификации упростит эту задачу.
В качестве базового случая рассмотрим ситуацию, когда обе руки являются руками «старшей карты»; в этом случае вы сначала сравниваете две старшие карты, затем (если они совпадают) следующие две карты и т. д. Если вы предполагаете, что каждая входная рука отсортирована от самой верхней до самой низкой карты, такой подход приводит к коду, который выглядит следующим образом: это:
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;
}
Теперь, хорошая новость: оказывается, что этот лексикографический порядок , соответствующим образом подправленный, работает для сравнения двух рук в любомклассов, пока их класс одинаков. Например, поскольку способ сравнения пар состоит в том, чтобы сначала сравнить пары, а затем три другие карты, вы можете отсортировать свою руку, чтобы поставить пару первой (или даже одну карту пары первой!) И выполнить это же сравнение. (Так, например, такая рука, как A9772, будет сохранена как 77A92 или, что еще лучше, 7A927; рука A9972 будет сохранена как 9A729, и, сравнивая с приведенным выше кодом, вы начнете с расстановки 7 против 9 и обнаружите, что A9972 выиграл). Рука из двух пар будет храниться с наивысшей из этих двух пар, затем с более низкой, затем с кикером (например, A9977 будет хранить как 97A97); три вида будут храниться сначала с одной картой из трех, затем с кикерами, затем с другими картами (например, A7772 будет 7A277); полный дом будет храниться с одним из трех, а затем с одним из двух (например, 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);
}
}
Надеюсь, это поможет!