2014-10-16 6 views
0

Мы должны разработать покерную игру. Я разработал все необходимые функции, но я застрял в одном. Он идет: (более высокий кикер? Kicker1 kicker2) сравнивает соответствующие значения в двух кикерах и возвращает true, если первый кикер имеет большее значение первого разности, false, если второй кикер делает или если списки попарно равны , Пример: (высший кикер? '(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? %))) 

то, что делать после этого?

+0

Он должен очень похож на ваш метод 'tie-break: high-card': используйте' map', чтобы объединить два списка вместе, сравнив их и взяв первое ненулевое значение. С чем вы сталкиваетесь, когда применяете эту технику для поиска кикера? – amalloy

+0

Как сравнить список, преобразованный в zip-список? Например, когда я zipmap '(8 5 9)' (8 7 3), я получаю {8 8, 5 7,9 3}. Теперь, как сравнить 8 с 8, 5 с 7 и так далее; а затем верны true или false соответственно? –

+0

Как я делаю: (defn выше-kicker? [Card-ranks-1 card-ranks-2] (- >> (карта сравнить карты-ряды-1 карточные ряды-2) (фильтр # (не (ноль?%))) то что делать после этого? –

ответ

0

Как ни странно, я не смог найти функцию, которая создает список пар из двух списков, поэтому я перевернул свой собственный. Остерегайтесь 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))) 
Смежные вопросы