Beispiel #1
0
        /// <summary>
        /// Removes fields from the full solution.
        /// </summary>
        /// <param name="level"></param>
        private void SetupBoard(SudokuLevel level)
        {
            for (int i = 0; i < 9; i++)
            {
                board[i] = new int?[9];
                for (int j = 0; j < 9; j++)
                {
                    board[i][j] = solution[i][j];
                }
            }

            int remainingItems = ((int)level + 1) * 20;

            while (remainingItems > 0)
            {
                int posX = random.Next(9);
                int posY = random.Next(9);
                if (board[posX][posY] == null)
                {
                    continue;
                }
                board[posX][posY] = null;
                remainingItems--;
            }
        }
Beispiel #2
0
        private int[,] GetNewSudoku(SudokuLevel level)
        {
            // Realiza la petición de un nuevo sudoku y espera a su recepción
            // Intenté hacerlo con async/await pero no conseguí hacerlo funcionar
            var request = client.GetAsync(string.Format(PARAMS, (int)level));

            request.Wait();

            var response = request.Result;

            response.EnsureSuccessStatusCode();

            var jsonStringAsync = response.Content.ReadAsStringAsync();

            jsonStringAsync.Wait();

            var jsonString    = jsonStringAsync.Result;
            var sudokuNumbers = JObject.Parse(jsonString)["squares"];

            var numbers = new int[Tamaño, Tamaño];

            foreach (var number in sudokuNumbers)
            {
                numbers[(int)number["y"], (int)number["x"]] = (int)number["value"];
                remainingNumbers--;
            }

            return(numbers);
        }
Beispiel #3
0
        public ISudokuResult Solve(int[,] data)
        {
            var result = _solver.Solve(data);

            result.Level = SudokuLevel.GetLevel(result);
            return(result);
        }
Beispiel #4
0
        public void IsMaxLimitExceededTest_Negativee()
        {
            var sudokuLevel      = new SudokuLevel(ESudokuLevel.Medium);
            var sudokuResultMock = new Mock <ISudokuResult>();

            Assert.IsFalse(sudokuLevel.IsMaxLimitExceeded(sudokuResultMock.Object));
        }
Beispiel #5
0
        public Sudoku(SudokuLevel level, Action SudokuLoaded)
        {
            CeldaCambiada += (fila, col, num) => { };

            // Se crea el cliente HTTP si es necesario
            if (client == null)
            {
                client             = new HttpClient();
                client.BaseAddress = new Uri(BASE_URI);
            }

            // Se solicita un nuevo sudoku al servicio en un nuevo hilo en segundo plano
            var downloadTask = Task.Factory.StartNew(() =>
            {
                _números = GetNewSudoku(level);
            });

            // Cuando la tarea anterior finalice, se ejecuta el resto del código y se avisa MainWindow que el sudoku está listo
            downloadTask.ContinueWith(new Action <Task>((t) =>
            {
                esInicial = new bool[Tamaño, Tamaño];
                for (int f = 0; f < Tamaño; ++f)
                {
                    for (int c = 0; c < Tamaño; ++c)
                    {
                        esInicial[f, c] = _números[f, c] > 0;
                    }
                }
                SudokuLoaded();
            }), TaskScheduler.FromCurrentSynchronizationContext());
        }
Beispiel #6
0
        /// <summary>
        /// Очистка случайных ячеек.
        /// Количество очищаемых ячеек взято Level*10 (при пяти уровнях это кажется нормальным)
        /// </summary>
        private void ClearCells(ref byte[,] grid)
        {
            // Уровень сложности игры
            int delete10 = (int)GameLevel;

            if (delete10 > 7)
            {
                // Не хотим допустить, чтобы судоку каким-то образом представляло собой пустое поле
                GameLevel = SudokuLevel.простейший;
            }

            // Очистка случайной ячейки из всего набора
            int index, x, y;

            for (int i = 0; i < delete10 * 10; i++)
            {
                // Выбор случайной не пустой ячейки
                do
                {
                    index = random.Next(81);
                    x     = index / 9;
                    y     = index % 9;
                }while (grid[x, y] == 0);

                // Очистка ячейки
                grid[x, y] = 0;
            }
        }
 private void RadioButton_Checked(object sender, RoutedEventArgs e)
 {
     level = RB_Easy.IsChecked == true ?
             SudokuLevel.EASY :
             RB_Med.IsChecked == true ?
             SudokuLevel.MEDIUM :
             SudokuLevel.HARD;
 }
Beispiel #8
0
        public void IsMaxLimitExceededTest_Positive()
        {
            var sudokuLevel      = new SudokuLevel(ESudokuLevel.Medium);
            var sudokuResultMock = new Mock <ISudokuResult>();

            sudokuResultMock.SetupGet(r => r.BackTrackCount).Returns(1000);
            Assert.IsTrue(sudokuLevel.IsMaxLimitExceeded(sudokuResultMock.Object));
        }
Beispiel #9
0
        public void IsMatchingTest_Negative_NotEnoughLevel()
        {
            var sudokuLevel      = new SudokuLevel(ESudokuLevel.Medium);
            var sudokuResultMock = new Mock <ISudokuResult>();

            sudokuResultMock.SetupGet(r => r.HasUniqueSolution).Returns(true);
            Assert.IsFalse(sudokuLevel.IsMatching(sudokuResultMock.Object));
        }
        /// <summary>
        /// Обработка выбора одного из уровней сложности игры
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void RadioButton_Click(object sender, EventArgs e)
        {
            // Сохранение выбора
            Level = (SudokuLevel)(((RadioButton)sender).Tag);

            // Закрытие формы выбора с возвратом положительного решения
            DialogResult = DialogResult.OK;
        }
Beispiel #11
0
        public void IsMatchingTest_Positive()
        {
            var sudokuLevel      = new SudokuLevel(ESudokuLevel.Medium);
            var sudokuResultMock = new Mock <ISudokuResult>();

            sudokuResultMock.SetupGet(r => r.HasUniqueSolution).Returns(true);
            sudokuResultMock.SetupGet(r => r.BackTrackCount).Returns(200);
            Assert.IsTrue(sudokuLevel.IsMatching(sudokuResultMock.Object));
        }
        public void GenerateTest()
        {
            var solver    = new ClassicSudokuSolver(EClassicSudokuType.Classic9x9);
            var generator = new ClassicSudokuGenerator(solver);
            var level     = new SudokuLevel(ESudokuLevel.Medium);
            var data      = generator.Generate(level);
            var resultOfSolvingGeneratedSudoku = solver.Solve(data.Data);

            Assert.IsTrue(resultOfSolvingGeneratedSudoku.HasUniqueSolution);
        }
 /// <summary>
 /// Посылка сообщения на WebSocket-сервер с запросом на начало новой игры
 /// </summary>
 /// <param name="level">Выбранный игроком уровень сложности</param>
 /// <param name="playerName">Имя игрока</param>
 public async void NewGameAsync(SudokuLevel level, string playerName)
 {
     GameLevel = level;
     inGame    = true;
     await SendMessage(new SocketMessage
     {
         messageType = MessageType.StartGame,
         level       = GameLevel,
         text        = playerName,
     });
 }
        /// <summary>
        /// Посылка на WebSocket-сервер сообщения о том, что игрок не хочет играть в игру с имеющимся уровнем сложности, а значит и принимать дальнейшего участия в текущей игре
        /// </summary>
        /// <param name="playerLevel">Уровень сложности, выбранный игроком</param>
        public async void PlayerOutOfGame(SudokuLevel playerLevel)
        {
            // Установка соответствующего флага
            inGame = false;

            // Отказ от получения сообщений
            await SendMessage(new SocketMessage
            {
                messageType = MessageType.OutOfGame,
                level       = playerLevel,
            });
        }
Beispiel #15
0
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="level">Уровень сложности игры</param>
        public GameSudoku(SudokuLevel level)
        {
            /// <summary>
            /// Таблица для создания условия новой игры.
            /// Начальное значение всегда одинаково, оно меняется в методах Shuffle и ClearCells, и таким образом получается условие очередной игры.
            /// </summary>
            byte[,] grid =
            {
                { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, // +
                { 4, 5, 6, 7, 8, 9, 1, 2, 3 }, // | первый горизонтальный регион
                { 7, 8, 9, 1, 2, 3, 4, 5, 6 }, // _

                { 2, 3, 4, 5, 6, 7, 8, 9, 1 }, // +
                { 5, 6, 7, 8, 9, 1, 2, 3, 4 }, // | второй горизонтальный регион
                { 8, 9, 1, 2, 3, 4, 5, 6, 7 }, // _

                { 3, 4, 5, 6, 7, 8, 9, 1, 2 }, // +
                { 6, 7, 8, 9, 1, 2, 3, 4, 5 }, // | третий горизонтальный регион
                { 9, 1, 2, 3, 4, 5, 6, 7, 8 } // _
                //   |  |   |  |___|- третий вертикальный регион
                //   |  |___|- второй вертикальный регион
                //___|- первый вертикальный регион
            };

            // Сохранение уровня сложности игры
            GameLevel = level;

            // Задание начального значения для счётчика псевдослучайных чисел
            random = new Random(DateTime.Now.Hour * DateTime.Now.Minute * DateTime.Now.Second);

            // Перемешивание начальной таблицы
            Shuffle(ref grid);

            // Очистка случайных ячеек в зависимости от уровня: чем он меньше, тем меньше клеток очищаем
            ClearCells(ref grid);

            // Перенос сформированного условия из массива байтов в ячейки игры
            FillSudokuCells(grid);
        }
Beispiel #16
0
        public void GenerateSudoku(SudokuLevel level)
        {
            GenerateSolution();

            SetupBoard(level);
        }