2016-03-22 11 views
2

Böyle bir çizgi ile yöntemini başlamak gerekir: public static Hand chooseBestHand(ArrayList<Hand> hands) throws handException {Elleri bir poker oyunundan karşılaştıracak ve en iyi olanı döndürecek bir yöntem yapmaya nasıl başlamalıyım?

Sadece bazı ipuçları gerekir. düzenleme: Bir istisnaımın olmasının nedeni, iki elin bağlanmasıdır.

+2

Benim ipucum bir 'Karşılaştırıcı ' yazmaktır. –

+1

İki el bağlandığında bir istisna atmayın. Bunları karşılaştırılabilir yapın ve çok anlamlı olmayan –

+0

@ cricket_007 yapın. Yöntem bir karşılaştırıcı değildir. En iyi eli döndürmek için bir karşılaştırıcı kullanır. En iyi el yoksa null veya Optional.empty() öğesini döndürmeniz mantıklı olabilir, ancak bir listeyi karşılaştırıyorsanız 0 değerini döndürmeniz mantıklı değildir. – sprinter

cevap

0

İpucu önerdiniz, bu yüzden kod önermem.

  • Eğer Suit, Card ve Hand sınıfları tanımlamak gerekir her şeyden önce.
  • Sonra
  • Daha sonra karşılaştırarak iki el karşılaştıran bir Comparator tanımlayabilir onları tanımlamak ve aynı türden iki el karşılaştırma yöntemleri ile poker elleri her türlü listeleyen bir sınıf (ideal bir enum) ihtiyaç türlerini veya aynı türdenlerse, iki elin karşılaştırılması için bu tür yöntemi çağırmak.
  • Sizin chooseBestHand'unuz oldukça önemsiz: tanımlanmış karşılaştırıcıyı kullanarak sıralayın ve ardından ilkini alın. Eğer ikincisine kıyasla 0 döndürürse, istisnayı fırlatır.
0

ben yaklaşım olurdu yolu sınıflandırarak yöntemler kümesini yazmaktır: El dört ise eli floş ise isStraightFlush (El h) true döndürür, isFourOfAKind (El h) true döndürür isPair'e bir tür vb. (Hand h).

Daha sonra bir karşılaştırma yöntemi seti yazdım: compareStraightFlushs (ArrayList eller), daha önce düz flushs olarak tanımlanmış ellerin listesini karşılaştırır, compareFourOfAKinds (ArrayList elleri), önceden tanımlanmış ellerin listesini karşılaştırır. Bir çeşit, vb. Karşılaştırma 2Çalışmalarda, KarşılaştırmaPair ve compareHighCard yöntemlerinde sırasıyla 1, 3 ve 4 "kicker" kartlarına bakmanız gerektiğini unutmayın. (Eldeki iki "kullanılmamış" kart olsa bile, compareThreeOfAKind'deki kicker'lara bakmak zorunda kalmayacağınızı unutmayın.)

Muhtemelen bir yardımcı yöntem findHighCard (Hand h, Boolean isStraight) yazabilirim. eldeki en yüksek kartın değerini döndürür, ancak isStraight argümanı doğruysa ve el bir Ace içeriyorsa, As'ın yüksek mi yoksa düşük olarak mı kullanıldığını belirlemek için elin de bir Kral içerip içermediğini kontrol etmek zorundadır.

Tabii ki göz önünde bulundurulması gereken daha fazla ayrıntı var, ancak sınıflandırıcınızı ve karşılaştırma yöntemlerinizi bir kez aldığınızda, her bir el için isStraightFlush'ın çağrılması ve kaç isabet aldığınızı görmeniz yeterli olacaktır. Bir el doğruysa, kazanan budur. Eğer iki veya daha fazla geri dönüş gerçekleşirse, o zaman compareStraightFlushs (ArrayList eller) 'i çağırmanız gerekir ve döndürdüğü kazanır. IsStaightFlush için hiçbir kullanıcı true döndürmezse, her bir el için isFourOfAKind öğesini çağırmaya devam edersiniz ve en az bir isabet elde edinceye ve karşılaştırma yöntemlerini çağırana kadar sınıflandırıcı yöntemlerini azalan sırada çağırmaya devam edersiniz. eğer birden fazla alırsan.

İlgili konular