2014-10-16 56 views
1

正如我前面提到,我正在撲克手Clojure中,我對完成的最後階段。我只是在獲勝手功能方面存在問題,它應該像從最高的手牌列表中返回手牌,但是如果有聯繫,那麼它應該返回所有這些手牌的列表。 所以,這裏是我的中獎手功能:如何在撲克的贏手功能中返回列表?

(defn hand-rank 
       "Return a value indicating how high the hand ranks." 
       [hand] 
       (let [ranks (card-ranks hand)] 
       (cond 
       (and (straight ranks) (u-flush hand)) (-> [] (conj 8) (conj (apply max ranks))) 
       (kind 4 ranks) (-> [] (conj 7) (conj (kind 4 ranks)) (conj (kind 1 ranks))) 
       (and (kind 3 ranks) (kind 2 ranks)) (-> [] (conj 6) (conj (kind 3 ranks)) (conj (kind 2 ranks))) 
       (u-flush hand) (-> [] (conj 5) (conj ranks)) 
       (straight ranks) (conj [4] (apply max ranks)) 
       (kind 3 ranks) (-> [3] (conj (kind 3 ranks)) (conj ranks)) 
       (two-pair ranks) (-> [2] (conj (two-pair ranks)) (conj ranks)) 
       (kind 2 ranks) (-> [1] (conj (kind 2 ranks)) (conj ranks)) 
       :else (-> [0] (conj ranks)) 
      ))) 

      (defn winning-hand 
       "Return the max hand of the given poker hands." 
       [hands] 
       (let [min-count (count (apply min-key count (for [hand hands] 
                  (hand-rank hand))))] 
       (reduce (fn [x y] 
          (if (<= 0 (compare (subvec (vec (flatten (hand-rank x))) 0 min-count) 
              (subvec (vec (flatten (hand-rank y))) 0 min-count))) 
          x 
          y)) hands))) 

      (defn allmax 
       "Return a list of all items equals to the max of the sequence." 
       [coll] 
       (let [maximum (winning-hand coll)] 
       (for [x coll :when (= maximum x)] 
        x))) 

      (defn winning-list 
       "Return a list of winning hands. poker([hand1, hand2, ...] => [hand, ..." 
       [hands] 
       (allmax hands)) 

獲獎名單功能正常工作時,有沒有打領帶,但在相同的情況下,仍返回只有一隻手,而不是所有的列表最高的手。例如:在這種情況下[「AC」,「2C」,「3C」,「4C」,「5C」]「[」AH「,」2H「,」3H「,」4H「,」5H「]' [「AD」,「2D」,「3D」,「4D」,「5D」]'[「AC」,「2S」,「3H」,「4D」,「5H」]) 「AC」,「2C」,「3C」,「4C」,「5C」]'[「AH」,「2H」,「3H」,「4H」,「5H」]' 「,」3D「,」4D「,」5D「]。有人能告訴我我做錯了什麼嗎?

+0

'allmax'只返回那些恰好等於'殊榮,hand'返回手手中。它應該將每隻手的得分與得分手的得分進行比較。 – Alex 2014-10-16 19:53:47

+2

'( - > [](conj x)(conj y))'超級怪異。只寫'[x y]'就簡單多了。 – amalloy 2014-10-16 19:55:26

回答

0

你的手本身測試平等,而不是它的「價值」(即直衝1〜5)。你想要這樣的東西。

(defn allmax 
      "Return a list of all items equals to the max of the sequence." 
      [coll] 
      (let [maximum (winning-hand coll)] 
      (for [x coll :when (= (hand-value maximum) (hand-value x)] 
       x))) 

一個更好的解決方案可能會讓你實現一個比較器的手和在這裏和其他地方使用。

+0

嗨,如果有的話,使用手牌值給我的勝利手錶。但我現在有一個問題。如果我輸入了贏手([「2H」「3S」「4C」「5D」「AD」] [「TH」「AS」「QC」「KD」「JD」]),則輸出應該是([ (「」2H「」3S「」4C「」5D「」AD「)因爲A會跳動5,但通過使用值,我會得到輸出爲」TH「,」AS「,」QC「,」KD「 ] [「TH」「AS」「QC」「KD」「JD」]),因爲兩者都是直的。你能幫我解決這個問題嗎? – 2014-10-17 00:40:24

+0

埃裏卡你好,你需要提高你的手的價值/比較功能,以考慮tiebraakers。例如,一對的決勝牌是下一個最高的牌,而直線的破牌者是直線的最高值。如果這是針對euler項目,您可以離線發送消息,我還有一些示例代碼可供您查看。 – RedDeckWins 2014-10-17 13:04:20