Untuk melengkapi jawaban yang sangat baik dari pertanyaan ini, saya pikir akan sangat membantu untuk menawarkan salah satu cara paling mudah untuk membandingkan tangan ketika teknik klasifikasi dasar sudah ada. Pertama-tama, Anda ingin memberi label tangan pada kelas mereka , seperti yang disarankan oleh banyak jawaban - sebagian besar perbandingan Anda tentang 'tangan X lebih baik daripada tangan Y?' kemudian dapat dilakukan hanya dengan membandingkan kelas dua tangan dan melihat kelas mana yang lebih baik. Selebihnya, Anda harus membandingkan berdasarkan kartu-demi-kartu, dan ternyata sedikit lebih banyak pekerjaan dalam klasifikasi akan membuat ini lebih mudah.
Sebagai kasus dasar, pertimbangkan situasi di mana kedua tangan adalah kartu 'tinggi'; dalam hal ini, Anda akan membandingkan dua kartu tertinggi terlebih dahulu, kemudian (jika mereka cocok) dua kartu berikutnya, dll. Jika Anda berasumsi bahwa setiap input tangan diurutkan dari kartu tertinggi ke terendah, pendekatan ini mengarah ke kode yang terlihat seperti ini:
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;
}
Sekarang, kabar baik: ternyata ini memesan leksikografis , sesuai tweak, bekerja untuk membandingkan dua tangan di setiapkelas, selama kelas mereka sama. Misalnya, karena cara membandingkan pasangan adalah dengan membandingkan pasangan terlebih dahulu, kemudian tiga kartu lainnya, Anda dapat mengurutkan tangan Anda untuk menempatkan pasangan lebih dulu (atau bahkan satu kartu dari pasangan terlebih dahulu!) Dan menjalankan perbandingan yang sama ini. (Jadi, misalnya, tangan seperti A9772 akan disimpan sebagai 77A92 atau, lebih baik lagi, 7A927; tangan A9972 akan disimpan sebagai 9A729, dan membandingkan dengan kode di atas Anda akan mulai dengan mengadu 7 melawan 9 dan menemukan bahwa A9972 menang). Satu tangan dari dua pasangan akan disimpan dengan yang lebih tinggi dari dua pasangan pertama, kemudian yang lebih rendah, kemudian 'penendang' (jadi, misalnya, A9977 akan disimpan sebagai 97A97); tiga jenis akan disimpan dengan satu kartu dari tiga pertama, kemudian kickers, kemudian kartu lainnya (misalnya, A7772 akan menjadi 7A277); rumah penuh akan disimpan dengan satu dari tiga dan kemudian satu dari dua (mis., 99777 akan disimpan sebagai 79779); dan lurus dan flushes keduanya dapat disimpan dalam urutan 'lexicographical langsung' karena keduanya dibandingkan seperti tangan kartu tinggi. Ini mengarah ke fungsi pembanding luar langsung yang bekerja untuk semua kelas tangan dengan fungsi yang sudah diberikan:
// 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);
}
}
Semoga ini bisa membantu!