minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java
branchminesweeper
changeset 68 d41833895448
parent 66 9cf895cde4bd
child 69 28cc45444d44
     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  }