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; + } + }