diff -r 03bec9dcc860 -r f8f222243d3c minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Mon Feb 10 16:50:08 2014 +0100 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Sun Mar 16 08:30:22 2014 +0100 @@ -111,13 +111,23 @@ } @ModelOperation static void init(Mines model, int width, int height, int mines) { - List rows = new ArrayList(height); - for (int y = 0; y < height; y++) { - Square[] columns = new Square[width]; - for (int x = 0; x < width; x++) { - columns[x] = new Square(SquareType.UNKNOWN, false); + List rows = model.getRows(); + if (rows.size() != height || rows.get(0).getColumns().size() != width) { + rows = new ArrayList(height); + for (int y = 0; y < height; y++) { + Square[] columns = new Square[width]; + for (int x = 0; x < width; x++) { + columns[x] = new Square(SquareType.UNKNOWN, false); + } + rows.add(new Row(columns)); } - rows.add(new Row(columns)); + } else { + for (Row row : rows) { + for (Square sq : row.getColumns()) { + sq.setState(SquareType.UNKNOWN); + sq.setMine(false); + } + } } Random r = new Random(); @@ -133,8 +143,10 @@ } model.setState(GameState.IN_PROGRESS); - model.getRows().clear(); - model.getRows().addAll(rows); + if (rows != model.getRows()) { + model.getRows().clear(); + model.getRows().addAll(rows); + } } @ModelOperation static void computeMines(Mines model) { @@ -233,6 +245,7 @@ } else { TOUCH.play(); expandKnown(model, data); + model.computeMines(); } break; } @@ -260,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); @@ -274,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; + } + }