Pour compléter les excellentes réponses que cette question a déjà obtenues, j'ai pensé qu'il serait utile d'offrir l'une des façons les plus simples de comparer les mains une fois la technique de classification de base en place. Tout d'abord, vous voudrez marquer les mains avec leur classe , comme de nombreuses réponses l'ont suggéré - la plupart de vos comparaisons de «la main X est-elle meilleure que la main Y? peut alors être fait simplement en comparant les classes des deux mains et en voyant quelle classe est meilleure. Pour le reste, vous aurez besoin de comparer carte par carte, et il s'avère qu'un peu plus de travail de classification facilitera les choses.
En tant que cas de référence, considérons la situation où les deux mains sont des mains «high card»; dans ce cas, vous devez d'abord comparer les deux cartes les plus élevées, puis (si elles correspondent) les deux cartes suivantes, etc. Si vous supposez que chaque main en entrée est triée de la carte la plus élevée à la carte la plus basse, cette approche conduit à un code qui ressemble à cette:
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;
}
Maintenant, la bonne nouvelle: il s'avère que cet ordre lexicographique , convenablement modifié, fonctionne pour comparer deux mains dans n'importe queldes classes, tant que leur classe est la même. Par exemple, puisque la façon de comparer les paires est de comparer les paires d'abord, puis les trois autres cartes, vous pouvez trier votre main pour placer la paire en premier (ou même une carte de la paire en premier!) Et exécuter cette même comparaison. (Ainsi, par exemple, une main comme A9772 serait stockée sous la forme 77A92 ou, mieux encore, 7A927; la main A9972 serait stockée sous la forme 9A729, et en comparant avec le code ci-dessus, vous commenceriez par opposer 7 à 9 et constater que A9972 a gagné). Une main de deux paires serait stockée avec la plus élevée des deux paires en premier, puis la plus basse, puis le «kicker» (ainsi, par exemple, A9977 serait stocké sous 97A97); trois d'une sorte seraient stockés avec une carte des trois premiers, puis les kickers, puis les autres cartes (par exemple, A7772 serait 7A277); une maison pleine serait stockée avec l'un de ses trois, puis l'un de ses deux (par exemple, 99777 serait stocké comme 79779); et les lignes droites et les couleurs peuvent toutes les deux être stockées dans un ordre `` lexicographique direct '' car elles sont toutes deux comparées, tout comme les mains à carte élevée. Cela conduit à une fonction de comparateur externe simple qui fonctionne pour toutes les classes de mains avec la fonction déjà donnée:
// 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);
}
}
J'espère que cela vous sera utile!