Para complementar las excelentes respuestas que esta pregunta ya ha recibido, pensé que sería útil ofrecer una de las formas más directas de comparar las manos una vez que la técnica de clasificación básica esté en su lugar. En primer lugar, querrá etiquetar las manos con su clase , como lo han sugerido numerosas respuestas: la mayoría de sus comparaciones de '¿es la mano X mejor que la mano Y?' entonces puede hacerse simplemente comparando las clases de las dos manos y viendo qué clase es mejor. Por lo demás, en realidad tendrá que comparar tarjeta por tarjeta, y resulta que un poco más de trabajo en la clasificación lo hará más fácil.
Como caso de referencia, considere la situación en la que ambas manos son manos de 'cartas altas'; en este caso, primero compararía las dos cartas más altas, luego (si coincidían) las siguientes dos cartas, etc. Si asume que cada mano de entrada está ordenada de la carta más alta a la más baja, este enfoque lleva a un código similar esta:
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;
}
Ahora, la buena noticia: resulta que este ordenamiento lexicográfico , ajustado adecuadamente, funciona para comparar dos manos en cualquierde las clases, siempre que su clase sea la misma. Por ejemplo, dado que la forma de comparar pares es comparar primero los pares, luego las otras tres cartas, puede ordenar su mano para poner el par primero (¡o incluso una carta del par primero!) Y ejecutar esta misma comparación. (Entonces, por ejemplo, una mano como A9772 se almacenaría como 77A92 o, mejor aún, 7A927; la mano A9972 se almacenaría como 9A729, y en comparación con el código anterior, comenzaría enfrentando 7 contra 9 y encontrará que A9972 ganó). Una mano de dos pares se almacenaría con el más alto de los dos pares primero, luego el más bajo, luego el 'pateador' (entonces, por ejemplo, A9977 se almacenaría como 97A97); tres de un tipo se almacenarían con una tarjeta de las tres primero, luego los pateadores, luego las otras tarjetas (por ejemplo, A7772 sería 7A277); una casa completa se almacenaría con uno de sus tres y luego uno de sus dos (por ejemplo, 99777 se almacenaría como 79779); y las rectas y los colores pueden almacenarse en orden 'lexicográfico directo' ya que ambos se comparan al igual que las manos de cartas altas. Esto lleva a una función de comparación externa directa que funciona para todas las clases de manos con la función ya dada:
// 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);
}
}
¡Espero que esto sea de alguna ayuda!