1.1 --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 16:41:45 2014 +0100
1.2 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 17:22:58 2014 +0100
1.3 @@ -57,7 +57,7 @@
1.4 @ComputedProperty static String text(SquareType state) {
1.5 if (state == null) return " ";
1.6 switch (state) {
1.7 - case MINE: return "B";
1.8 + case EXPLOSION: return "B";
1.9 case UNKNOWN: return "?";
1.10 case N_0: return " ";
1.11 }
1.12 @@ -70,17 +70,20 @@
1.13 }
1.14
1.15 enum SquareType {
1.16 -
1.17 N_0, N_1, N_2, N_3, N_4, N_5, N_6, N_7, N_8,
1.18 - UNKNOWN, MINE;
1.19 + UNKNOWN, EXPLOSION, DISCOVERED;
1.20
1.21 final boolean isVisible() {
1.22 return name().startsWith("N_");
1.23 }
1.24
1.25 final SquareType moreBombs() {
1.26 - if (this == MINE || this == UNKNOWN) {
1.27 - return this;
1.28 + switch (this) {
1.29 + case EXPLOSION:
1.30 + case UNKNOWN:
1.31 + case DISCOVERED:
1.32 + case N_8:
1.33 + return this;
1.34 }
1.35 return values()[ordinal() + 1];
1.36 }
1.37 @@ -144,6 +147,7 @@
1.38
1.39 if (!emptyHidden) {
1.40 model.setState(GameState.WON);
1.41 + showAllBombs(model, SquareType.DISCOVERED);
1.42 }
1.43 }
1.44
1.45 @@ -170,11 +174,11 @@
1.46 }
1.47 }
1.48
1.49 - static void showAllBombs(Mines model) {
1.50 + static void showAllBombs(Mines model, SquareType state) {
1.51 for (Row row : model.getRows()) {
1.52 for (Square square : row.getColumns()) {
1.53 if (square.isMine()) {
1.54 - square.setState(SquareType.MINE);
1.55 + square.setState(state);
1.56 }
1.57 }
1.58 }
1.59 @@ -188,13 +192,49 @@
1.60 switch (data.getState()) {
1.61 case UNKNOWN:
1.62 if (data.isMine()) {
1.63 - showAllBombs(model);
1.64 + showAllBombs(model, SquareType.EXPLOSION);
1.65 model.setState(GameState.LOST);
1.66 } else {
1.67 - data.setState(SquareType.N_0);
1.68 - model.computeMines();
1.69 + expandKnown(model, data);
1.70 }
1.71 break;
1.72 }
1.73 }
1.74 + private static void expandKnown(Mines model, Square data) {
1.75 + final List<Row> rows = model.getRows();
1.76 + for (int y = 0; y < rows.size(); y++) {
1.77 + final List<Square> columns = rows.get(y).getColumns();
1.78 + for (int x = 0; x < columns.size(); x++) {
1.79 + Square sq = columns.get(x);
1.80 + if (sq == data) {
1.81 + expandKnown(model, x, y);
1.82 + return;
1.83 + }
1.84 + }
1.85 + }
1.86 + }
1.87 + private static void expandKnown(Mines model, int x , int y) {
1.88 + if (y < 0 || y >= model.getRows().size()) {
1.89 + return;
1.90 + }
1.91 + final List<Square> columns = model.getRows().get(y).getColumns();
1.92 + if (x < 0 || x >= columns.size()) {
1.93 + return;
1.94 + }
1.95 + final Square sq = columns.get(x);
1.96 + if (sq.getState() == SquareType.UNKNOWN) {
1.97 + sq.setState(SquareType.N_0);
1.98 + model.computeMines();
1.99 + if (sq.getState() == SquareType.N_0) {
1.100 + expandKnown(model, x - 1, y - 1);
1.101 + expandKnown(model, x - 1, y);
1.102 + expandKnown(model, x - 1, y + 1);
1.103 + expandKnown(model, x , y - 1);
1.104 + expandKnown(model, x, y + 1);
1.105 + expandKnown(model, x + 1, y - 1);
1.106 + expandKnown(model, x + 1, y);
1.107 + expandKnown(model, x + 1, y + 1);
1.108 + }
1.109 + }
1.110 + }
1.111 }
2.1 --- a/minesweeper/src/main/webapp/pages/mines.css Fri Feb 07 16:41:45 2014 +0100
2.2 +++ b/minesweeper/src/main/webapp/pages/mines.css Fri Feb 07 17:22:58 2014 +0100
2.3 @@ -48,9 +48,12 @@
2.4 background-color: #D0D0D0;
2.5 cursor: pointer;
2.6 }
2.7 -table.field td.MINE {
2.8 +table.field td.EXPLOSION {
2.9 background-color: #f1100c;
2.10 }
2.11 +table.field td.DISCOVERED {
2.12 + background-color: #100cf1;
2.13 +}
2.14 .but-orientation {
2.15 margin-top:20px;
2.16 }
3.1 --- a/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Feb 07 16:41:45 2014 +0100
3.2 +++ b/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Feb 07 17:22:58 2014 +0100
3.3 @@ -79,6 +79,22 @@
3.4 assertEquals(m.getState(), MinesModel.GameState.WON, "All non-bomb squares discovered");
3.5 }
3.6
3.7 + @Test public void unhideNeibourghsOfEmptyPieces() {
3.8 + Mines m = new Mines();
3.9 + m.init(3, 3, 0);
3.10 + set(m, 0, 0, SquareType.UNKNOWN, true);
3.11 + MinesModel.click(m, m.getRows().get(2).getColumns().get(2));
3.12 +
3.13 + assertSquare(m, 0, 0, SquareType.DISCOVERED);
3.14 + assertSquare(m, 0, 1, SquareType.N_1);
3.15 + assertSquare(m, 1, 1, SquareType.N_1);
3.16 + assertSquare(m, 1, 0, SquareType.N_1);
3.17 + assertSquare(m, 2, 0, SquareType.N_0);
3.18 + assertSquare(m, 2, 1, SquareType.N_0);
3.19 + assertSquare(m, 2, 2, SquareType.N_0);
3.20 + assertSquare(m, 1, 2, SquareType.N_0);
3.21 + }
3.22 +
3.23 private static void set(Mines m, int x, int y, SquareType squareType, boolean mine) {
3.24 Square sq = m.getRows().get(y).getColumns().get(x);
3.25 sq.setState(squareType);