正如我前面提到,我正在撲克手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「]。有人能告訴我我做錯了什麼嗎?
'allmax'只返回那些恰好等於'殊榮,hand'返回手手中。它應該將每隻手的得分與得分手的得分進行比較。 – Alex 2014-10-16 19:53:47
'( - > [](conj x)(conj y))'超級怪異。只寫'[x y]'就簡單多了。 – amalloy 2014-10-16 19:55:26