import javax.swing.JOptionPane; public class BoardManager { protected void setBusy(boolean busy) { for (int i = 0; i < sudokuViews.size(); i++) { ((Gui) sudokuViews.get(i)).setBusy(busy); } } protected boolean busy; public Board getBoard() { return this.board; } protected boolean trySetFieldPrivate(Structure structure, int structNr, int element, Field f) { return board.trySetField(structure, structNr, element, f); } public boolean trySetField(Structure structure, int structNr, int element, Field f) { preSetFieldWrapper(structure, structNr, element, f); boolean set = trySetFieldPrivate(structure, structNr, element, f); if (set) { updateSudokuViews(); return true; } else { undo(); return false; } } public boolean tryLoadFile(File f) throws IOException { preLoadWrapper(); board = new Board(); BufferedReader fileReader = new BufferedReader(new FileReader(f)); int digit = (Field.POSSIBILITIES / 10) + 1; int row = 0; while (row < Field.POSSIBILITIES) { String sudokuLine = fileReader.readLine(); int value; char c; //for (int i = 0; i < Field.POSSIBILITIES; i++) { // c = sudokuLine.charAt(i); // if (c != '.') { // value = Integer.parseInt(Character.toString(c)); // if (!trySetFieldPrivate(Structure.ROW, row, i, new Field(value,true))) { // board = null; // updateSudokuViews(); // return false; // } // } //} int extendedInt; char extendedC; if (digit == 1) { for (int i = 0; i < Field.POSSIBILITIES; i++) { c = sudokuLine.charAt(i); if (c != '.') { value = Integer.parseInt(Character.toString(c)); if (!trySetFieldPrivate(Structure.ROW, row, i, new Field(value,true))) { board = null; updateSudokuViews(); return false; } } } } else if (digit == 2) { for (int i = 0; i < Field.POSSIBILITIES * digit; i = i + digit) { c = sudokuLine.charAt(i); extendedC = sudokuLine.charAt(i + 1); if (c != '.' && extendedC != '.') { value = Integer.parseInt(Character.toString(c)) * 10; extendedInt = Integer.parseInt(Character.toString(extendedC)); value += extendedInt; if (!trySetFieldPrivate(Structure.ROW, row, (i/digit), new Field(value,true))) { board = null; updateSudokuViews(); return false; } } } } row++; } updateSudokuViews(); return true; } public boolean solutionHint() { //new ForcedField().trySolve(board); //if (true) { // updateSudokuViews(); // return true; //} if (board.isSolved()) return true; try { setBusy(true); List solutions = solve((Board) board.clone()); if (solutions.isEmpty()) { setBusy(false); return false; } for (int i = 0; i < Field.POSSIBILITIES; i++) for (int j = 0; j < Field.POSSIBILITIES; j++) if (!board.getField(Structure.ROW, i, j).isSet() && ((Board) solutions.get(0)).getField(Structure.ROW, i, j).isSet()) { trySetField(Structure.ROW, i, j, ((Board) solutions.get(0)).getField(Structure.ROW, i, j)); updateSudokuViews(); return true; } setBusy(false); } catch (CloneNotSupportedException e) { } return false; } protected List solve(Board board) { List solutions = new LinkedList(); List solvers = new LinkedList(); solvers.add(new ForcedField()); solvers.add(new ForcedNumber()); Guesser guesser = new Guesser(); for (int i = 0; i < solvers.size(); i++) if (!((Solver) solvers.get(i)).trySolve(board)) return solutions; if (!board.isSolved()) { List guessed = guesser.guess(board); for (int i = 0; i < guessed.size(); i++) solutions.addAll(solve(((Board)guessed.get(i)))); } else { solutions.add(board); } return solutions; } }