import java.util.List; import java.util.Random; public class SudokuGenerator { public Board generate() { Board board = new Board(); fillBoard(board); makeSolvable(board, 50); return board; } private void fillBoard(Board board) { BoardManager bm = new BoardManager(); Random r = new Random(); bm.setBoard(board); int fieldsToFill = Field.POSSIBILITIES * Field.POSSIBILITIES; // set all fields with random numbers if possible // try to solve, if not possible remove one number and try again... for (int i = 0; i < fieldsToFill; i++) { int row = r.nextInt(Field.POSSIBILITIES); int fieldIndex = r.nextInt(Field.POSSIBILITIES); List remainingPos = bm.getField(Structure.ROW, row, fieldIndex) .getRemainingPos(); if (remainingPos.size() > 0) { int value = (Integer) remainingPos.get(r.nextInt(remainingPos .size())); boolean result = bm.trySetFieldPrivate(Structure.ROW, row, fieldIndex, new Field(value, true)); if (!result) { bm.undo(); } } else { bm.undo(); } } } private boolean makeSolvable(Board board, int steps) { BoardManager bm = new BoardManager(); bm.setBoard(board); Random r = new Random(); int k = steps; try { // board filled, check solution List solutions = bm.solve((Board) board.clone()); boolean solvable = !solutions.isEmpty(); while (k > 0) { // remove random number and try again board.removeRandomSetField(); solutions = bm.solve((Board) board.clone()); if (!solutions.isEmpty()) { return true; } k--; } } catch (CloneNotSupportedException e) { } return false; } }