Sudoku - funkcja generująca puzzle


#1

Cześć,

staram się zrobić Sudoku w Unity C# i natknąłem się na problem który powoduje zwieszenie się silnika.
Może ktoś zauważy co jest nie tak i będzie mógł podpowiedzieć. Z góry dziękuję.

Tutaj funkcja stwarzająca kłopoty.

void GenerateMap()
{
    int visibleFieldCounter = 0;
    bool isThisFieldVisible = false;
    for (int i = 0; i < NUMBER_OF_ROWS_OR_COLUMNS; i++)
    {
        for (int j = 0; j < NUMBER_OF_ROWS_OR_COLUMNS; j++)
        {
            List<int> badNumbers = new List<int>();
            bool correctNumberInColumns = false;
            bool correctNumberInARow = false;
            int num = 0;
            bool repeatDrawing = false;

            while (correctNumberInARow == false || correctNumberInColumns == false)
            {
                repeatDrawing = false;
                correctNumberInARow = true;
                correctNumberInColumns = true;
                num = Random.Range(1, 10);

                foreach (var item in badNumbers)
                {
                    if (item == num)
                    {
                        repeatDrawing = true;
                        break;
                    }
                }
                if (repeatDrawing == true)
                {
                    correctNumberInARow = false;
                    correctNumberInColumns = false;
                    continue;
                }
                for (int k = 0; k < j; k++)
                {
                    if (num == _fieldsMap[k, i].number)
                    {
                        correctNumberInARow = false;
                        break;
                    }
                }
                if (correctNumberInARow == true)
                {
                    for (int l = 0; l < i; l++)
                    {
                        if (num == _fieldsMap[j, l].number)
                        {
                            correctNumberInColumns = false;
                            break;
                        }
                    }
                }
                if (correctNumberInARow == false || correctNumberInColumns == false)
                {
                    badNumbers.Add(num);
                }
            }

            if (visibleFieldCounter < NUMBER_OF_VISIBLE_FIELDS_ON_START)
            {
                if (Random.Range(1, 10) % 3 == 0)
                {
                    isThisFieldVisible = true;
                    visibleFieldCounter++;
                }
                else
                {
                    isThisFieldVisible = false;
                }
            }
            SpawnField(num, j, i, isThisFieldVisible);
        }
    }
}

#2

Nie umiem stwierdzić, jaki jest problem na pierwszy rzut oka, ale proponuje lekko inne podejscie, które będzie znacznie szybsze.

Zamiast losować liczbę i sprawdzać czy ona tam może być możesz zrobic forem tak jak teraz przejść przez wszystkie rzędy i kolumny, i dla każdej komórki sprawdzić (forem sprawdzającym resztę komórek z tego rzędu oraz drugim sprawdzającym resztę komórek z tej kolumny) jakie liczby możesz wpisać do tej komórki, po czym wylosować jedną z dostępnych.


#3

Też mi się w głowie kręci jak próbuję ten kod analizować ale jak aplikacja nie wywala Ci błędu w logach tzn, że tkwi w pętli która non stop się wykonuje czyli któryś warunek źle przewidziałeś.