/** * 13 rows keyboard input (4 supporting) - 0 or '.' as empty cell. * Any other character is being filtered out. * * @see SudokuStore#loadBoardFromStrings(String...) * @see SudokuStore#loadBoard(String[]) */ private void inputPuzzleFromKeyboard13rows() { JanetConsole.println("You will be asked for inputting 13 rows (4 supporting)."); JanetConsole.print("Row 1/13: "); String r1 = JanetConsole.readLine(); JanetConsole.print("Row 2/13: "); String r2 = JanetConsole.readLine(); JanetConsole.print("Row 3/13: "); String r3 = JanetConsole.readLine(); JanetConsole.print("Row 4/13: "); String r4 = JanetConsole.readLine(); JanetConsole.print("Row 5/13: "); String r5 = JanetConsole.readLine(); JanetConsole.print("Row 6/13: "); String r6 = JanetConsole.readLine(); JanetConsole.print("Row 7/13: "); String r7 = JanetConsole.readLine(); JanetConsole.print("Row 8/13: "); String r8 = JanetConsole.readLine(); JanetConsole.print("Row 9/13: "); String r9 = JanetConsole.readLine(); JanetConsole.print("Row 10/13: "); String r10 = JanetConsole.readLine(); JanetConsole.print("Row 11/13: "); String r11 = JanetConsole.readLine(); JanetConsole.print("Row 12/13: "); String r12 = JanetConsole.readLine(); JanetConsole.print("Row 13/13: "); String r13 = JanetConsole.readLine(); int[,] parsedPuzzle = SudokuStore.loadBoardFromStrings(r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13); if (parsedPuzzle != null) { trackPuzzleUndo(); puzzle = parsedPuzzle; } else { JanetConsole.println(">>> !!! Error - incorrect puzzle definition !!! <<<"); } }
/** * Load puzzle from file. * @see SudokuStore#loadBoard(String) */ private void loadFromFile() { JanetConsole.print("File path: "); String filePath = JanetConsole.readLine(); FileInfo file = new FileInfo(filePath); if (file.Exists == false) { JanetConsole.println(">>> !!! Error - file does not exist !!! <<<"); return; } DirectoryInfo dir = new DirectoryInfo(filePath); if (dir.Exists == true) { JanetConsole.println(">>> !!! Error - not a file !!! <<<"); return; } int[,] puzzleLoaded = SudokuStore.loadBoard(filePath); if (puzzleLoaded == null) { JanetConsole.println(">>> !!! Error - incorrect file content !!! <<<"); return; } trackPuzzleUndo(); puzzle = puzzleLoaded; }
/** * Solves current puzzle. * * @see SudokuSolver#findAllSolutions() */ private void solveFindAll() { solver = new SudokuSolver(puzzle); setSolverOptions(); int solutionsNumber = solver.findAllSolutions(); JanetConsole.println(">>>>>>>> Solutions found: " + solutionsNumber); if (solutionsNumber > 0) { List <SudokuBoard> solutions = solver.getAllSolutionsList(); for (int i = 0; i < solutionsNumber; i++) { SudokuBoard solution = solutions[i]; JanetConsole.println(">>>>> Solution nr: " + i + "/" + solutionsNumber); JanetConsole.println(">>>>> Path nr: " + solution.pathNumber); JanetConsole.println(">>>>> Computing time: " + solver.getComputingTime() + " s."); SudokuStore.consolePrintBoard(solution.board); JanetConsole.println(">>>>>"); JanetConsole.println(">>>>> Hit enter o to continue (non empty line will cancel)."); String line = JanetConsole.readLine(); if (line.Length > 0) { break; } } } else { JanetConsole.println(solver.getMessages()); } }
/** * Prints puzzle examples identifiers along with difficulty rating. */ private void listPuzzleExamples() { JanetConsole.println(""); for (int i = 0; i < SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES; i++) { JanetConsole.println(">>> Example nr: " + i + ", rating = " + (int)SudokuPuzzles.getPuzzleExampleRating(i)); } JanetConsole.println(""); }
/* * ======================================== * Quit from app * ======================================== */ /** * Displays info on app quit. */ private void quitFromApp() { JanetConsole.println(">>>"); JanetConsole.println(">>> Thank you for using Janet-Sudoku!"); JanetConsole.println(">>>"); JanetConsole.println(">>> Please visit:"); JanetConsole.println(">>> http://janetsudoku.mariuszgromada.org"); JanetConsole.println(">>> http://mathparser.org"); JanetConsole.println(">>> http://mathspace.pl"); JanetConsole.println(">>>"); JanetConsole.println(">>> Mariusz Gromada"); JanetConsole.println(">>> [email protected]"); }
/* * ======================================== * About info * ======================================== */ /** * Displays info about this app. */ private void displayAboutInto() { JanetConsole.println(">>>"); JanetConsole.println(">>> Janet-Sudoku Demo App based on the Janet-Sudoku Library."); JanetConsole.println(">>>"); JanetConsole.println(">>> Author: Mariusz Gromada"); JanetConsole.println(">>> [email protected]"); JanetConsole.println(">>> http://janetsudoku.mariuszgromada.org"); JanetConsole.println(">>>"); JanetConsole.println(">>> Demo App version: v." + VERSION); JanetConsole.println(">>> Janet-Sudoku version: v." + SudokuStore.JANET_SUDOKU_VERSION); JanetConsole.println(">>>"); }
/** * Prints menu to the console. */ internal void consolePrintMenue() { janetSudoku.consolePrintPuzzle(); JanetConsole.println(); JanetConsole.println("----- " + title + " -----"); for (int i = 3; i <= itemsNum; i++) { JanetConsole.println(content[i]); } JanetConsole.println("----- " + "General" + " -----"); JanetConsole.println(content[1]); JanetConsole.println(content[2]); JanetConsole.println(content[0]); }
/** * Generates puzzle based on current puzzle * (different puzzle, same solution). * * @see SudokuGenerator * @see SudokuGenerator#PARAM_DO_NOT_TRANSFORM * @see SudokuGenerator#generate() */ private void generateFromCurrentPuzzle() { generator = new SudokuGenerator(puzzle, SudokuGenerator.PARAM_DO_NOT_TRANSFORM); setGeneratorOptions(); int[,] generated = generator.generate(); if (generator.getGeneratorState() == SudokuGenerator.GENERATOR_GEN_FINISHED) { trackPuzzleUndo(); puzzle = generated; } else { JanetConsole.println(">>> !!! Error while generating puzzle !!! <<<"); JanetConsole.println(generator.getMessages()); } }
/** * Rate puzzle difficulty meaning as number of closed routes (number of * wrong guesses). * * @see SudokuStore#calculatePuzzleRating(int[,]) */ private void ratePuzzleDifficulty() { int rating = SudokuStore.calculatePuzzleRating(puzzle); if (rating >= 0) { JanetConsole.println(">>>"); JanetConsole.println(">>> Puzzle rating: " + rating); JanetConsole.println(">>>"); } else { JanetConsole.println(">>> !!! Error code: " + rating + " !!! <<<"); JanetConsole.println(">>> " + ErrorCodes.getErrorDescription(rating)); } }
/** * One line keyboard input (81 characters) * 0 or '.' as empty cell. * * @see SudokuStore#loadBoardFromStringLine(String) */ private void inputPuzzleFromKeyboard1Line() { JanetConsole.print("One line definition: "); String line = JanetConsole.readLine(); int[,] parsedPuzzle = SudokuStore.loadBoardFromStringLine(line); if (parsedPuzzle != null) { trackPuzzleUndo(); puzzle = parsedPuzzle; } else { JanetConsole.println(">>> !!! Error - incorrect puzzle definition !!! <<<"); } }
/** * Generates random puzzle with unique solution. * * @see SudokuGenerator * @see SudokuGenerator#PARAM_GEN_RND_BOARD * @see SudokuGenerator#generate() */ private void generateRandomPuzzle() { generator = new SudokuGenerator(SudokuGenerator.PARAM_GEN_RND_BOARD); setGeneratorOptions(); int[,] generated = generator.generate(); if (generator.getGeneratorState() == SudokuGenerator.GENERATOR_GEN_FINISHED) { trackPuzzleUndo(); puzzle = generated; } else { JanetConsole.println(">>> !!! Error while generating random puzzle !!! <<<"); JanetConsole.println(generator.getMessages()); } }
/** * Load puzzle from provided puzzle examples. * @see SudokuPuzzles * @see SudokuStore#getPuzzleExample(int) */ private void loadFromExample() { JanetConsole.println(); JanetConsole.print("Please provide example number (between 0 and " + (SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES - 1) + "): "); int example = JanetConsole.readInt(); if ((example >= 0) && (example < SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES)) { JanetConsole.println("Loading example: " + example); trackPuzzleUndo(); puzzle = SudokuStore.boardCopy(SudokuStore.getPuzzleExample(example)); } else { JanetConsole.println(">>> !!! Incorrect example number !!! <<<"); } }
/* * ======================================== * Save Menu * ======================================== */ /** * Saves current puzzle in the txt file. * * @see SudokuStore#saveBoard(int[,], String) */ private void savePuzzle() { JanetConsole.print("File path: "); String filePath = JanetConsole.readLine(); FileInfo file = new FileInfo(filePath); DirectoryInfo dir = new DirectoryInfo(filePath); if ((file.Exists == true) || (dir.Exists == true)) { JanetConsole.println(">>> !!! Error - file already exists !!! <<<"); return; } bool puzzleSaved = SudokuStore.saveBoard(puzzle, filePath); if (puzzleSaved == false) { JanetConsole.println(">>> !!! Error while saving !!! <<<"); } }
/** * Solves current puzzle. * * @see SudokuSolver#solve() * @see SudokuSolver#getSolvedBoard() * @see SudokuSolver#getSolvingState() */ private void solveFindFirst() { solver = new SudokuSolver(puzzle); setSolverOptions(); solver.solve(); if (solver.getSolvingState() == SudokuSolver.SOLVING_STATE_SOLVED) { trackPuzzleUndo(); puzzle = solver.getSolvedBoard(); JanetConsole.println("Path leading to the solution:"); JanetConsole.println(solver.solutionPathToString()); JanetConsole.println(">>>>> Computing time: " + solver.getComputingTime() + " s."); JanetConsole.println(">>>>> Closed routes: " + solver.getClosedRoutesNumber() + " s."); } else { JanetConsole.println(solver.getMessages()); } }
/** * Ask user for menu item selection. * @return Select item id {@link MenuData}. * * @see MenuData */ internal int getItem() { int selItem = 0; bool loop = true; do { consolePrintMenue(); JanetConsole.println(); JanetConsole.print("Your selection: "); selItem = JanetConsole.readInt(); if ((selItem >= 0) && (selItem <= itemsNum)) { loop = false; } else { JanetConsole.println(">>> !!! Please select correct menu item. !!! <<<"); } } while (loop == true); return(selItem); }
/** * Manually sets cell value. */ private void setCell() { JanetConsole.print(" Row number (between 1 and 9): "); int row = JanetConsole.readInt(); if ((row < 1) || (row > 9)) { JanetConsole.println(">>> !!! Error - incorrect row number !!! <<<"); return; } JanetConsole.print("Column number (between 1 and 9): "); int col = JanetConsole.readInt(); if ((col < 1) || (col > 9)) { JanetConsole.println(">>> !!! Error - incorrect column number !!! <<<"); return; } JanetConsole.print(" Digit (between 0 and 9): "); int digit = JanetConsole.readInt(); if ((digit < 0) || (digit > 9)) { JanetConsole.println(">>> !!! Error - incorrect digit !!! <<<"); return; } trackPuzzleUndo(); puzzle[row - 1, col - 1] = digit; }
/** * 9 rows keyboard input - 0 or '.' as empty cell. * Any other character is being filtered out. * * @see SudokuStore#loadBoardFromStrings(String...) * @see SudokuStore#loadBoard(String[]) */ private void inputPuzzleFromKeyboard9rows() { JanetConsole.println("You will be asked for inputting 9 rows."); JanetConsole.print("Row 1/9: "); String r1 = JanetConsole.readLine(); JanetConsole.print("Row 2/9: "); String r2 = JanetConsole.readLine(); JanetConsole.print("Row 3/9: "); String r3 = JanetConsole.readLine(); JanetConsole.print("Row 4/9: "); String r4 = JanetConsole.readLine(); JanetConsole.print("Row 5/9: "); String r5 = JanetConsole.readLine(); JanetConsole.print("Row 6/9: "); String r6 = JanetConsole.readLine(); JanetConsole.print("Row 7/9: "); String r7 = JanetConsole.readLine(); JanetConsole.print("Row 8/9: "); String r8 = JanetConsole.readLine(); JanetConsole.print("Row 9/9: "); String r9 = JanetConsole.readLine(); int[,] parsedPuzzle = SudokuStore.loadBoardFromStrings(r1, r2, r3, r4, r5, r6, r7, r8, r9); if (parsedPuzzle != null) { trackPuzzleUndo(); puzzle = parsedPuzzle; } else { JanetConsole.println(">>> !!! Error - incorrect puzzle definition !!! <<<"); } }
/** * Verifies solution existence * * @see SudokuSolver#checkIfUniqueSolution() */ private void evaluateSolutions() { solver = new SudokuSolver(puzzle); int solutionsInfo = solver.checkIfUniqueSolution(); JanetConsole.println(">>>"); if (solutionsInfo == SudokuSolver.SOLUTION_UNIQUE) { JanetConsole.println(">>> Solution exists and is unique!"); } else if (solutionsInfo == SudokuSolver.SOLUTION_NON_UNIQUE) { JanetConsole.println(">>> Solution exists but is non-unique!"); } else if (solutionsInfo == SudokuSolver.SOLUTION_NOT_EXISTS) { JanetConsole.println(">>> Solution does not exists."); } else { JanetConsole.println(solver.getMessages()); } JanetConsole.println(">>> Computing time: " + solver.getComputingTime() + " s."); }
/** * Error - when incorrect selection. */ private void incorrectSelection() { JanetConsole.println("Error - unrecognized menu item."); }
/** * Print current puzzle to the console */ internal void consolePrintPuzzle() { JanetConsole.println(); JanetConsole.print(">>> Random seed option - empty cells = " + rndSeedOnCells + ", free digits = " + rndSeedOnDigits); SudokuStore.consolePrintBoard(puzzle); }