# HG changeset patch # User Jaroslav Tulach # Date 1391790178 -3600 # Node ID d4183389544876260b04079f23ed5333272a9aad # Parent 2e910e06ed3414082a608b39f815aad98fc67e12 Unhide all neighbourghs of empty pieces diff -r 2e910e06ed34 -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:41: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); + } + } + } } diff -r 2e910e06ed34 -r d41833895448 minesweeper/src/main/webapp/pages/mines.css --- a/minesweeper/src/main/webapp/pages/mines.css Fri Feb 07 16:41:45 2014 +0100 +++ b/minesweeper/src/main/webapp/pages/mines.css Fri Feb 07 17:22:58 2014 +0100 @@ -48,9 +48,12 @@ background-color: #D0D0D0; cursor: pointer; } -table.field td.MINE { +table.field td.EXPLOSION { background-color: #f1100c; } +table.field td.DISCOVERED { + background-color: #100cf1; +} .but-orientation { margin-top:20px; } diff -r 2e910e06ed34 -r d41833895448 minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java --- a/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Feb 07 16:41:45 2014 +0100 +++ b/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Feb 07 17:22:58 2014 +0100 @@ -79,6 +79,22 @@ assertEquals(m.getState(), MinesModel.GameState.WON, "All non-bomb squares discovered"); } + @Test public void unhideNeibourghsOfEmptyPieces() { + Mines m = new Mines(); + m.init(3, 3, 0); + set(m, 0, 0, SquareType.UNKNOWN, true); + MinesModel.click(m, m.getRows().get(2).getColumns().get(2)); + + assertSquare(m, 0, 0, SquareType.DISCOVERED); + assertSquare(m, 0, 1, SquareType.N_1); + assertSquare(m, 1, 1, SquareType.N_1); + assertSquare(m, 1, 0, SquareType.N_1); + assertSquare(m, 2, 0, SquareType.N_0); + assertSquare(m, 2, 1, SquareType.N_0); + assertSquare(m, 2, 2, SquareType.N_0); + assertSquare(m, 1, 2, SquareType.N_0); + } + private static void set(Mines m, int x, int y, SquareType squareType, boolean mine) { Square sq = m.getRows().get(y).getColumns().get(x); sq.setState(squareType);