1.1 --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 16:35: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 }