Rock-paper-scissors: Difference between revisions

Content added Content deleted
No edit summary
(Adds Clojure solution)
Line 1,205: Line 1,205:
Draws: 1
Draws: 1
</pre>
</pre>

=={{header|Clojure}}==
{{libheader|jline}}
{{libheader|clojure.data.generators}}

<lang clojure>(ns rps.core
(:require [clojure.data.generators :refer [weighted]])
(:import jline.Terminal)
(:gen-class))

(def what-beats {:rock :paper, :paper :scissors, :scissors :rock})

(defn battle [human comp]
(let [h (name human)
c (name comp)]
(cond
(= human comp) (println (format "We both picked %s. DRAW!" c))
(= human (what-beats comp))
(println (format "Your %s defeats computer's %s. YOU WIN!" h c))
(= comp (what-beats human))
(println (format "Computer's %s defeats your %s. YOU LOSE!" c h))
:else (println (format "Wat? %s and %s ?" h c)))))

(defn key->rps [k]
(cond
(or (= k 82) (= k 114)) :rock
(or (= k 80) (= k 112)) :paper
(or (= k 83) (= k 115)) :scissors
:else nil))

(defn play-game [freqs]
(println "\n(R)ock, (P)aper, (S)cissors?")
(let [term (Terminal/getTerminal)
rps (key->rps (.readCharacter term System/in))]
(if-not (nil? rps)
(do
(battle rps (what-beats (weighted freqs)))
(recur (assoc freqs rps (inc (rps freqs)))))
(println "Game Over Man! Game Over!"))))

(defn -main
"Rock, Paper, Scissors!"
[& args]
(play-game {:rock 1, :paper 1, :scissors 1}))</lang>

{{out}}
<pre>(R)ock, (P)aper, (S)cissors?
Your paper defeats computer's rock. YOU WIN!

(R)ock, (P)aper, (S)cissors?
Computer's paper defeats your rock. YOU LOSE!

(R)ock, (P)aper, (S)cissors?
We both picked scissors. DRAW!</pre>


=={{header|D}}==
=={{header|D}}==