# HG changeset patch # User Jaroslav Tulach # Date 1391782914 -3600 # Node ID 3a82f9e6edddafac53f54757b0c434322ceaa042 # Parent 56477205fdb56cb5b7e7f6386b199a924b83f02f Shows number of bombs in the neibourhood diff -r 56477205fdb5 -r 3a82f9e6eddd minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 14:47:07 2014 +0100 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Fri Feb 07 15:21:54 2014 +0100 @@ -66,8 +66,20 @@ } enum SquareType { + N_0, N_1, N_2, N_3, N_4, N_5, N_6, N_7, N_8, - UNKNOWN, MINE + UNKNOWN, MINE; + + final boolean isVisible() { + return name().startsWith("N_"); + } + + final SquareType moreBombs() { + if (this == MINE || this == UNKNOWN) { + return this; + } + return values()[ordinal() + 1]; + } } @ModelOperation static void init(Mines model, int width, int height, int mines) { @@ -97,6 +109,54 @@ model.getRows().addAll(rows); } + @ModelOperation static void computeMines(Mines model) { + List xBombs = new ArrayList(); + List yBombs = new ArrayList(); + final List rows = model.getRows(); + for (int y = 0; y < rows.size(); y++) { + final List columns = rows.get(y).getColumns(); + for (int x = 0; x < columns.size(); x++) { + Square sq = columns.get(x); + if (sq.isMine()) { + xBombs.add(x); + yBombs.add(y); + } + if (sq.getState().isVisible()) { + sq.setState(SquareType.N_0); + } + } + } + for (int i = 0; i < xBombs.size(); i++) { + int x = xBombs.get(i); + int y = yBombs.get(i); + + incrementAround(model, x, y); + } + } + + private static void incrementAround(Mines model, int x, int y) { + incrementAt(model, x - 1, y - 1); + incrementAt(model, x - 1, y); + incrementAt(model, x - 1, y + 1); + + incrementAt(model, x + 1, y - 1); + incrementAt(model, x + 1, y); + incrementAt(model, x + 1, y + 1); + + incrementAt(model, x, y - 1); + incrementAt(model, x, y + 1); + } + + private static void incrementAt(Mines model, int x, int y) { + if (y >= 0 && y < model.getRows().size()) { + Row r = model.getRows().get(y); + if (x >= 0 && x < r.getColumns().size()) { + Square sq = r.getColumns().get(x); + sq.setState(sq.getState().moreBombs()); + } + } + } + static void showAllBombs(Mines model) { for (Row row : model.getRows()) { for (Square square : row.getColumns()) { @@ -119,6 +179,7 @@ model.setState(GameState.LOST); } else { data.setState(SquareType.N_0); + model.computeMines(); } break; } diff -r 56477205fdb5 -r 3a82f9e6eddd minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java --- a/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Feb 07 14:47:07 2014 +0100 +++ b/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Fri Feb 07 15:21:54 2014 +0100 @@ -23,6 +23,7 @@ */ package org.apidesign.demo.minesweeper; +import org.apidesign.demo.minesweeper.MinesModel.SquareType; import static org.testng.Assert.*; import org.testng.annotations.Test; @@ -43,4 +44,38 @@ } assertEquals(cnt, 10, "Ten mines"); } + + @Test public void bombsSet() { + Mines m = new Mines(); + m.init(10, 10, 0); + + set(m, 1, 1, SquareType.UNKNOWN, true); + set(m, 0, 0, SquareType.N_0, false); + set(m, 0, 1, SquareType.N_2, false); + set(m, 0, 2, SquareType.N_3, false); + set(m, 1, 0, SquareType.N_5, false); + set(m, 2, 0, SquareType.N_8, false); + set(m, 3, 0, SquareType.N_2, false); + + m.computeMines(); + + assertSquare(m, 0, 0, SquareType.N_1); + assertSquare(m, 1, 0, SquareType.N_1); + assertSquare(m, 2, 0, SquareType.N_1); + assertSquare(m, 3, 0, SquareType.N_0); + assertSquare(m, 0, 1, SquareType.N_1); + assertSquare(m, 0, 2, SquareType.N_1); + assertSquare(m, 2, 2, SquareType.UNKNOWN); + } + + private static void set(Mines m, int x, int y, SquareType squareType, boolean mine) { + Square sq = m.getRows().get(y).getColumns().get(x); + sq.setState(squareType); + sq.setMine(mine); + } + + private static void assertSquare(Mines m, int x, int y, SquareType t) { + Square sq = m.getRows().get(y).getColumns().get(x); + assertEquals(sq.getState(), t, "Expecting at " + x + ":" + y); + } }