Создание головоломок судоку с помощью JavaScript - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь создать генератор судоку для веб-сайта. Я подумал, что могу генерировать головоломки путем случайного выбора чисел для заполнения разделов, пока я следую ограничениям Судоку. И чтобы я не выбирал одно и то же число дважды, я делаю уникальный массив из общих значений любой строки, столбца и раздела, в котором я нахожусь.

Моя проблема заключается в том, что я хочу вернуться назад и "пополнять" раздел всякий раз, когда я сталкиваюсь с ситуацией, подобной приведенной ниже.

984 | 165
561 | 982
372 | 4

При попытке вернуться назад я либо сталкиваюсь с бесконечным l oop, либо с ошибкой, когда один из массивов становится неопределенным. И после того, как я застрял на этой неделе, я думаю, что начинаю думать, что может быть гораздо более эффективный способ создания головоломки.

Вот код, который я использую для заполнения ячеек. Я хотел бы получить несколько советов о том, как правильно вернуться назад, не «ломая» мои массивы и не вызывая бесконечное l oop (например, что произойдет, если я запусту код, который я закомментировал)

const tileFiller = function(board) {
    let backup = [1,2,3,4,5,6,7,8,9];
    for (let r = 0; r < 9; r+=3) {
        for (let c = 0; c < 9; c+=3) {
            let section = [1,2,3,4,5,6,7,8,9];
            for (let r2 = r; r2 < r+3; r2++) {
                for (let c2 = c; c2 < c+3; c2++) {
                    let numbers = uniqueArr(section, rowArr[r2], colArr[c2]);
                    let num = numbers[Math.floor(Math.random() * numbers.length)];
                    let currCell = document.querySelectorAll("tr")[r2].querySelectorAll("input")[c2];
                    console.log(rowArr);
                    if (num) {
                        currCell.value = num
                        section.splice(section.indexOf(num), 1);
                        rowArr[r2].splice(rowArr[r2].indexOf(num), 1);
                        colArr[c2].splice(colArr[c2].indexOf(num), 1);
                    }
                    else {
                        // for (let br2 = r2; br2 > r; br2--) {
                        //  rowArr[br2] = [...backup];
                        // }
                        // for (let bc2 = c2; bc2 > c; bc2--) {
                        //  colArr[bc2] = [...backup];  
                        // }
                        // r2 = r;
                        break;
                    }
                }
            }
        }
    }
}
...