Wumpus world continues to improve and is now fully playable. The UI has a lot more polish now and nearly all of the code has been moved to DRL now, including the swing graphics rendering for the cave and the sensor panels. You'll need to use master head to try it. Java is just used to build the kbase from the drl files and to create the swing panels, buttons and forms. WindowBuilder was used to graphical layout things.
The final thing I have to do is allow for client integration, so that people can write rules to automate the hero.
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/init.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/commands.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/collision.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/score.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/view/ui.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/view/paintCave.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/view/paintSensor.drl
Cave is hidden, playing the game purely with Sensors.
Cave is now shown, but unvisited rooms are greyed out.
Cheating reveals all, I have shot the Wumpus Dead
Window Builder with MigLayout was used to create the panels, buttons and forms
Here is the code to incrementally render the cave rooms:
The final thing I have to do is allow for client integration, so that people can write rules to automate the hero.
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/init.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/commands.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/collision.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/score.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/view/ui.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/view/paintCave.drl
https://github.com/droolsjbpm/drools/blob/master/drools-examples/src/main/resources/org/drools/examples/wumpus/view/paintSensor.drl
Cave is hidden, playing the game purely with Sensors.
Cave is now shown, but unvisited rooms are greyed out.
Cheating reveals all, I have shot the Wumpus Dead
Window Builder with MigLayout was used to create the panels, buttons and forms
Here is the code to incrementally render the cave rooms:
function void paintCaveCell(String image, Cell cell, GameView gv, GameUI gui) {
int rowIndent = 20;
int colIndent = 5;
int rowPad = cell.getRow() * gv.getCellPadding();
int colPad = cell.getCol() * gv.getCellPadding();
int y = (4 - cell.getRow()) * 50 - rowPad + rowIndent;
int x = cell.getCol() * 50 + colPad + colIndent;
Graphics caveG = gui.getCavePanel().getCaveG();
caveG.setColor( Color.WHITE ); // background
caveG.fillRect( x, y, gv.getCellWidth(), gv.getCellHeight() );
caveG.drawImage( ImageIO.read( GameView.class.getResource( image ) ), x, y, gv.getCellHeight(), gv.getCellWidth(), gui.getCavePanel() );
}
rule "Init CaveDirty" when
not CaveDirty()
then
insert( new CaveDirty() );
end
rule "Create CompositeImage" when
$c : Cell()
not CompositeImageName( cell == $c )
then
CompositeImageName cin = new CompositeImageName($c, "", "", "", "");
insert( cin );
end
rule "Reset CompositeImage" when
$cin : CompositeImageName()
not Cell( row == $cin.cell.row, col == $cin.cell.col)
then
retract( $cin );
end
rule "Base Paint" when
$c : Cell()
$cin : CompositeImageName( cell == $c );
then
end
rule "Paint Gold" extends "Base Paint" when
Gold(row == $c.row, col == $c.col)
then
modify( $cin ) { gold = "gold" };
end
rule "Paint Empty Gold" extends "Base Paint" when
not Gold(row == $c.row, col == $c.col)
then
modify( $cin ) { gold = "" };
end
rule "Paint Pit" extends "Base Paint" when
Pit(row == $c.row, col == $c.col)
then
modify( $cin ) { pit = "pit" };
end
rule "Paint Empty Pit" extends "Base Paint" when
not Pit(row == $c.row, col == $c.col)
then
modify( $cin ) { pit = "" };
end
rule "Paint Wumpus Alive" extends "Base Paint" when
Wumpus(alive == true, row == $c.row, col == $c.col)
then
modify( $cin ) { wumpus = "wumpus_alive" };
end
rule "Paint Wumpus Dead" extends "Base Paint" when
Wumpus(alive == false, row == $c.row, col == $c.col)
then
modify( $cin ) { wumpus = "wumpus_dead" }
end
rule "Paint Empty Wumpus" extends "Base Paint" when
not Wumpus(row == $c.row, col == $c.col)
then
modify( $cin ) { wumpus = "" }
end
rule "Paint Hero Direction Up" extends "Base Paint" when
$h : Hero( direction == Direction.UP, row == $c.row, col == $c.col )
then
modify( $cin ) { hero = "hero_up" };
end
rule "Paint Hero Direction Down" extends "Base Paint" when
$h : Hero( direction == Direction.DOWN, row == $c.row, col == $c.col )
then
modify( $cin ) { hero = "hero_down" };
end
rule "Paint Hero Direction Left" extends "Base Paint" when
$h : Hero( direction == Direction.LEFT, row == $c.row, col == $c.col )
then
modify( $cin ) { hero = "hero_left" };
end
rule "Paint Hero Direction Right" extends "Base Paint" when
$h : Hero( direction == Direction.RIGHT, row == $c.row, col == $c.col )
then
modify( $cin ) { hero = "hero_right" };
end
rule "Paint Empty Hero" extends "Base Paint" when
not Hero( row == $c.row, col == $c.col )
then
modify( $cin ) { hero = "" };
end
rule "Paint Hidden Room" when
$gui : GameUI( cavePanel != null && cavePanel.caveG != null )
$cd : CaveDirty() @watch(!*)
$gv : GameView(showAllCells == false)
$c : Cell(hidden == true)
then
paintCaveCell( "hidden_room.png", $c, $gv, $gui);
modify( $cd ) { dirty = true };
end
rule "Paint Empty Room" when
$gui : GameUI( cavePanel != null && cavePanel.caveG != null )
$cd : CaveDirty() @watch(!*)
($gv : GameView(showAllCells == true) and $c : Cell() ) or
($gv : GameView(showAllCells == false) and $c : Cell(hidden == false) )
CompositeImageName( cell == $c, pit == "", wumpus == "", gold == "", hero == "" ) @watch(*)
then
paintCaveCell( "empty_room.png", $c, $gv, $gui );
modify( $cd ) { dirty = true };
end
rule "Paint Non Empty Room" when
$gui : GameUI( cavePanel != null && cavePanel.caveG != null )
$cd : CaveDirty() @watch(!*)
($gv : GameView(showAllCells == true) and $c : Cell() ) or
($gv : GameView(showAllCells == false) and $c : Cell(hidden == false) )
$cin : CompositeImageName( cell == $c, ( !(hero != "" && pit != "") && // don't draw a hero on the same square as a pit or an alive wumpus, as the game is over
!(hero != "" && wumpus == "wumpus_alive") &&
!(pit == "" && wumpus == "" && gold == "" && hero == "") ) ) @watch(*)
then
paintCaveCell( $cin.pit + $cin.wumpus + $cin.gold + $cin.hero + ".png", $cin.cell, $gv, $gui );
modify( $cd ) { dirty = true };
end
rule "Redraw Cave" no-loop salience -500 when
$gui : GameUI()
$cd : CaveDirty( dirty == true )
then
$gui.updateCave();
modify( $cd ) { dirty = false };
end




No comments:
Post a Comment