# HG changeset patch # User Steve Losh # Date 1341782374 14400 # Node ID a13a6a80dd59edc717d9ec4fe669e41252463335 # Parent 94179c6aec4252a18b39dd3f1937534c5f2b65b4 moar. diff -r 94179c6aec42 -r a13a6a80dd59 src/caves/core.clj --- a/src/caves/core.clj Sun Jul 08 09:09:32 2012 -0400 +++ b/src/caves/core.clj Sun Jul 08 17:19:34 2012 -0400 @@ -1,16 +1,20 @@ (ns caves.core + (:use [caves.world :only [random-world]]) (:require [lanterna.screen :as s])) +; Constants ------------------------------------------------------------------- +(def screen-size [80 24]) + ; Data Structures ------------------------------------------------------------- (defrecord UI [kind]) -(defrecord World []) (defrecord Game [world uis input]) ; Utility Functions ----------------------------------------------------------- (defn clear-screen [screen] - (let [blank (apply str (repeat 80 \space))] - (doseq [row (range 24)] + (let [[cols rows] screen-size + blank (apply str (repeat cols \space))] + (doseq [row (range rows)] (s/put-string screen 0 row blank)))) @@ -21,7 +25,10 @@ (defmethod draw-ui :start [ui game screen] (s/put-string screen 0 0 "Welcome to the Caves of Clojure!") - (s/put-string screen 0 1 "Press enter to win, anything else to lose.")) + (s/put-string screen 0 1 "Press any key to continue.") + (s/put-string screen 0 2 "") + (s/put-string screen 0 3 "Once in the game, you can use enter to win,") + (s/put-string screen 0 4 "and backspace to lose.")) (defmethod draw-ui :win [ui game screen] (s/put-string screen 0 0 "Congratulations, you win!") @@ -31,6 +38,22 @@ (s/put-string screen 0 0 "Sorry, better luck next time.") (s/put-string screen 0 1 "Press escape to exit, anything else to restart.")) +(defmethod draw-ui :play [ui {{:keys [tiles]} :world :as game} screen] + (let [[cols rows] screen-size + vcols cols + vrows (dec rows) + start-x 0 + start-y 0 + end-x (+ start-x vcols) + end-y (+ start-y vrows)] + (doseq [[vrow-idx mrow-idx] (map vector + (range 0 vrows) + (range start-y end-y)) + :let [row-tiles (subvec (tiles mrow-idx) start-x end-x)]] + (doseq [vcol-idx (range vcols) + :let [{:keys [glyph color]} (row-tiles vcol-idx)]] + (s/put-string screen vcol-idx vrow-idx glyph {:fg color}))))) + (defn draw-game [game screen] (clear-screen screen) (doseq [ui (:uis game)] @@ -44,9 +67,15 @@ (:kind (last (:uis game))))) (defmethod process-input :start [game input] - (if (= input :enter) - (assoc game :uis [(new UI :win)]) - (assoc game :uis [(new UI :lose)]))) + (-> game + (assoc :world (random-world)) + (assoc :uis [(new UI :play)]))) + +(defmethod process-input :play [game input] + (case input + :enter (assoc game :uis [(new UI :win)]) + :backspace (assoc game :uis [(new UI :lose)]) + game)) (defmethod process-input :win [game input] (if (= input :escape) @@ -72,10 +101,7 @@ (recur (process-input (dissoc game :input) input)))))) (defn new-game [] - (new Game - (new World) - [(new UI :start)] - nil)) + (new Game nil [(new UI :start)] nil)) (defn main ([screen-type] (main screen-type false)) diff -r 94179c6aec42 -r a13a6a80dd59 src/caves/world.clj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/caves/world.clj Sun Jul 08 17:19:34 2012 -0400 @@ -0,0 +1,26 @@ +(ns caves.world) + + +(def world-size [160 50]) + +(defrecord World [tiles]) +(defrecord Tile [kind glyph color]) + +(def tiles + {:floor (new Tile :floor "." :white) + :wall (new Tile :wall "#" :white) + :bound (new Tile :bound "X" :black)}) + +(defn get-tile [tiles x y] + (get-in tiles [y x] (:bound tiles))) + +(defn random-tiles [] + (let [[cols rows] world-size] + (letfn [(random-tile [] + (tiles (rand-nth [:floor :wall]))) + (random-row [] + (vec (repeatedly cols random-tile)))] + (vec (repeatedly rows random-row))))) + +(defn random-world [] + (new World (random-tiles))) diff -r 94179c6aec42 -r a13a6a80dd59 test/caves/core_test.clj --- a/test/caves/core_test.clj Sun Jul 08 09:09:32 2012 -0400 +++ b/test/caves/core_test.clj Sun Jul 08 17:19:34 2012 -0400 @@ -9,13 +9,9 @@ (deftest test-start (let [game (new Game nil [(new UI :start)] nil)] - - (testing "Enter wins at the starting screen." - (let [result (process-input game :enter)] - (is (= (current-ui result) :win)))) - - (testing "Other keys lose at the starting screen." + (testing "Any key sends you to the play screen and generates a world." (let [results (map (partial process-input game) - [\space \a \A :escape :up :backspace])] + [:enter \space \a \A :escape :up :backspace])] (doseq [result results] - (is (= (current-ui result) :lose))))))) + (is (= (current-ui result) :play)) + (is (not= nil (:world result))))))))