Пример #1
0
        /* Solve methods */

        // Solves a copy of the current board
        private bool SolveBoard()
        {
            if (_solvedBoard != null)
            {
                return(true);
            }

            // Copy the existing board and remove all non-predefined values
            AbstractBoard _copyOfBoard = (AbstractBoard)_board.Clone();

            _copyOfBoard.Clear();

            // Solve the copied board and assign to solved board
            Solver solver = new Solver(_copyOfBoard);

            if (solver.SolveBoard())
            {
                _solvedBoard = _copyOfBoard;
                return(true);
            }
            else
            {
                throw new UnsolvableBoardException();
            }
        }
Пример #2
0
        /// <summary>
        /// Difficulty:
        /// 0 - Easy
        /// 1 - Medium
        /// 2 - Hard
        /// 3 - Expert
        /// </summary>
        /// <param name="difficulty"></param>
        public void Generate(int difficulty)
        {
            bool maxBacktacking;

            do
            {
                maxBacktacking = false;
                Backtracking   = 0;
                _board.Clear();
                List <int>[,] triedNumbers = new List <int> [_board.GetBoardSize(), _board.GetBoardSize()];
                for (int i = 0; i < _board.GetBoardSize(); i++)
                {
                    for (int j = 0; j < _board.GetBoardSize(); j++)
                    {
                        if (Backtracking > 40000)
                        {
                            maxBacktacking = true;
                            break;
                        }
                        triedNumbers[i, j] = new List <int>();
                        fillBoard(i, j, ref triedNumbers);
                    }
                    if (maxBacktacking)
                    {
                        break;
                    }
                }

                Console.WriteLine("Backtracking iterations: {0}", Backtracking);
            } while (maxBacktacking);

            switch (_board.GetBoardSize()) //cells to clear depending on boardsize
            {
            case 4:
                remove(4, 6, 8, 10, difficulty);
                break;

            case 6:
                remove(12, 18, 24, 30, difficulty);
                break;

            case 9:
                remove(13, 30, 47, 64, difficulty);
                break;

            case 12:
                remove(40, 60, 80, 100, difficulty);
                break;

            case 16:
                remove(50, 75, 100, 150, difficulty);
                break;
            }

            _board.ConvertExistingNumbersToPredefined(); //set remaining numbers as predefined
        }