diff -r d41833895448 -r 28cc45444d44 minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 17:22:58 2014 +0100 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 20:22:14 2014 +0100 @@ -77,7 +77,7 @@ return name().startsWith("N_"); } - final SquareType moreBombs() { + final SquareType moreBombsAround() { switch (this) { case EXPLOSION: case UNKNOWN: @@ -121,8 +121,10 @@ List yBombs = new ArrayList(); final List rows = model.getRows(); boolean emptyHidden = false; + SquareType[][] arr = new SquareType[rows.size()][]; for (int y = 0; y < rows.size(); y++) { final List columns = rows.get(y).getColumns(); + arr[y] = new SquareType[columns.size()]; for (int x = 0; x < columns.size(); x++) { Square sq = columns.get(x); if (sq.isMine()) { @@ -130,7 +132,7 @@ yBombs.add(y); } if (sq.getState().isVisible()) { - sq.setState(SquareType.N_0); + arr[y][x] = SquareType.N_0; } else { if (!sq.isMine()) { emptyHidden = true; @@ -142,7 +144,17 @@ int x = xBombs.get(i); int y = yBombs.get(i); - incrementAround(model, x, y); + incrementAround(arr, x, y); + } + for (int y = 0; y < rows.size(); y++) { + final List columns = rows.get(y).getColumns(); + for (int x = 0; x < columns.size(); x++) { + Square sq = columns.get(x); + final SquareType newState = arr[y][x]; + if (newState != null && newState != sq.getState()) { + sq.setState(newState); + } + } } if (!emptyHidden) { @@ -151,25 +163,27 @@ } } - private static void incrementAround(Mines model, int x, int y) { - incrementAt(model, x - 1, y - 1); - incrementAt(model, x - 1, y); - incrementAt(model, x - 1, y + 1); + private static void incrementAround(SquareType[][] arr, int x, int y) { + incrementAt(arr, x - 1, y - 1); + incrementAt(arr, x - 1, y); + incrementAt(arr, x - 1, y + 1); - incrementAt(model, x + 1, y - 1); - incrementAt(model, x + 1, y); - incrementAt(model, x + 1, y + 1); + incrementAt(arr, x + 1, y - 1); + incrementAt(arr, x + 1, y); + incrementAt(arr, x + 1, y + 1); - incrementAt(model, x, y - 1); - incrementAt(model, x, y + 1); + incrementAt(arr, x, y - 1); + incrementAt(arr, x, y + 1); } - private static void incrementAt(Mines model, int x, int y) { - if (y >= 0 && y < model.getRows().size()) { - Row r = model.getRows().get(y); - if (x >= 0 && x < r.getColumns().size()) { - Square sq = r.getColumns().get(x); - sq.setState(sq.getState().moreBombs()); + private static void incrementAt(SquareType[][] arr, int x, int y) { + if (y >= 0 && y < arr.length) { + SquareType[] r = arr[y]; + if (x >= 0 && x < r.length) { + SquareType sq = r[x]; + if (sq != null) { + r[x] = sq.moreBombsAround(); + } } } }