1.1 --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 14:47:07 2014 +0100
1.2 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 15:21:54 2014 +0100
1.3 @@ -66,8 +66,20 @@
1.4 }
1.5
1.6 enum SquareType {
1.7 +
1.8 N_0, N_1, N_2, N_3, N_4, N_5, N_6, N_7, N_8,
1.9 - UNKNOWN, MINE
1.10 + UNKNOWN, MINE;
1.11 +
1.12 + final boolean isVisible() {
1.13 + return name().startsWith("N_");
1.14 + }
1.15 +
1.16 + final SquareType moreBombs() {
1.17 + if (this == MINE || this == UNKNOWN) {
1.18 + return this;
1.19 + }
1.20 + return values()[ordinal() + 1];
1.21 + }
1.22 }
1.23
1.24 @ModelOperation static void init(Mines model, int width, int height, int mines) {
1.25 @@ -97,6 +109,54 @@
1.26 model.getRows().addAll(rows);
1.27 }
1.28
1.29 + @ModelOperation static void computeMines(Mines model) {
1.30 + List<Integer> xBombs = new ArrayList<Integer>();
1.31 + List<Integer> yBombs = new ArrayList<Integer>();
1.32 + final List<Row> rows = model.getRows();
1.33 + for (int y = 0; y < rows.size(); y++) {
1.34 + final List<Square> columns = rows.get(y).getColumns();
1.35 + for (int x = 0; x < columns.size(); x++) {
1.36 + Square sq = columns.get(x);
1.37 + if (sq.isMine()) {
1.38 + xBombs.add(x);
1.39 + yBombs.add(y);
1.40 + }
1.41 + if (sq.getState().isVisible()) {
1.42 + sq.setState(SquareType.N_0);
1.43 + }
1.44 + }
1.45 + }
1.46 + for (int i = 0; i < xBombs.size(); i++) {
1.47 + int x = xBombs.get(i);
1.48 + int y = yBombs.get(i);
1.49 +
1.50 + incrementAround(model, x, y);
1.51 + }
1.52 + }
1.53 +
1.54 + private static void incrementAround(Mines model, int x, int y) {
1.55 + incrementAt(model, x - 1, y - 1);
1.56 + incrementAt(model, x - 1, y);
1.57 + incrementAt(model, x - 1, y + 1);
1.58 +
1.59 + incrementAt(model, x + 1, y - 1);
1.60 + incrementAt(model, x + 1, y);
1.61 + incrementAt(model, x + 1, y + 1);
1.62 +
1.63 + incrementAt(model, x, y - 1);
1.64 + incrementAt(model, x, y + 1);
1.65 + }
1.66 +
1.67 + private static void incrementAt(Mines model, int x, int y) {
1.68 + if (y >= 0 && y < model.getRows().size()) {
1.69 + Row r = model.getRows().get(y);
1.70 + if (x >= 0 && x < r.getColumns().size()) {
1.71 + Square sq = r.getColumns().get(x);
1.72 + sq.setState(sq.getState().moreBombs());
1.73 + }
1.74 + }
1.75 + }
1.76 +
1.77 static void showAllBombs(Mines model) {
1.78 for (Row row : model.getRows()) {
1.79 for (Square square : row.getColumns()) {
1.80 @@ -119,6 +179,7 @@
1.81 model.setState(GameState.LOST);
1.82 } else {
1.83 data.setState(SquareType.N_0);
1.84 + model.computeMines();
1.85 }
1.86 break;
1.87 }
2.1 --- a/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Feb 07 14:47:07 2014 +0100
2.2 +++ b/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Feb 07 15:21:54 2014 +0100
2.3 @@ -23,6 +23,7 @@
2.4 */
2.5 package org.apidesign.demo.minesweeper;
2.6
2.7 +import org.apidesign.demo.minesweeper.MinesModel.SquareType;
2.8 import static org.testng.Assert.*;
2.9 import org.testng.annotations.Test;
2.10
2.11 @@ -43,4 +44,38 @@
2.12 }
2.13 assertEquals(cnt, 10, "Ten mines");
2.14 }
2.15 +
2.16 + @Test public void bombsSet() {
2.17 + Mines m = new Mines();
2.18 + m.init(10, 10, 0);
2.19 +
2.20 + set(m, 1, 1, SquareType.UNKNOWN, true);
2.21 + set(m, 0, 0, SquareType.N_0, false);
2.22 + set(m, 0, 1, SquareType.N_2, false);
2.23 + set(m, 0, 2, SquareType.N_3, false);
2.24 + set(m, 1, 0, SquareType.N_5, false);
2.25 + set(m, 2, 0, SquareType.N_8, false);
2.26 + set(m, 3, 0, SquareType.N_2, false);
2.27 +
2.28 + m.computeMines();
2.29 +
2.30 + assertSquare(m, 0, 0, SquareType.N_1);
2.31 + assertSquare(m, 1, 0, SquareType.N_1);
2.32 + assertSquare(m, 2, 0, SquareType.N_1);
2.33 + assertSquare(m, 3, 0, SquareType.N_0);
2.34 + assertSquare(m, 0, 1, SquareType.N_1);
2.35 + assertSquare(m, 0, 2, SquareType.N_1);
2.36 + assertSquare(m, 2, 2, SquareType.UNKNOWN);
2.37 + }
2.38 +
2.39 + private static void set(Mines m, int x, int y, SquareType squareType, boolean mine) {
2.40 + Square sq = m.getRows().get(y).getColumns().get(x);
2.41 + sq.setState(squareType);
2.42 + sq.setMine(mine);
2.43 + }
2.44 +
2.45 + private static void assertSquare(Mines m, int x, int y, SquareType t) {
2.46 + Square sq = m.getRows().get(y).getColumns().get(x);
2.47 + assertEquals(sq.getState(), t, "Expecting at " + x + ":" + y);
2.48 + }
2.49 }