Skip to content

Instantly share code, notes, and snippets.

@mh120888
Created June 23, 2016 23:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mh120888/716b7dc205ed0f2ff7dbed116b6db0c3 to your computer and use it in GitHub Desktop.
Save mh120888/716b7dc205ed0f2ff7dbed116b6db0c3 to your computer and use it in GitHub Desktop.
Generative ttt spec
(ns clojure-ttt.generative-spec
(:require [speclj.core :refer :all]
[clojure-ttt.core :as core]
[clojure-ttt.player :as player])
(:import [clojure_ttt.player ComputerPlayer]))
(def human-marker "x")
(def ai-marker "o")
(def computer-player (ComputerPlayer.))
(defn simulate-possible-human-moves
[boards human-marker]
((comp vec flatten) (map (fn [board] (map #(core/mark-space board % human-marker) (keys (core/find-free-spaces board)))) boards)))
(defn simulate-computer-moves
[boards ai-marker]
((comp vec flatten) (map (fn [board] (core/mark-space board (player/get-move computer-player board ai-marker) ai-marker)) boards)))
(defn simulate-possible-games
([] (simulate-possible-games [human-marker ai-marker] [simulate-possible-human-moves simulate-computer-moves] [(core/generate-new-board 3)] []))
([markers simulate-move-functions in-progress-boards completed-boards]
(if (empty? in-progress-boards)
completed-boards
(let [new-in-progress-boards ((first simulate-move-functions) in-progress-boards (first markers))]
(recur (reverse markers) (reverse simulate-move-functions) (vec (remove #(core/stop-game? %) new-in-progress-boards)) ((comp vec concat) completed-boards (vec (filter #(core/stop-game? %) new-in-progress-boards))))))))
(tags :slow
(describe "get-move for ComputerPlayer"
(before
(def possible-games (simulate-possible-games)))
(it "never allows the human player to win"
(should= 0 (count (filter #(= human-marker (core/has-won? %)) possible-games))))))
(run-specs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment