diff -r 9cf895cde4bd -r d41833895448 minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 16:35:45 2014 +0100 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 17:22:58 2014 +0100 @@ -57,7 +57,7 @@ @ComputedProperty static String text(SquareType state) { if (state == null) return " "; switch (state) { - case MINE: return "B"; + case EXPLOSION: return "B"; case UNKNOWN: return "?"; case N_0: return " "; } @@ -70,17 +70,20 @@ } enum SquareType { - N_0, N_1, N_2, N_3, N_4, N_5, N_6, N_7, N_8, - UNKNOWN, MINE; + UNKNOWN, EXPLOSION, DISCOVERED; final boolean isVisible() { return name().startsWith("N_"); } final SquareType moreBombs() { - if (this == MINE || this == UNKNOWN) { - return this; + switch (this) { + case EXPLOSION: + case UNKNOWN: + case DISCOVERED: + case N_8: + return this; } return values()[ordinal() + 1]; } @@ -144,6 +147,7 @@ if (!emptyHidden) { model.setState(GameState.WON); + showAllBombs(model, SquareType.DISCOVERED); } } @@ -170,11 +174,11 @@ } } - static void showAllBombs(Mines model) { + static void showAllBombs(Mines model, SquareType state) { for (Row row : model.getRows()) { for (Square square : row.getColumns()) { if (square.isMine()) { - square.setState(SquareType.MINE); + square.setState(state); } } } @@ -188,13 +192,49 @@ switch (data.getState()) { case UNKNOWN: if (data.isMine()) { - showAllBombs(model); + showAllBombs(model, SquareType.EXPLOSION); model.setState(GameState.LOST); } else { - data.setState(SquareType.N_0); - model.computeMines(); + expandKnown(model, data); } break; } } + private static void expandKnown(Mines model, Square data) { + final List rows = model.getRows(); + 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); + if (sq == data) { + expandKnown(model, x, y); + return; + } + } + } + } + private static void expandKnown(Mines model, int x , int y) { + if (y < 0 || y >= model.getRows().size()) { + return; + } + final List columns = model.getRows().get(y).getColumns(); + if (x < 0 || x >= columns.size()) { + return; + } + final Square sq = columns.get(x); + if (sq.getState() == SquareType.UNKNOWN) { + sq.setState(SquareType.N_0); + model.computeMines(); + if (sq.getState() == SquareType.N_0) { + expandKnown(model, x - 1, y - 1); + expandKnown(model, x - 1, y); + expandKnown(model, x - 1, y + 1); + expandKnown(model, x , y - 1); + expandKnown(model, x, y + 1); + expandKnown(model, x + 1, y - 1); + expandKnown(model, x + 1, y); + expandKnown(model, x + 1, y + 1); + } + } + } }