[rules-dev] pacman

Mark Proctor mproctor at codehaus.org
Wed Nov 18 16:25:46 EST 2009


The example has been updated to have a monster in it that tracks the 
Pacman's location, going in for the kill. I've done a blog that tracks 
my progress to date.
http://blog.athico.com/2009/11/drools-does-pacman.html

Mauricio Salatino wrote:
> heh.. nice.. I will add the Wii mote 
> (http://en.wikipedia.org/wiki/Wii_Remote) support for that game, it's 
> pretty easy. I have an example working.
>
> On Mon, Nov 16, 2009 at 11:55 AM, Mark Proctor <mproctor at codehaus.org 
> <mailto:mproctor at codehaus.org>> wrote:
>
>     For anyone interested i just did an initial commit for the rudementary
>     implementation parts for a Pacman game. Loads a Grid  and a Character
>     into the working memory and listens to the arrow keys to move the
>     Character around (text output only). It only accepts valid directions
>     and the Character cannot move off the grid, and score is updated as it
>     eats Food.
>
>     It also demostrates entry and exit points. For instance this rule has
>     it's "KeyListener" entry point hooked up to a KeyListener impl that
>     inserts KeyEvents. From the KeyEvent it creates a Derived (not in
>     working memory) possible Direction, validates that Direction. If valid
>     the old Direction is retracted and the new one inserted. I use the
>     exitpoint to send print information to a channel, which is appended to
>     the GUI.
>
>     /**
>      * Detects a new keypress (release). Creates derived possible
>     Direction
>     and validates it.
>      * If the Direction is valid, delete the old Direction and replace
>     with
>     the new one.
>      */
>     rule keyListenerRule dialect "mvel" when
>        $keyEvent : KeyEvent() from entry-point "KeyListener"
>        $l : Location()
>        $newD : Direction() from createDirection( $l.character, $keyEvent )
>        $target : Cell( row == ($l.row + $newD.vertical), col == ($l.col +
>     $newD.horizontal) )
>        CellContents( cell == $target, cellType != CellType.WALL )
>        $oldD : Direction( character == $l.character )
>     then
>        exitPoints["ConsoleExitPoint" ].insert( "insert " + $newD + "\n" );
>        retract( $keyEvent );
>        retract( $oldD );
>        insert( $newD );
>     end
>
>     As the Tick, simulated time, increases we attempt to change it's
>     Location based on the given Direction. We make sure the new
>     Location is
>     valid, and if so schedule the new Location, in time with the Tick.
>     /**
>      * Checks that the current Direction moves to a valid location,
>     i.e. not
>     a WALL.
>      * It does not set the new direction straight away, this is because we
>     need movement to be intime
>      * with the Tick increase, so we schedule the new Location instead.
>      */
>     rule validDirection dialect "mvel" when
>        $l : Location( )
>        $d : Direction( character == $l.character )
>        $target : Cell( row == ($l.row + $d.vertical), col == ($l.col +
>     $d.horizontal) )
>        CellContents( cell == $target, cellType != CellType.WALL )
>        not ScheduledLocationUpdate( location == $l )
>        $t : Tick()
>     then
>        insert( new ScheduledLocationUpdate($l, $l.row += $d.vertical,
>     $l.col += $d.horizontal, $t.tock + 1) );
>     end
>
>     /**
>      * When the Tick increases, update any Locations from inserted
>     scheduled
>     updates.
>      */
>     rule setNewDirection dialect "mvel" when
>        $s : ScheduledLocationUpdate()
>        $l : Location( this == $s.location )
>        Tick( tock == $s.tock )
>     then
>       exitPoints["ConsoleExitPoint"].insert( "set new Location " + $l +
>     "\n"  );
>       modify( $l ) { row = $s.row, col = $s.col };
>       retract( $s );
>     end
>
>     Notice the whole thing id driven relationally, because everything is
>     linked relationally we can exploit that to drive the engine
>     declaratively with only a few rules.
>
>     I've committed everything to drools-examples for now, you'll need
>     drools
>     trunk, as there are a few fixes necessary for this to work:
>     http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/
>     http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/resources/org/drools/examples/pacman/
>     http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/
>
>     The grid1.dat holds the grid layout, it's a declarative symbol layout,
>     trivial to change to explore new grids.
>
>     It's still very basic. Next I want to work on variable speed for
>     characters, then I'll start to add Monsters and power pellets. Once we
>     have the full backend working, the idea is to hook it up to an
>     existing
>     pacman gui such as SwtPacman. SwtPacman source code is available here:
>     http://www.jboss.org/community/wiki/pacman
>
>     I'll probably blog this later, as a few more bits are added. But
>     hopefully this will start to demonstrate to people some more complex
>     problems, and also help drive the drools team on how to improve our
>     language and engine.
>
>     Mark
>
>     _______________________________________________
>     rules-dev mailing list
>     rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>     https://lists.jboss.org/mailman/listinfo/rules-dev
>
>
>
>
> -- 
> - http://salaboy.wordpress.com
> - http://www.jbug.com.ar
> - Salatino "Salaboy" Mauricio -
> ------------------------------------------------------------------------
>
> _______________________________________________
> rules-dev mailing list
> rules-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20091118/35dfcaba/attachment.html 


More information about the rules-dev mailing list