コード例 #1
0
ファイル: Sudoku.cs プロジェクト: 1NoobSaibot/SudokuLib
        private void createOfVoids(int Voids, RandomLocker rnd)
        {
            void r90(ref int x, ref int y)
            {
                int buf = 8 - y;

                y = x;
                x = buf;
            }

            int n4   = Voids / 4;
            int rest = Voids % 4;

            if (rest % 2 == 1)
            {
                cells[4, 4].Value = 0;
            }

            for (int i = 0; i < n4; i++)
            {
                int x, y;
                do
                {
                    x = rnd.Next() % 9;
                    y = rnd.Next() % 9;
                } while ((x == 4 && y == 4) || cells[x, y].Value == 0);

                cells[x, y].Value = 0;
                r90(ref x, ref y);
                cells[x, y].Value = 0;
                r90(ref x, ref y);
                cells[x, y].Value = 0;
                r90(ref x, ref y);
                cells[x, y].Value = 0;
            }

            if (rest / 2 == 1)
            {
                int x, y;
                do
                {
                    x = rnd.Next() % 9;
                    y = rnd.Next() % 9;
                } while ((x == 4 && y == 4) || cells[x, y].Value == 0);

                cells[x, y].Value = 0;
                r90(ref x, ref y);
                r90(ref x, ref y);
                cells[x, y].Value = 0;
            }
        }
コード例 #2
0
        // Нужен здесь для экономии времени на выделение/освобождение памяти


        /// <summary>
        /// Создаёт новый ряд итераторов идущих друг за другом
        /// </summary>
        /// <param name="used">Массив использования ячеек</param>
        /// <param name="cells">Массив ячеек</param>
        /// <param name="amount">Количество итераторов (Длинна ряда)</param>
        /// <param name="rnd">Генератор случайных чисел (Зачем он здесь нужен...)</param>
        internal Iterator(bool[,] used, Cell[,] cells, int amount, RandomLocker rnd)
        {
            // Процесс подбора случайной свободной ячейки из верхней линии
            int x, y;

            y = 8 - ((amount - 1) / 9);
            do
            {
                x = rnd.Next() % 9;
            } while (used[x, y]);

            // Когда нашли свободную
            cell       = cells[x, y]; // Забираем
            used[x, y] = true;        // себе

            // При условии, что мы не опустились до еденицы, создаём следующий итератор
            // И передаём остатки
            if (amount > 1)
            {
                next = new Iterator(used, cells, amount - 1, rnd);
            }
        }