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}}== |