Advertisement
Guest User

Untitled

a guest
May 30th, 2018
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (ns lein-test.core
  2.   (:gen-class)
  3.   (:require [clojurewerkz.machine-head.client :as mqtt]))
  4.  
  5. ;; TIC TAC TOE
  6.  
  7. ;; PRINT OUT BOARD
  8.  
  9. (defn label->string
  10.   [label]
  11.   (case label
  12.     :empty " "
  13.     :x "X"
  14.     :o "O"
  15.     (name label)))
  16.  
  17. (defn row->string
  18.   [row]
  19.   (str (reduce #(str %1 "|" (label->string %2)) "" row) "|") )
  20.  
  21. (defn print-board
  22.   [board]
  23.   (doseq [row (map row->string board)]
  24.     (println row))
  25.   board)
  26.  
  27. ;; GET USER INPUT
  28.  
  29. (defn parse-user-input
  30.   [input]
  31.   (let [input (clojure.string/replace input #" " "")]
  32.     (when (re-matches #"[0-9]+,[0-9]+" input)
  33.       (map #(Integer. %) (clojure.string/split input #","))) )
  34.   )
  35. (defn get-move
  36.   []
  37.   (do
  38.     (println "type the x,y coordinates of your move:")
  39.     (parse-user-input (read-line))))
  40.  
  41.  
  42. ;; VALIDATE AND APPLY MOVES
  43.  
  44. (defn on-board?
  45.   [board x y]
  46.   (let [size (count board)]
  47.     (and (< x size) (< y size)))
  48.   )
  49.  
  50. (defn get-board-value
  51.   [board x y]
  52.   ((board y) x))
  53.  
  54.  
  55. (defn valid-move?
  56.   [board x y]
  57.   (and (on-board? board x y) (= (get-board-value board x y) :empty)))
  58.  
  59. (defn make-move
  60.   [board move x y]
  61.   (if (valid-move? board x y)
  62.     (assoc board y (assoc (board y) x move))))
  63.  
  64.  
  65.  
  66. ;; GENERATE INITIAL BOARD
  67.  
  68. (defn make-board
  69.   [n]
  70.   (->>
  71.     (repeat :empty)
  72.     (take n)
  73.     (into [])
  74.     (repeat)
  75.     (take n)
  76.     (into [])))
  77.  
  78. ;; GAME LOGIC
  79.  
  80. (declare play-round)
  81.  
  82. (defn get-opponent
  83.   [me]
  84.   (case me
  85.     :x "O"
  86.     :o "X"))
  87.  
  88. (defn handle-opponent
  89.   [payload player server]
  90.     (play-round (read-string payload) player server))
  91.  
  92. (defn send-to-server
  93.   [board server player]
  94.   (mqtt/publish server (str "mat/tictactoe" (label->string player)) (print-str board))  )
  95.  
  96. (defn play-turn
  97.   [board player]
  98.   (apply make-move board player (get-move)))
  99.  
  100. (defn play-round
  101.   [board player server]
  102.   (->
  103.     (print-board board)
  104.     (play-turn player)
  105.     (print-board)
  106.     (send-to-server server player))
  107.   (println "Waiting for other player..."))
  108.  
  109. (defn new-game
  110.   [nxn player]
  111.   (let [server (mqtt/connect "tcp://test.mosquitto.org:1883")
  112.         handler (fn [^String topic _ ^bytes payload]
  113.                   (handle-opponent (String. payload) player server))]
  114.     ((mqtt/subscribe server {(str "mat/tictactoe" (get-opponent player)) 0} handler)
  115.     (when (= :o player)
  116.       (play-round (make-board nxn) player server)
  117.       )
  118.     (while (mqtt/connected? server) ))))
  119.  
  120. (defn -main
  121.   "Start a game. Specify board size and player x/o"
  122.   [& args]
  123.   (new-game (Integer. (first args)) (keyword (clojure.string/lower-case (second args)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement