Hi,

I am writing a little board game in clojure, mostly to educate myself
about how to organise and implement a larger-scale program than my
usual tiny little snippets.  The program has a central data structure
of units which are placed on a map.  Each unit has some information
like a name, movement points left, strength, and it's current location
on a 2D hex-map.  Units are implemented as maps, so a unit can look
like
{:name "Fighter 1" :movement [3 12] :strength [4 4] :location [1 2]}.
I hold the units in a map from locations to the sequence of units on
that location.  There is an atom that holds this map, so any change to
the data means basically creating a new map and resetting the atom.

So, when a unit moves, for example, I need to remove it from the
sequence at it's old location, and add it to the sequence in the new
location, and change it's location value and it's movement points
value.  In Java, this would be pretty straightforward.  But with
immutable data structures, it is quite clunky.  I have thought of some
alternatives:

1. Continue doing what I already am, perhaps write some functions that
hide the "ugliness" and get on with it.
2. Give each unit object an ID and hold a map from location to unit
IDs and from ID to the actual unit object, but that is kinda like
making immutable objects all over again.
3. Using mutable data, like Java's lists, maps, etc.  This is of
course extremely ugly and I would have to be strongly persuaded to go
down this route.

So, does anyone have any better ideas or is this type of program
always going to have some impedance with FP and immutable data?

Thanks

-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
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

Reply via email to