Hi!

I've mostly finished a game I've been writing the last couple of weeks. It
is a snake game written with clojurescript and canvas. It also uses
core.async for coordination and communication between the UI and the game
logic.

[image: Inline image 1]

It is my first clojure/script program (I've dabbled with the language a lot
before not really doing anything). Here is the demo:

http://chimeces.com/cnake/

And the code: https://github.com/joakin/cnake/

It is a bit more complex than it could be for that kind of game but I
wanted to experiment with certain ideas and core.async.

A bit about the architecture:
The game is separated in UI and Game logic.

The UI instantiates the game logic, and they are separated by an input
channel (commands that the game receives) and an ouput channel (notifos
that the game logic spits).

Some of the *why*s are:
With the commands I'm am able to directly map and filter key events to
commands and pipe those to the game via chan (which results in a pretty
elegant solution).
https://github.com/joakin/cnake/blob/master/src/cnake/ui.cljs#L205

With the notifos, it would be easy for example to react to events of the
game (not just reading its state to paint), for example to play sounds when
moved, or when a pill is eaten (thats on the TODO)
https://github.com/joakin/cnake/blob/master/src/cnake/game.cljs#L190
https://github.com/joakin/cnake/blob/master/src/cnake/ui.cljs#L123

With this separation it should be easy to implement a different UI without
touching the game logic at all, and just by sending commands and listening
to notifications, which is pretty cool and simple.

Another interesting thing (in my opinion) is that the game coordination and
state is enclosed in a state machine in the game/game! function that
mutates state in the fn listening to the commands and *recur*ing. That way
the rest of the game is implemented through pure functions that get data,
modify it and return it.

The code is fairly commented, and it is not very long, 200 lines each ui
and game file.

This is my first complete program in clojurescript (and also using canvas
btw). I would love to get feedback on code style, structure, idioms, or
whatever else.

Cheers

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/clojurescript.

<<1-small.png>>

Reply via email to