[jboss-svn-commits] JBL Code SVN: r30176 - in labs/jbossrules/trunk/drools-examples/drools-examples-drl: src/main/java/org/drools/examples and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Nov 16 08:18:34 EST 2009


Author: mark.proctor at jboss.com
Date: 2009-11-16 08:18:33 -0500 (Mon, 16 Nov 2009)
New Revision: 30176

Added:
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Cell.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/CellContents.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/CellType.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Character.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Direction.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/DirectionEnum.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Location.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Main.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Monster.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/PacMan.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/PacmanGui.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/ScheduledLocationUpdate.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Score.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Tick.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/resources/org/drools/examples/pacman/
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/resources/org/drools/examples/pacman/grid1.dat
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/key-handlers.drl
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/pacman.drl
Modified:
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/.classpath
Log:
JBRULES-2342 Pacman
=Initial Commit

Modified: labs/jbossrules/trunk/drools-examples/drools-examples-drl/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/.classpath	2009-11-16 12:55:15 UTC (rev 30175)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/.classpath	2009-11-16 13:18:33 UTC (rev 30176)
@@ -8,8 +8,6 @@
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="lib" path="lib/foxtrot-2.0.jar"/>
 	<classpathentry kind="lib" path="lib/jgoodies-forms-1.0.4.jar"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/drools-api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/drools-compiler"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/drools-core"/>
+	<classpathentry kind="con" path="DROOLS/Drools"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Cell.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Cell.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Cell.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,25 @@
+package org.drools.examples.pacman;
+
+public class Cell {
+	private int row;
+	private int col;
+	
+	public Cell(int row, int col) {
+		super();
+		this.row = row;
+		this.col = col;
+	}
+	
+	public int getRow() {
+		return row;
+	}
+	
+	public int getCol() {
+		return col;
+	}	
+	
+	@Override
+    public String toString() {
+	    return "Cell " + row + ":" + col;
+	}
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/CellContents.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/CellContents.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/CellContents.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,25 @@
+package org.drools.examples.pacman;
+
+public class CellContents {
+    private Cell     cell;
+    private CellType cellType;
+
+    public CellContents(Cell cell,
+                        CellType cellType) {
+        this.cell = cell;
+        this.cellType = cellType;
+    }
+
+    public Cell getCell() {
+        return cell;
+    }
+
+    public CellType getCellType() {
+        return cellType;
+    }
+
+    @Override
+    public String toString() {
+        return "CellType " + cellType;
+    }
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/CellType.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/CellType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/CellType.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,8 @@
+package org.drools.examples.pacman;
+
+public enum CellType {
+    EMPTY,
+	FOOD,
+	POWER_PILL,
+	WALL;
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Character.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Character.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Character.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,14 @@
+package org.drools.examples.pacman;
+
+public class Character {
+    private int speed;
+
+    public int getSpeed() {
+        return speed;
+    }
+
+    public void setSpeed(int speed) {
+        this.speed = speed;
+    }
+  
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Direction.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Direction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Direction.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,64 @@
+package org.drools.examples.pacman;
+
+public class Direction {
+    public static final int LEFT  = -1;
+    public static final int RIGHT = 1;
+    public static final int UP    = 1;
+    public static final int DOWN  = -1;
+
+    private Character       character;
+    private int             horizontal;
+    private int             vertical;
+
+    public Direction(Character character,
+                     int horizontal,
+                     int vertical) {
+        this.character = character;
+        this.horizontal = horizontal;
+        this.vertical = vertical;
+    }
+
+    public Character getCharacter() {
+        return character;
+    }
+
+    public int getHorizontal() {
+        return horizontal;
+    }
+
+    public int getVertical() {
+        return vertical;
+    }
+    
+    public static Direction newDirection(Character character, DirectionEnum directionEnum) {
+        switch(directionEnum) {
+            case LEFT: {
+                return new Direction(character, -1, 0);
+            }
+            case RIGHT: {
+                return new Direction(character, 1, 0);
+            }
+            case UP: {
+                return new Direction(character, 0, 1);
+            }
+            case DOWN: {
+                return new Direction(character, 0, -1);
+            }
+            default: {
+                
+            }
+        }
+        throw new IllegalArgumentException( "Direction must be a valid DirectionEnum" );
+    }
+
+    @Override
+    public String toString() {
+        if ( horizontal != 0 ) {
+            return "Direction " + character + " " + ((horizontal == LEFT) ? "LEFT" : "RIGHT");
+        } else {
+            return "Direction " + character + " " + ((vertical == UP) ? "UP" : "DOWN");
+        }
+
+    }
+
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/DirectionEnum.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/DirectionEnum.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/DirectionEnum.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,8 @@
+/**
+ * 
+ */
+package org.drools.examples.pacman;
+
+public enum DirectionEnum {
+    UP, DOWN, LEFT, RIGHT;
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Location.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Location.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Location.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,40 @@
+package org.drools.examples.pacman;
+
+public class Location {
+	private Character character;
+	private int row;
+	private int col;
+	
+    public Location(Character character,
+                    int row,
+                    int col) {
+        this.character = character;
+        this.row = row;
+        this.col = col;
+    }
+
+    public Character getCharacter() {
+        return character;
+    }
+
+    public void setRow(int row) {
+        this.row = row;
+    }
+    
+    public int getRow() {
+        return row;
+    }
+
+    public int getCol() {
+        return col;
+    }	
+
+    public void setCol(int col) {
+        this.col = col;
+    }
+
+    @Override
+    public String toString() {
+	    return "Location " + character + " " + row + ":" + col;
+	}
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Main.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Main.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Main.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,128 @@
+package org.drools.examples.pacman;
+
+import java.io.BufferedReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.logger.KnowledgeRuntimeLoggerFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.rule.ConsequenceException;
+
+public class Main {
+    StatefulKnowledgeSession ksession = null;
+    PacMan                   pacMan;
+
+    public static void main(String[] args) throws Exception {
+        Main main = new Main();
+        main.initKsession();
+        main.buildGrid();
+        main.initGui();
+        main.run();
+    }
+
+    public void run() {
+        try {
+            // run forever
+            this.ksession.fireUntilHalt();
+        } catch ( ConsequenceException e ) {
+            throw e;
+        }
+    }
+
+    public void initKsession() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( "key-handlers.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+        kbuilder.add( ResourceFactory.newClassPathResource( "pacman.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        this.ksession = kbase.newStatefulKnowledgeSession();
+
+        this.pacMan = new PacMan();
+        this.pacMan.setSpeed( 1 );
+        this.ksession.insert( this.pacMan );
+
+        this.ksession.insert( new Score() );
+
+        KnowledgeRuntimeLoggerFactory.newThreadedFileLogger( this.ksession,
+                                                             "pacman.log",
+                                                             3000 );
+
+        Location location = new Location( this.pacMan,
+                                          1,
+                                          1 );
+        this.ksession.insert( location );
+
+        Tick tick = new Tick( 0 );
+        this.ksession.insert( tick );
+
+        // execute initialisation data and return
+        this.ksession.fireAllRules();
+    }
+
+    public void buildGrid() throws Exception {
+
+        BufferedReader reader = new BufferedReader( ResourceFactory.newClassPathResource( "grid1.dat",
+                                                                                          Main.class ).getReader() );
+
+        String line = null;
+        List<String> lines = new ArrayList<String>();
+        while ( (line = reader.readLine()) != null ) {
+            lines.add( line );
+        }
+
+        for ( int row = lines.size() - 1; row >= 0; row-- ) {
+            line = lines.get( row );
+            for ( int col = 0; col < line.length(); col++ ) {
+                char c = line.charAt( col );
+
+                Cell cell = new Cell( lines.size() - row - 1,
+                                      col );
+                CellContents contents = null;
+                switch ( c ) {
+                    case '*' : {
+                        contents = new CellContents( cell,
+                                                     CellType.WALL );
+                        break;
+                    }
+                    case '.' : {
+                        contents = new CellContents( cell,
+                                                     CellType.FOOD );
+                        break;
+                    }
+                    case '_' : {
+                        contents = new CellContents( cell,
+                                                     CellType.EMPTY );
+                        break;
+                    }
+                    default : {
+                        throw new IllegalArgumentException( "'" + c + "' is an invalid cell type" );
+                    }
+                }
+                System.out.println( cell + " : " + contents );
+                ksession.insert( cell );
+                ksession.insert( contents );
+            }
+        }
+    }
+
+    public void initGui() {
+        PacmanGui.init( this.ksession );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Monster.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Monster.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Monster.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,5 @@
+package org.drools.examples.pacman;
+
+public class Monster extends Character {
+
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/PacMan.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/PacMan.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/PacMan.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,8 @@
+package org.drools.examples.pacman;
+
+public class PacMan extends Character {
+    @Override
+    public String toString() {
+        return "pacman speed = " + getSpeed();
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/PacmanGui.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/PacmanGui.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/PacmanGui.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,151 @@
+package org.drools.examples.pacman;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+import org.drools.runtime.ExitPoint;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.rule.WorkingMemoryEntryPoint;
+
+public class PacmanGui extends JFrame
+    implements
+    KeyListener,
+    ActionListener {
+    JTextArea           displayArea;
+    static final String newline = System.getProperty( "line.separator" );
+    WorkingMemoryEntryPoint keyListenerEntryPoint;
+
+    public static void init(final StatefulKnowledgeSession ksession) {
+        try {
+            UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );
+            //UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
+            //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
+        } catch ( UnsupportedLookAndFeelException ex ) {
+            ex.printStackTrace();
+        } catch ( IllegalAccessException ex ) {
+            ex.printStackTrace();
+        } catch ( InstantiationException ex ) {
+            ex.printStackTrace();
+        } catch ( ClassNotFoundException ex ) {
+            ex.printStackTrace();
+        }
+        UIManager.put( "swing.boldMetal",
+                       Boolean.FALSE );
+
+        //Schedule a job for event dispatch thread:
+        //creating and showing this application's GUI.
+        try {
+            javax.swing.SwingUtilities.invokeAndWait( new Runnable() {
+                public void run() {
+                    createAndShowGUI(ksession);
+                }
+            } );
+        } catch ( Exception e ) {
+            throw new RuntimeException( e );
+        }
+    }
+
+    private static void createAndShowGUI(StatefulKnowledgeSession ksession) {
+        //Create and set up the window.
+        PacmanGui frame = new PacmanGui( "KeyEventDemo", ksession );
+        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
+
+        //Set up the content pane.
+        frame.addComponentsToPane();
+
+        //Display the window.
+        frame.pack();
+        frame.setVisible( true );
+    }
+    
+    public void appendText(final String string) {
+        javax.swing.SwingUtilities.invokeLater( new Runnable() {
+            public void run() {
+                displayArea.append( string );
+                displayArea.setCaretPosition(displayArea.getDocument().getLength());
+            }
+        } );                
+    }
+        
+    private void addComponentsToPane() {
+        JButton button = new JButton( "Clear" );
+        button.addActionListener( this );
+
+        displayArea = new JTextArea();
+        displayArea.setEditable( false );
+        JScrollPane scrollPane = new JScrollPane( displayArea );
+        scrollPane.setPreferredSize( new Dimension( 600,
+                                                    600 ) );
+        displayArea.addKeyListener( this );
+
+        getContentPane().add( scrollPane,
+                              BorderLayout.CENTER );
+        getContentPane().add( button,
+                              BorderLayout.PAGE_END );
+    }
+
+    public PacmanGui(String name, StatefulKnowledgeSession ksession) {
+        super( name );        
+        this.keyListenerEntryPoint = ksession.getWorkingMemoryEntryPoint( "KeyListener" );
+        ksession.registerExitPoint( "ConsoleExitPoint", new ConsoleExitPoint( this ) );
+    }
+    
+    public static class ConsoleExitPoint implements ExitPoint {        
+        private PacmanGui gui;
+        
+        public ConsoleExitPoint(PacmanGui gui) {
+            this.gui = gui;
+        }
+
+        public void insert(final Object arg) {
+            gui.appendText( (String) arg );
+        }
+        
+    }    
+
+    /** Handle the key typed event from the text field. */
+    public void keyTyped(KeyEvent e) {
+        // do nothing
+    }
+
+    public void keyPressed(KeyEvent e) {
+        // do nothing
+    }
+
+    public void keyReleased(KeyEvent e) {
+//        switch ( e.getKeyCode() ) {
+//            case 38 : { // UP
+//             break;   
+//            }
+//            case 40 : { // DOWN
+//                break;
+//            }
+//            case 37 : { // LEFt
+//                break;
+//            }
+//            case 39 : { // RIGHT
+//                break;
+//            }
+//            default: {
+//                
+//            }
+//        }
+        //System.out.println( e );
+        this.keyListenerEntryPoint.insert( e );
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        displayArea.setText( "" );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/ScheduledLocationUpdate.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/ScheduledLocationUpdate.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/ScheduledLocationUpdate.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,51 @@
+package org.drools.examples.pacman;
+
+public class ScheduledLocationUpdate {
+	private Location location;
+	private int row;
+	private int col;
+	private int tock;
+	
+    public ScheduledLocationUpdate(Location location,
+                    int row,
+                    int col,
+                    int tock) {
+        this.location = location;
+        this.row = row;
+        this.col = col;
+        this.tock = tock;
+    }
+
+    public Location getLocation() {
+        return location;
+    }
+
+    public void setRow(int row) {
+        this.row = row;
+    }
+    
+    public int getRow() {
+        return row;
+    }
+
+    public int getCol() {
+        return col;
+    }	
+
+    public void setCol(int col) {
+        this.col = col;
+    }
+
+    public int getTock() {
+        return tock;
+    }
+
+    public void setTock(int tock) {
+        this.tock = tock;
+    }
+
+    @Override
+    public String toString() {
+	    return "ScheduledLocationUpdate " + location.getCharacter() + " " + row + ":" + col;
+	}
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Score.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Score.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Score.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,15 @@
+package org.drools.examples.pacman;
+
+public class Score {
+    private int score;
+
+    public int getScore() {
+        return score;
+    }
+
+    public void setScore(int score) {
+        this.score = score;
+    }
+
+    
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Tick.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Tick.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/pacman/Tick.java	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,18 @@
+package org.drools.examples.pacman;
+
+public class Tick {
+    private int tock;
+
+    public Tick(int tock) {
+        this.tock = tock;
+    }
+    
+    public void setTock(int tock) {
+        this.tock = tock;
+    }
+
+    public int getTock() {
+        return tock;
+    }
+        
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/resources/org/drools/examples/pacman/grid1.dat
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/resources/org/drools/examples/pacman/grid1.dat	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/resources/org/drools/examples/pacman/grid1.dat	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,11 @@
+***********
+*.........*
+*.*******.*
+*.*******.*
+*.*******.*
+*.*******.*
+*.*******.*
+*.*******.*
+*.........*
+*_........*
+***********
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/key-handlers.drl
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/key-handlers.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/key-handlers.drl	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,79 @@
+package org.drools.examples.pacman
+
+import java.awt.event.KeyEvent;
+	
+
+/**
+ * Create a Direction for a character, based on a given keyCode. Return null
+ * if the keyCode does not map to an arrow key.
+ */	
+function Direction createDirection(Character character, KeyEvent keyCode) {
+    DirectionEnum directionEnum;
+    switch ( keyCode.getKeyCode() ) {    
+        case 38 : { // UP
+            directionEnum = DirectionEnum.UP;
+            break;   
+        }
+        case 40 : { // DOWN
+        	directionEnum = DirectionEnum.DOWN;
+            break;
+        }
+        case 37 : { // LEFT
+        directionEnum = DirectionEnum.LEFT;
+            break;
+        }
+        case 39 : { // RIGHT
+        	directionEnum = DirectionEnum.RIGHT;
+            break;
+        }
+        default: {                
+        	return null;
+        }
+    }
+    return Direction.newDirection( character, directionEnum );
+}
+
+/**
+ * This is relevant to game initialisation. No direction exists yet. When a keypress (release)
+ * is detected it creates derived possible Direction and validates it. If it's valid
+ * then insert it.
+ */
+rule keyListenerRuleNoDirection dialect "mvel"  no-loop 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 )    
+    not Direction( character == $l.character )
+then
+    exitPoints["ConsoleExitPoint" ].insert( "insert " + $newD + "\n" );
+    retract( $keyEvent );    
+    insert( $newD );
+end
+
+/**
+ * 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" no-loop 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
+
+/**
+ * This rule is needed to stop events building up, so if they don't match and fire, retract anyway
+ */
+rule keyListenerRuleRetractEvent dialect "mvel" salience -5 when
+    $keyEvent : KeyEvent() from entry-point "KeyListener"
+then
+    retract( $keyEvent );
+end
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/pacman.drl
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/pacman.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/pacman/pacman.drl	2009-11-16 13:18:33 UTC (rev 30176)
@@ -0,0 +1,68 @@
+package org.drools.examples.pacman
+
+/**
+ * This controls the flow of time in pacman, currently it's slow 500ms, to make it easy to visualise things as
+ * they happen
+ */
+rule increaseTick dialect "mvel" salience -1 duration 500 when
+    $t : Tick()
+then
+    modify( $t ) { tock +=  1 };
+    exitPoints["ConsoleExitPoint" ].insert( "tick " + $t.tock + "\n" );
+end
+
+/**
+ * The current Direction would move the Location into a WALL, so we can't move and need to retract the Direction,
+ * so that no futher movement for is attempted
+ */
+rule invalidDirection dialect "mvel" no-loop when
+    $l : Location( )
+    $d : Direction( character == $l.character )
+    $target : Cell( row == ($l.row + $d.vertical), col == ($l.col + $d.horizontal) )
+    $ct : CellContents( cell == $target, cellType == CellType.WALL )
+    Tick()        
+then
+    exitPoints["ConsoleExitPoint" ].insert( "retract " + $d + "\n" );
+    retract( $d );     
+end
+
+/**
+ * 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" no-loop 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" no-loop 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
+
+/**
+ * When we move onto a FOOD cell, increase the score
+ */
+rule eatFood dialect "mvel" no-loop when
+    $l : Location( )
+    $target : Cell( row == $l.row, col == $l.col)
+    CellContents( cell == $target, cellType == CellType.FOOD )
+    $s : Score()   
+then
+    modify( $s ) { score += 1 };    
+end
\ No newline at end of file



More information about the jboss-svn-commits mailing list