# HG changeset patch # User Jaroslav Tulach # Date 1403875521 -7200 # Node ID b56bc5060fac0a19f03fe2509f85c36b7ad35d93 # Parent 8236300893698d23f6c57ecd475f5d1d10772e99 Allowing to mark a field with a danger sign diff -r 823630089369 -r b56bc5060fac minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Jun 27 15:05:03 2014 +0200 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Jun 27 15:25:21 2014 +0200 @@ -41,7 +41,7 @@ }) public final class MinesModel { enum GameState { - IN_PROGRESS, WON, LOST; + IN_PROGRESS, MARKING_MINE, WON, LOST; } @Model(className = "Row", properties = { @@ -62,7 +62,7 @@ enum SquareType { N_0, N_1, N_2, N_3, N_4, N_5, N_6, N_7, N_8, - UNKNOWN, EXPLOSION, DISCOVERED; + UNKNOWN, EXPLOSION, DISCOVERED, MARKED; final boolean isVisible() { return name().startsWith("N_"); @@ -100,6 +100,12 @@ model.setState(GameState.LOST); } + @Function static void markMine(Mines model) { + if (model.getState() == GameState.IN_PROGRESS) { + model.setState(GameState.MARKING_MINE); + } + } + @ModelOperation static void init(Mines model, int width, int height, int mines) { List rows = model.getRows(); if (rows.size() != height || rows.get(0).getColumns().size() != width) { @@ -224,9 +230,20 @@ } @Function static void click(Mines model, Square data) { + if (model.getState() == GameState.MARKING_MINE) { + if (data.getState() == SquareType.UNKNOWN) { + data.setState(SquareType.MARKED); + } + model.setState(GameState.IN_PROGRESS); + return; + } if (model.getState() != GameState.IN_PROGRESS) { return; } + if (data.getState() == SquareType.MARKED) { + data.setState(SquareType.UNKNOWN); + return; + } if (data.getState() != SquareType.UNKNOWN) { return; } diff -r 823630089369 -r b56bc5060fac minesweeper/src/main/webapp/pages/index.html --- a/minesweeper/src/main/webapp/pages/index.html Fri Jun 27 15:05:03 2014 +0200 +++ b/minesweeper/src/main/webapp/pages/index.html Fri Jun 27 15:25:21 2014 +0200 @@ -61,6 +61,10 @@ Show Mines! + diff -r 823630089369 -r b56bc5060fac minesweeper/src/main/webapp/pages/mines.css --- a/minesweeper/src/main/webapp/pages/mines.css Fri Jun 27 15:05:03 2014 +0200 +++ b/minesweeper/src/main/webapp/pages/mines.css Fri Jun 27 15:25:21 2014 +0200 @@ -55,6 +55,10 @@ background-color: #D6E4E1; cursor: pointer; } +table.field td.MARKED { + background-color: #D6E4E1; + cursor: pointer; +} table.field td.EXPLOSION { background-color: #A31E39; } @@ -71,6 +75,9 @@ table.field td.DISCOVERED div::after { content: "\002714"; } +table.field td.MARKED div::after { + content: "\0026a0"; +} table.field td.N_0 div::after { content: " "; } diff -r 823630089369 -r b56bc5060fac minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java --- a/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Jun 27 15:05:03 2014 +0200 +++ b/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Jun 27 15:25:21 2014 +0200 @@ -45,6 +45,21 @@ assertEquals(cnt, 10, "Ten mines"); } + @Test public void clickRemovesMarkedSign() { + Mines m = new Mines(); + m.init(10, 10, 10); + + final Square sq = m.getRows().get(5).getColumns().get(5); + MinesModel.markMine(m); + MinesModel.click(m, sq); + + assertEquals(sq.getState(), SquareType.MARKED, "Changed to marked"); + + MinesModel.click(m, sq); + + assertEquals(sq.getState(), SquareType.UNKNOWN, "Changed back to unknown"); + } + @Test public void bombsSet() { Mines m = new Mines(); m.init(10, 10, 0);