My way was a little verbose, but you could do: (defn verify-direction "Gets the current snake direction or a new one if a board edge was reached." [] (let [direction (@snake :direction) head (snake-head) x (head :x) y (head :y) at-left (= x 0) at-right (= x (- *board-width* 1)) at-top (= y 0) at-bottom (= y (- *board-height* 1)) left-half (< x (/ *board-width* 2)) top-half (< y (/ *board-height* 2))] (cond (and (= direction :right) at-right) (if top-half :down :up) (and (= direction :down) at-bottom) (if left-half :right :left) (and (= direction :left) at-left) (if top-half :down :up) (and (= direction :up) at-top) (if left-half :right :left) true direction)))
On Jan 3, 9:28 am, "Mark Volkmann" <r.mark.volkm...@gmail.com> wrote: > On Sat, Jan 3, 2009 at 3:03 AM, Brian Will <brian.thomas.w...@gmail.com> > wrote: > > > The problem with the snake running off the edge simply is a flaw in > > your logic here: > > > (defn verify-direction > > "Gets the current snake direction or > > a new one if a board edge was reached." > > [] > > (let [direction (@snake :direction) > > head (snake-head) > > x (head :x) > > y (head :y)] > > (cond > > (and (= direction :right) (= x (- *board-width* 1))) :down > > (and (= direction :down) (= y (- *board-height* 1))) :left > > (and (= direction :left) (= x 0)) :up > > (and (= direction :up) (= y 0)) :right > > true direction))) > > > Each case of the cond here is flawed. For example, when the snake is > > heading right and already on the bottom, he's going to turn down, > > which is off the board. > > > I suggest splitting each direction case into two cases such that the > > snake goes in the direction where there's more room to travel: > > > (defn verify-direction > > "Gets the current snake direction or > > a new one if a board edge was reached." > > [] > > (let [direction (@snake :direction) > > head (snake-head) > > x (head :x) > > y (head :y) > > left (= x 0) > > right (= x (- *board-width* 1)) > > top (= y 0) > > bottom (= y (- *board-height* 1)) > > left-half (< x (/ *board-width* 2)) > > right-half (>= x (/ *board-width* 2)) > > top-half (< y (/ *board-height* 2)) > > bottom-half (>= y (/ *board-height* 2))] > > (cond > > (and (= direction :right) right top-half) :down > > (and (= direction :right) right bottom-half) :up > > (and (= direction :down) bottom left-half) :right > > (and (= direction :down) bottom right-half) :left > > (and (= direction :left) left top-half) :down > > (and (= direction :left) left bottom-half) :up > > (and (= direction :up) top left-half) :right > > (and (= direction :up) top right-half) :left > > true direction))) > > Thanks Brian! I ended up doing something similar that required a > little less code. Here's what I did. > > (let [direction (@snake :direction) > head (snake-head) > x (head :x) > y (head :y) > at-left (= x 0) > at-right (= x (- *board-width* 1)) > at-top (= y 0) > at-bottom (= y (- *board-height* 1))] > (cond > (and (= direction :up) at-top) (if at-right :left :right) > (and (= direction :right) at-right) (if at-bottom :up :down) > (and (= direction :down) at-bottom) (if at-left :right :left) > (and (= direction :left) at-left) (if at-top :down :up) > true direction))) > > -- > R. Mark Volkmann > Object Computing, Inc. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---