These days, the web have been noisy about the brand new Google sponsored AI Challenge organized by the University of Waterloo Computer Science Club. I find that it's a great initiative and is a good occasion for amateur AI researchers like me to do something else than web development or database related coding. Being fond of Clojure, I've taken on the task of making a starter package for this language and making it available on a GitHub repository. It's not an official package yet, but it shouldn't be a problem as the organizers seems really open.
The code has been translated from the Java starter package. I've tried to keep the map code close to the original, so it may not be the most idiomatic Clojure code. There's four global refs containing the state of the game: width, height, walls and players. The two first are simple integers, walls is an hash map keyed with points (which are vectors) and the last one a vector of points. There's some convenient functions to access that data, wall? to tell if a wall is found at the given coordinates and two others to get each players position, you and them. To move your bike you must call make-move with one of :north, :east, :south or :west. The map code end up being nearly half the size of the Java version.
With this code we can rewrite the sample random bot in Clojure, I'll spare you any more explanation and only show the code.
(load "map") (defn valid-moves [x y] [(when-not (wall? x (- y 1)) :north) (when-not (wall? (+ x 1) y) :east) (when-not (wall? x (+ y 1)) :south) (when-not (wall? (- x 1) y) :west)]) (defn compact [coll] (filter identity coll)) (defn choose-at-random [coll] (let [size (count coll)] (when (< 0 size) (nth coll (rand-int size))))) (defn next-move [] (choose-at-random (compact (apply valid-moves (you))))) (defn game-loop [] (loop [] (initialize) (make-move (next-move)) (recur))) (game-loop)
Hack and be mery!
Update: I've updated the GitHub repository with some improvements and instructions on how to compile your entry. While discussing with one of the contest organizer over their forum, I realized that even though Clojure is more than fast enough for this kind of task, the Clojure jar loading time take a good chunk of the first turn time, so be careful. By the way, it's now an official package.