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; } }