# HG changeset patch # User Jaroslav Tulach # Date 1394374902 -3600 # Node ID ae4e3694c2d304a6d0cfb3a2951165bc4809ae79 # Parent 8ae7a8464c52741bf6ecf08cc05f9421d253c39c Faster computation of discovered non-mine squares diff -r 8ae7a8464c52 -r ae4e3694c2d3 minesweeper/src/main/java/org/apidesign/demo/minesweeper/Main.java --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/Main.java Sun Mar 09 15:03:01 2014 +0100 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/Main.java Sun Mar 09 15:21:42 2014 +0100 @@ -68,11 +68,14 @@ /** Launches the browser */ public static void main(String... args) throws Exception { + /* Logger l = Logger.getLogger("org.apidesign.html.dlvkbrwsr"); l.setLevel(Level.ALL); + l.setUseParentHandlers(false); ConsoleHandler ch = new ConsoleHandler(); ch.setLevel(Level.ALL); l.addHandler(ch); + */ BrowserBuilder.newBrowser(new XtrnlBrwsrPrsntr() { diff -r 8ae7a8464c52 -r ae4e3694c2d3 minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Sun Mar 09 15:03:01 2014 +0100 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Sun Mar 09 15:21:42 2014 +0100 @@ -245,6 +245,7 @@ } else { TOUCH.play(); expandKnown(model, data); + model.computeMines(); } break; } @@ -272,9 +273,18 @@ } final Square sq = columns.get(x); if (sq.getState() == SquareType.UNKNOWN) { - sq.setState(SquareType.N_0); - model.computeMines(); - if (sq.getState() == SquareType.N_0) { + int around = + minesAt(model, x - 1, y - 1) + + minesAt(model, x - 1, y) + + minesAt(model, x - 1, y + 1) + + minesAt(model, x , y - 1) + + minesAt(model, x, y + 1) + + minesAt(model, x + 1, y - 1) + + minesAt(model, x + 1, y) + + minesAt(model, x + 1, y + 1); + final SquareType t = SquareType.valueOf("N_" + around); + sq.setState(t); + if (t == SquareType.N_0) { expandKnown(model, x - 1, y - 1); expandKnown(model, x - 1, y); expandKnown(model, x - 1, y + 1); @@ -286,4 +296,17 @@ } } } + + private static int minesAt(Mines model, int x, int y) { + if (y < 0 || y >= model.getRows().size()) { + return 0; + } + final List columns = model.getRows().get(y).getColumns(); + if (x < 0 || x >= columns.size()) { + return 0; + } + Square sq = columns.get(x); + return sq.isMine() ? 1 : 0; + } + }