Paradigms of artificial intelligence programming: case studies in Common LISP
By Peter Norvig has a full chapter on this (ch18),
complete with code in Common LISP.

his "Artificial Intelligence: A Modern Approach" is also a good book
if you are interested in game AI. 3rd edition just came out recently

On Fri, Aug 13, 2010 at 12:33 PM, Alan <a...@malloys.org> wrote:
> Funny you should mention this - I was about to post a question about
> my own game when I saw your article. My issue is, I assume someone has
> written minimax and/or alpha-beta pruning in Clojure (or a java
> library that's easy to interop with). My case is slightly different in
> that the turn order is not fixes - sometimes player X goes twice in a
> row - but it ought to be pretty simple to plug into a standard AI
> library. Does anyone know where I can find such a thing?
>
> On Aug 13, 6:51 am, Mike Anderson <mike.r.anderson...@gmail.com>
> wrote:
>> Hello all,
>>
>> I've recently been working on a game development project in Clojure
>> which is now starting to bear fruit. I thought people here might be
>> interested, and that it would be worthwhile to share some experiences
>> and perspectives.
>>
>> The project is a steampunk-themed strategy game, and a playable in-
>> development version is available here:
>>
>>    http://mikera.net/ironclad/
>>
>> Overall, I think Clojure is a fantastic language for game development.
>> Some thought on what makes it really compelling:
>>
>> 1. Immutable data structures work surprisingly well for games. I
>> represent the entire game state with a big defrecord, and the main
>> engine loop is basically:
>>   a) Get commands from player / AI (e.g. "Move unit from A to B")
>>   b) Convert each command into set of atomic updates ("Remove unit
>> from A", "Add unit to B")
>>   c) Apply updates sequentially to the game state
>>   d) Trigger any feedback to player e.g. animations, sounds
>>
>> 2. Concurrency support has been very helpful. With immutable game
>> state, it has been trivial to separate the game engine from the
>> renderer from the AI calculations - each effectively gets to operate
>> on its own "snapshot" of the entire game state. This can be a big
>> headache in many game engines that have to mediate access to a single,
>> mutable game state. I can also see even greater benefits when I
>> finally start adding some multi-player features.
>>
>> 3. High level, functional programming works great for rapid, iterative
>> and dynamic development. Of all the languages I've used, Clojure has
>> probably been quickest in terms of time required to add a given new
>> piece of functionality. For example, the map generator code probably
>> only took about 30 minutes to write, pretty good for a fractal
>> landscape generation system!
>>
>> 4. The Java interoperability support is fantastic - definitely counts
>> as one of the "killer features" of Clojure. I've been able to reuse a
>> lot of Java code libraries, both my own and standard libraries such as
>> Swing. As an example, I have a well optimised immutable persistent 2D
>> grid data structure in Java (basically a very efficient, spatially
>> partitioned map from (int,int) to Object) that I have been able to use
>> pretty much seamlessly in Clojure thanks to extend-protocol and
>> similar.
>>
>> Some interesting observations / discoveries / surprises in the
>> process:
>>
>> 1. The game worked first time on Mac and Linux, despite having been
>> tested exclusively on Windows. Great kudos to to both the Java
>> platform and the Clojure libraries!
>>
>> 2. Reflection is *really slow*. After getting 20-100x speedups from
>> eliminating reflection warnings in the AI code, I now treat any
>> reflection warning in code other than one-time setup code as a bug to
>> be fixed immediately.
>>
>> Finally, here are some things I think could be great improvements to
>> Clojure in the future from a game developer's perspective:
>>
>> 1. Better support for primitive parameters / return values / unchecked
>> arithmetic - in performance sensitive code, these are pretty much
>> essential. In a few cases in the graphics and AI code, I've had to
>> drop back to Java to get the performance I need.
>>
>> 2. It would be great to reduce the amount of memory allocations. Yes,
>> I know memory is plentiful and GC is very cheap, but it's still not as
>> cheap as stack allocation and any noticeable GC pauses are not good
>> for the player experience in interactive games. For this reason, I
>> find myself using reduce and indexed loops a lot more than I guess
>> would normally be idiomatic, and conversely tend to avoid some of the
>> lazy constructs and functions that generate sequences. While Clojure
>> is great for a strategy game, I'd probably hesitate to use it for a
>> real-time 3D game.
>>
>> 3. I think it would be great to have better support for circular
>> references - perhaps a two-pass compile? The reason this is
>> particularly acute in game development is that different subsystems
>> have quite a lot of inter-dependencies. AI evaluation system needs to
>> understand game state/engine so it can evaluate a position. Game state/
>> engine needs to understand units so it can manipulate them. Units need
>> to understand AI evaluation system so they can decide which actions to
>> take...... obviously it's possible to work around all this, but it's a
>> major pain, adds complexity and means that you need to structure code
>> to manage dependencies rather than in logical modules (which would be
>> easier to manage and maintain!)
>>
>> Would love to hear thoughts, and particularly any other experiences
>> people have had in using Clojure for game development!
>>
>>   Mike.
>
> --
> 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



-- 
Omnem crede diem tibi diluxisse supremum.

-- 
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