Пример #1
0
        /*
         * ========================================
         *                Load Menu
         * ========================================
         */
        /**
         * Load menu loop.
         */
        private void loopMenuLoad()
        {
            int  selItem;
            Menu menu = new Menu(MenuData.LOAD_TITLE, MenuData.LOAD_CONTENT, this);

            do
            {
                selItem = menu.getItem();
                switch (selItem)
                {
                case MenuData.LOAD_FROM_FILE: loadFromFile(); break;

                case MenuData.LOAD_EXAMPLE: loadFromExample(); break;

                case MenuData.LOAD_EMPTY_PUZZLE: trackPuzzleUndo(); puzzle = SudokuStore.boardCopy(SudokuPuzzles.PUZZLE_EMPTY); break;

                case MenuData.LOAD_LIST_EXAMPLES: listPuzzleExamples(); break;

                case MenuData.UNDO: performPuzzleUndo(); break;

                case MenuData.REDO: performPuzzleRedo(); break;

                default: incorrectSelection(); break;
                }
            } while (selItem != MenuData.RETURN);
        }
Пример #2
0
        /**
         * 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 !!! <<<");
            }
        }
Пример #3
0
 /**
  * Default constructor based on puzzle example.
  *
  * @param example         Example number between 0 and {@link SudokuPuzzles#NUMBER_OF_PUZZLE_EXAMPLES}.
  * @param parameters      Optional parameters.
  *
  * @see #PARAM_DO_NOT_SOLVE
  * @see #PARAM_DO_NOT_TRANSFORM
  * @see #PARAM_GEN_RND_BOARD
  */
 public SudokuGenerator(int example, params char[] parameters)
 {
     setParameters(parameters);
     initInternalVars();
     if ((example >= 0) && (example < SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES))
     {
         int[,] board = SudokuStore.boardCopy(SudokuStore.getPuzzleExample(example));
         if (transformBeforeGeneration == true)
         {
             boardInit(SudokuStore.seqOfRandomBoardTransf(board), "transformed example: " + example);
         }
         else
         {
             boardInit(board, "example: " + example);
         }
     }
     else
     {
         generatorState = GENERATOR_INIT_FAILED;
         addMessage("(SudokuGenerator) Generator not initialized incorrect example number: " + example + " - should be between 1 and " + SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES + ".", MSG_ERROR);
     }
 }
Пример #4
0
 /**
  * Default constructor based on random Sudoku puzzle example.
  *
  * @param parameters      Optional parameters.
  *
  * @see #PARAM_DO_NOT_SOLVE
  * @see #PARAM_DO_NOT_TRANSFORM
  * @see #PARAM_GEN_RND_BOARD
  */
 public SudokuGenerator(params char[] parameters)
 {
     setParameters(parameters);
     initInternalVars();
     if (generateRandomBoard == true)
     {
         boardInit(null, "random board");
     }
     else
     {
         int example = SudokuStore.randomIndex(SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES);
         int[,] board = SudokuStore.boardCopy(SudokuStore.getPuzzleExample(example));
         if (transformBeforeGeneration == true)
         {
             boardInit(SudokuStore.seqOfRandomBoardTransf(board), "transformed example: " + example);
         }
         else
         {
             boardInit(board, "example: " + example);
         }
     }
 }
Пример #5
0
 /**
  * Default constructor based on provided initial board.
  *
  * @param initialBoard    Array with the board definition.
  * @param parameters      Optional parameters
  *
  * @see #PARAM_DO_NOT_SOLVE
  * @see #PARAM_DO_NOT_TRANSFORM
  * @see #PARAM_GEN_RND_BOARD
  */
 public SudokuGenerator(int[,] initialBoard, params char[] parameters)
 {
     setParameters(parameters);
     initInternalVars();
     if (initialBoard == null)
     {
         generatorState = GENERATOR_INIT_FAILED;
         addMessage("(SudokuGenerator) Generator not initialized - null initial board.", MSG_ERROR);
     }
     else if (initialBoard.GetLength(0) != BOARD_SIZE)
     {
         generatorState = GENERATOR_INIT_FAILED;
         addMessage("(SudokuGenerator) Generator not initialized - incorrect number of rows in initial board, is: " + initialBoard.GetLength(0) + ",  expected: " + BOARD_SIZE + ".", MSG_ERROR);
     }
     else if (initialBoard.GetLength(1) != BOARD_SIZE)
     {
         generatorState = GENERATOR_INIT_FAILED;
         addMessage("(SudokuGenerator) Generator not initialized - incorrect number of columns in initial board, is: " + initialBoard.GetLength(1) + ", expected: " + BOARD_SIZE + ".", MSG_ERROR);
     }
     else if (SudokuStore.checkPuzzle(initialBoard) == false)
     {
         generatorState = GENERATOR_INIT_FAILED;
         addMessage("(SudokuGenerator) Generator not initialized - initial board contains an error.", MSG_ERROR);
     }
     else
     {
         int[,] board = SudokuStore.boardCopy(initialBoard);
         if (transformBeforeGeneration == true)
         {
             boardInit(SudokuStore.seqOfRandomBoardTransf(board), "transformed board provided by the user");
         }
         else
         {
             boardInit(board, "board provided by the user");
         }
     }
 }
Пример #6
0
        /**
         * Test scenario implementation.
         * @param testId        Test id.
         * @param threadId      Thread id.
         * @return              True is test successful, otherwise false.
         */
        static bool runTest(int testId, int threadId)
        {
            bool   testResult = true;
            String testDesc = "", resultDesc = "";

            int[,] a =
            {
                { 0, 0, 0, 8, 0, 0, 0, 0, 0 },
                { 4, 0, 0, 0, 1, 5, 0, 3, 0 },
                { 0, 2, 9, 0, 4, 0, 5, 1, 8 },
                { 0, 4, 0, 0, 0, 0, 1, 2, 0 },
                { 0, 0, 0, 6, 0, 2, 0, 0, 0 },
                { 0, 3, 2, 0, 0, 0, 0, 9, 0 },
                { 6, 9, 3, 0, 5, 0, 8, 7, 0 },
                { 0, 5, 0, 4, 8, 0, 0, 0, 1 },
                { 0, 0, 0, 0, 0, 3, 0, 0, 0 }
            };
            switch (testId)
            {
            case 0:
                testDesc = "SudokuSolver.setCell(int, int, int)";
                {
                    SudokuSolver s = new SudokuSolver();
                    s.setCell(0, 0, 0);
                    s.setCell(1, 0, 4);
                    s.setCell(2, 0, 0);
                    s.setCell(3, 0, 0);
                    s.setCell(4, 0, 0);
                    s.setCell(5, 0, 0);
                    s.setCell(6, 0, 6);
                    s.setCell(7, 0, 0);
                    s.setCell(8, 0, 0);
                    s.setCell(0, 1, 0);
                    s.setCell(1, 1, 0);
                    s.setCell(2, 1, 2);
                    s.setCell(3, 1, 4);
                    s.setCell(4, 1, 0);
                    s.setCell(5, 1, 3);
                    s.setCell(6, 1, 9);
                    s.setCell(7, 1, 5);
                    s.setCell(8, 1, 0);
                    s.setCell(0, 2, 0);
                    s.setCell(1, 2, 0);
                    s.setCell(2, 2, 9);
                    s.setCell(3, 2, 0);
                    s.setCell(4, 2, 0);
                    s.setCell(5, 2, 2);
                    s.setCell(6, 2, 3);
                    s.setCell(7, 2, 0);
                    s.setCell(8, 2, 0);
                    s.setCell(0, 3, 8);
                    s.setCell(1, 3, 0);
                    s.setCell(2, 3, 0);
                    s.setCell(3, 3, 0);
                    s.setCell(4, 3, 6);
                    s.setCell(5, 3, 0);
                    s.setCell(6, 3, 0);
                    s.setCell(7, 3, 4);
                    s.setCell(8, 3, 0);
                    s.setCell(0, 4, 0);
                    s.setCell(1, 4, 1);
                    s.setCell(2, 4, 4);
                    s.setCell(3, 4, 0);
                    s.setCell(4, 4, 0);
                    s.setCell(5, 4, 0);
                    s.setCell(6, 4, 5);
                    s.setCell(7, 4, 8);
                    s.setCell(8, 4, 0);
                    s.setCell(0, 5, 0);
                    s.setCell(1, 5, 5);
                    s.setCell(2, 5, 0);
                    s.setCell(3, 5, 0);
                    s.setCell(4, 5, 2);
                    s.setCell(5, 5, 0);
                    s.setCell(6, 5, 0);
                    s.setCell(7, 5, 0);
                    s.setCell(8, 5, 3);
                    s.setCell(0, 6, 0);
                    s.setCell(1, 6, 0);
                    s.setCell(2, 6, 5);
                    s.setCell(3, 6, 1);
                    s.setCell(4, 6, 0);
                    s.setCell(5, 6, 0);
                    s.setCell(6, 6, 8);
                    s.setCell(7, 6, 0);
                    s.setCell(8, 6, 0);
                    s.setCell(0, 7, 0);
                    s.setCell(1, 7, 3);
                    s.setCell(2, 7, 1);
                    s.setCell(3, 7, 2);
                    s.setCell(4, 7, 0);
                    s.setCell(5, 7, 9);
                    s.setCell(6, 7, 7);
                    s.setCell(7, 7, 0);
                    s.setCell(8, 7, 0);
                    s.setCell(0, 8, 0);
                    s.setCell(1, 8, 0);
                    s.setCell(2, 8, 8);
                    s.setCell(3, 8, 0);
                    s.setCell(4, 8, 0);
                    s.setCell(5, 8, 0);
                    s.setCell(6, 8, 0);
                    s.setCell(7, 8, 1);
                    s.setCell(8, 8, 0);
                    int[,] b = s.getBoard();

                    if ((SudokuStore.boardsAreEqual(a, b) == true))
                    {
                        resultDesc = "Expecting equal - are equal.";
                    }
                    else
                    {
                        resultDesc = "Expecting equal - are not equal.";
                        testResult = false;
                        SudokuStore.consolePrintln(s.getMessages());
                    }
                }
                break;

            case 1:
                testDesc = "SudokuSolver.getCellDigit(int, int)";
                {
                    SudokuSolver s1 = new SudokuSolver(a);
                    SudokuSolver s2 = new SudokuSolver();
                    for (int i = 0; i < SudokuBoard.BOARD_SIZE; i++)
                    {
                        for (int j = 0; j < SudokuBoard.BOARD_SIZE; j++)
                        {
                            int d = s1.getCellDigit(i, j);
                            s2.setCell(i, j, d);
                        }
                    }
                    int[,] b = s2.getBoard();
                    if ((SudokuStore.boardsAreEqual(a, b) == true))
                    {
                        resultDesc = "Expecting equal - are equal.";
                    }
                    else
                    {
                        resultDesc = "Expecting equal - are not equal.";
                        testResult = false;
                    }
                }
                break;

            case 2:
                testDesc = "SudokuSolver.getBoardCopy()";
                {
                    SudokuSolver s = new SudokuSolver(a);
                    int[,] b = s.getBoard();
                    int[,] c = s.getBoardCopy();
                    if ((SudokuStore.boardsAreEqual(b, c) == true))
                    {
                        resultDesc = "Expecting equal - are equal.";
                    }
                    else
                    {
                        resultDesc = "Expecting equal - are not equal.";
                        testResult = false;
                    }
                }
                break;

            case 3:
                testDesc = "SudokuSolver.getSolutionBoardCells()";
                {
                    SudokuSolver s = new SudokuSolver(a);
                    s.solve();
                    int[,] b = s.getSolvedBoard();
                    int[,] c = SudokuStore.boardCopy(a);
                    BoardCell[] sol = s.getSolutionBoardCells();
                    foreach (BoardCell bc in sol)
                    {
                        c[bc.rowIndex, bc.colIndex] = bc.digit;
                    }

                    if ((SudokuStore.boardsAreEqual(b, c) == true))
                    {
                        resultDesc = "Expecting equal - are equal.";
                    }
                    else
                    {
                        resultDesc = "Expecting equal - are not equal.";
                        testResult = false;
                    }
                }
                break;

            case 4:
                testDesc = "SudokuSolver.getAllBoardCells()";
                {
                    SudokuSolver s = new SudokuSolver(a);
                    int[,] b = s.getBoardCopy();
                    int[,] c = new int[SudokuBoard.BOARD_SIZE, SudokuBoard.BOARD_SIZE];
                    BoardCell[] bc = s.getAllBoardCells();
                    foreach (BoardCell cell in bc)
                    {
                        c[cell.rowIndex, cell.colIndex] = cell.digit;
                    }
                    if ((SudokuStore.boardsAreEqual(b, c) == true))
                    {
                        resultDesc = "Expecting equal - are equal.";
                    }
                    else
                    {
                        resultDesc = "Expecting equal - are not equal.";
                        testResult = false;
                    }
                }
                break;

            case 5:
                testDesc = "SudokuSolver.getAllSolutionsList()";
                {
                    SudokuSolver s = new SudokuSolver(SudokuPuzzles.PUZZLE_NON_UNIQUE_SOLUTION);
                    s.findAllSolutions();
                    List <SudokuBoard> solList;
                    solList = s.getAllSolutionsList();
                    foreach (SudokuBoard sb in solList)
                    {
                        if (SudokuStore.checkSolvedBoard(sb.board) == false)
                        {
                            testResult = false;
                            break;
                        }
                    }
                    if (testResult == true)
                    {
                        resultDesc = "Expecting each solution valid - each is valid.";
                    }
                    else
                    {
                        resultDesc = "Expecting each solution valid - found not valid.";
                    }
                }
                break;

            case 6:
                testDesc = "SudokuGenerator -> generate -> save -> load -> compare";
                {
                    String          filePath = FileX.getTmpDir() + FileX.genRndFileName(20, "txt");
                    SudokuGenerator g        = new SudokuGenerator(SudokuGenerator.PARAM_GEN_RND_BOARD);
                    int[,] generated = g.generate();
                    g.saveBoard(filePath, "generated", "saved");
                    int[,] loaded = SudokuStore.loadBoard(filePath);
                    FileX.removeFile(filePath);
                    if (SudokuStore.boardsAreEqual(generated, loaded) == false)
                    {
                        testResult = false;
                    }
                    if (testResult == true)
                    {
                        resultDesc = "Expecting equal - are equal.";
                    }
                    else
                    {
                        resultDesc = "Expecting equal - are not equal.";
                    }
                }
                break;

            case 7:
                testDesc = "SudokuSolver -> solve -> save -> load -> compare";
                {
                    String       filePath = FileX.getTmpDir() + FileX.genRndFileName(20, "txt");
                    SudokuSolver s        = new SudokuSolver(SudokuStore.getPuzzleExample());
                    s.solve();
                    int[,] solved = s.getSolvedBoard();
                    s.saveSolvedBoard(filePath, "solved", "saved");
                    int[,] loaded = SudokuStore.loadBoard(filePath);
                    FileX.removeFile(filePath);
                    if (SudokuStore.boardsAreEqual(solved, loaded) == false)
                    {
                        testResult = false;
                    }
                    if (testResult == true)
                    {
                        resultDesc = "Expecting equal - are equal.";
                    }
                    else
                    {
                        resultDesc = "Expecting equal - are not equal.";
                    }
                }
                break;
            }
            if (testResult == true)
            {
                SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + " " + testDesc + " " + resultDesc + " >>> ApiTests, result: OK");
            }
            else
            {
                SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + " " + testDesc + " " + resultDesc + " >>> ApiTests, result: ERROR");
            }
            return(testResult);
        }
Пример #7
0
 /**
  * Default constructor.
  */
 public JanetSudoku()
 {
     puzzle          = SudokuStore.boardCopy(SudokuPuzzles.PUZZLE_EMPTY);
     rndSeedOnCells  = true;
     rndSeedOnDigits = true;
 }
Пример #8
0
 /**
  * Tracks puzzle redo.
  */
 private void trackPuzzleRedo()
 {
     puzzleRedo = SudokuStore.boardCopy(puzzle);
 }