Bu sorunun zaten elde ettiği mükemmel cevapları desteklemek için, temel sınıflandırma tekniği uygulandıktan sonra elleri karşılaştırmanın en basit yollarından birini sunmanın yararlı olacağını düşündüm. Her şeyden önce, sayısız cevaplar önerildiği gibi elleri sınıflarıyla etiketlemek isteyeceksiniz - 'X el i Y'den daha iyi mi?' daha sonra iki elin sınıflarını karşılaştırarak ve hangi sınıfın daha iyi olduğunu görerek yapılabilir. Geri kalanı için, aslında kart bazında karşılaştırmanız gerekir ve sınıflandırmada biraz daha fazla çalışmanın bunu kolaylaştıracağı ortaya çıkar.
Temel durum olarak, her iki elin de 'yüksek kart' el olduğu durumu düşünün; bu durumda, ilk önce en yüksek iki kartı, daha sonra (eşleşen iki kartı vb.) karşılaştırırsınız. Her giriş elinin en yüksekten en düşük karta sıralandığını varsayarsanız, bu yaklaşım, bu:
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;
}
Şimdi, iyi haber: bu sözlükbilimsel düzen , uygun bir şekilde ayarlanmış, herhangi bir eldeki iki eli karşılaştırmak için çalışıyorsınıfları, sınıfları aynı olduğu sürece. Örneğin, çiftleri karşılaştırmanın yolu önce çiftleri, sonra diğer üç kartı karşılaştırmak olduğundan, çifti önce (hatta çiftin ilk kartı!) Koymak ve aynı karşılaştırmayı çalıştırmak için elinizi sıralayabilirsiniz. (Örneğin, A9772 gibi bir el 77A92 veya daha iyisi 7A927 olarak saklanır; A9972 eli 9A729 olarak saklanır ve yukarıdaki kodu 7'ye 9'a karşı çukurlaştırarak ve A9972 kazandı). İki çiftten oluşan bir el önce iki çiftten daha yüksek, sonra daha düşük, daha sonra 'kicker' ile saklanır (yani, A9977 97A97 olarak saklanır); türünün üçü önce üç karttan biriyle, daha sonra vurucularla, daha sonra diğer kartlarla (örneğin, A7772 7A277 olacaktır) saklanır; dolu bir ev üçünden biriyle ve sonra ikisinden biriyle depolanır (örneğin, 99777 79779 olarak saklanır); ve düzlükler ve yıkamalar her ikisi de tıpkı yüksek kartlı ellerde olduğu gibi 'doğrudan sözlükbilimsel' düzende saklanabilir. Bu, zaten verilen işlevle tüm el sınıfları için çalışan basit bir dış karşılaştırma işlevine yol açar:
// 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);
}
}
Umarım bu biraz yardımcı olacaktır!