我们必须开发一个扑克游戏。我已经开发了所有必需的功能,但我坚持使用其中的一个。结果为:(higher-kicker?kicker1 kicker2)比较两个踢球中的对应值,如果第一个踢球的第一个差值较大,则返回true,如果第二个踢球的第一个差值较大,则返回false,或者列表成对相等。示例:(higher-kicker?'(8 5 9)'(8 7 3))应该返回false,因为8 == 8但7> 5。假设两个踢脚列表的长度相等。
我能够做的是比较两只手,例如:
(defn compare-cards [[v1 s1] [v2 s2]]
(if (= v1 v2)
(compare (suit-value s1) (suit-value s2))
(compare v1 v2)))
(defn sort-cards [cards]
(sort compare-cards cards))
(defn parse-hand [s]
(sort-cards (mapv parse-card (.split s " "))))
(def foo [[:straight straight?] [:high-card high-card?]])
(defn categorize-hand [hand]
(some #(% (parse-hand hand)) (map second foo)))
(defmulti tie-break (fn [h _] (categorize-hand h)))
(defmethod tie-break :high-card [h1 h2]
(drop-while zero? (map compare-cards (reverse h1) (reverse h2))))
(defmethod tie-break :straight [[f1 & _] [f2 & _]]
(compare-cards f1 f2))
(defn compare-hands [hand1 hand2]
(let [category1-value (.indexOf (map first foo) (categorize-hand hand1))
category2-value (.indexOf (map first foo) (categorize-hand hand2))]
(if (= category1-value category2-value)
(tie-break (parse-hand hand1) (parse-hand hand2))
(compare category1-value category2-value))))
但是,在逐个比较人脸值以查看第一个值是否更大时,Im卡住了。谁能帮我?
就像我在做的那样:
(defn higher-kicker? [
card-ranks-1 card-ranks-2]
(->> (map compare card-ranks-1 card-ranks-2)
(filter #(not (zero? %)))
那之后该怎么办?
奇怪的是,我找不到从两个列表创建成对列表的函数,所以我自己滚动了。请注意zipmap,因为它不保留顺序。话虽如此,这一切都非常简单。获取第一个不相等的对。如果没有任何列表相等,则返回false,否则将它们进行比较,如果第一个大于第二个则返回。
(defn make-pairs [list1 list2] (partition 2 (interleave list1 list2)))
(defn pair-not= [[item1 item2]] (not (= item1 item2)))
(defn unequal-pairs [list1 list2] (filter pair-not= (make-pairs list1 list2)))
(defn higher-kicker? [kicker1 kicker2]
(let [unequal-pair (first (unequal-pairs kicker1 kicker2))]
(if unequal-pair
(> (first unequal-pair) (second unequal-pair))
false)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句