1.1 --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Jun 27 15:05:03 2014 +0200
1.2 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Jun 27 15:25:21 2014 +0200
1.3 @@ -41,7 +41,7 @@
1.4 })
1.5 public final class MinesModel {
1.6 enum GameState {
1.7 - IN_PROGRESS, WON, LOST;
1.8 + IN_PROGRESS, MARKING_MINE, WON, LOST;
1.9 }
1.10
1.11 @Model(className = "Row", properties = {
1.12 @@ -62,7 +62,7 @@
1.13
1.14 enum SquareType {
1.15 N_0, N_1, N_2, N_3, N_4, N_5, N_6, N_7, N_8,
1.16 - UNKNOWN, EXPLOSION, DISCOVERED;
1.17 + UNKNOWN, EXPLOSION, DISCOVERED, MARKED;
1.18
1.19 final boolean isVisible() {
1.20 return name().startsWith("N_");
1.21 @@ -100,6 +100,12 @@
1.22 model.setState(GameState.LOST);
1.23 }
1.24
1.25 + @Function static void markMine(Mines model) {
1.26 + if (model.getState() == GameState.IN_PROGRESS) {
1.27 + model.setState(GameState.MARKING_MINE);
1.28 + }
1.29 + }
1.30 +
1.31 @ModelOperation static void init(Mines model, int width, int height, int mines) {
1.32 List<Row> rows = model.getRows();
1.33 if (rows.size() != height || rows.get(0).getColumns().size() != width) {
1.34 @@ -224,9 +230,20 @@
1.35 }
1.36
1.37 @Function static void click(Mines model, Square data) {
1.38 + if (model.getState() == GameState.MARKING_MINE) {
1.39 + if (data.getState() == SquareType.UNKNOWN) {
1.40 + data.setState(SquareType.MARKED);
1.41 + }
1.42 + model.setState(GameState.IN_PROGRESS);
1.43 + return;
1.44 + }
1.45 if (model.getState() != GameState.IN_PROGRESS) {
1.46 return;
1.47 }
1.48 + if (data.getState() == SquareType.MARKED) {
1.49 + data.setState(SquareType.UNKNOWN);
1.50 + return;
1.51 + }
1.52 if (data.getState() != SquareType.UNKNOWN) {
1.53 return;
1.54 }