Per integrare le eccellenti risposte che questa domanda ha già ottenuto, ho pensato che sarebbe stato utile offrire uno dei modi più semplici per confrontare le mani una volta che la tecnica di classificazione di base è stata messa in atto. Prima di tutto, ti consigliamo di taggare le mani con la loro classe , come suggerito da numerose risposte - la maggior parte dei tuoi confronti di "la mano X è migliore della mano Y?" può quindi essere fatto semplicemente confrontando le classi delle due mani e vedendo quale classe è migliore. Per il resto, dovrai effettivamente confrontare carta per carta, e si scopre che un po 'più di lavoro nella classificazione renderà questo più facile.
Come caso di base, considera la situazione in cui entrambe le mani sono mani "carta alta"; in questo caso, confronteresti prima le due carte più alte, quindi (se corrispondessero) le due carte successive, ecc. Se supponi che ogni mano di input sia ordinata dalla carta più alta a quella più bassa, questo approccio porta a un codice simile a Questo:
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;
}
Ora, la buona notizia: si scopre che questo ordinamento lessicografico , opportunamente ottimizzato, funziona per confrontare due mani in qualsiasidelle classi, purché la loro classe sia la stessa. Ad esempio, poiché il modo di confrontare le coppie è di confrontare prima le coppie, quindi le altre tre carte, puoi ordinare la tua mano per mettere la coppia prima (o anche una sola carta della coppia prima!) Ed eseguire questo stesso confronto. (Ad esempio, una mano come A9772 verrebbe memorizzata come 77A92 o, meglio ancora, 7A927; la mano A9972 verrebbe memorizzata come 9A729, e confrontando con il codice sopra inizieresti mettendo 7 contro 9 e scoprendo che A9972 ha vinto). Una mano di due coppie verrebbe memorizzata prima con la più alta delle due coppie, poi con la parte inferiore, quindi con il "kicker" (quindi, ad esempio, A9977 memorizzerebbe come 97A97); il tris sarebbe memorizzato con una carta delle tre prima, poi i kicker, quindi le altre carte (es. A7772 sarebbe 7A277); un full house verrebbe memorizzato con uno dei suoi tre e poi uno dei suoi due (ad esempio, 99777 verrebbe memorizzato come 79779); e rettilinei e scale possono essere entrambi conservati in ordine 'lessicografico diretto' poiché entrambi sono confrontati proprio come le mani con carte alte. Ciò porta a una semplice funzione di comparatore esterno che funziona per tutte le classi di mani con la funzione già assegnata:
// 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);
}
}
Spero che questo possa essere di aiuto!