【发布时间】:2021-11-17 02:14:37
【问题描述】:
我希望我的程序在执行“TryNumber”函数之前等待 10 毫秒。当我尝试使用 setTimeOut 时,我的代码似乎中断并输出了所有的,而不是解决数独问题。 我希望它等待 10 毫秒的原因是因为我希望每次尝试新号码时都能在屏幕上看到它。
该程序没有 setTimeOut 和没有 异步功能。
async function SolveSudoku(sudoku, sudokuID) {
let filledNumbers = GetFilledNumbers(sudoku);
let number, i, j;
let backtracked = [];
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
temp = '#sudoku' + i + j;
sudokuID[i][j] = document.querySelector(temp);
}
}
for (i = 0; i < 9; i++) {
for (j = 0; j < 9; j++) {
number = 0;
while (filledNumbers[i][j] == false) {
setTimeout(function () {
if (number < 9)
number++;
else {
sudoku[i][j] = 0;
backtracked = Backtrack(i, j, filledNumbers);
i = backtracked[0];
j = backtracked[1];
number = sudoku[i][j] + 1;
}
if (number <= 9 && TryNumber(sudoku, i, j, number)) {
sudoku[i][j] = number;
sudokuID[i][j].classList.remove("border-red");
sudokuID[i][j].classList.add("border-green");
break;
}
sudoku[i][j] = number;
sudokuID[i][j].textContent = number;
sudokuID[i][j].classList.add("border-red");
}, 10);
}
}
}
return sudoku;
}
function TryNumber(sudoku, row, column, number) {
let pos = [row, column];
let box = GetBox(pos);
for (let i = 0; i < 9; i++) {
if ((number == sudoku[row][i] && i != column) || (number == sudoku[i][column] && i != row))
return false;
}
for (let i = box[0] * 3; i < box[0] * 3 + 3; i++) {
for (let j = box[1] * 3; j < box[1] * 3 + 3; j++) {
if (number == sudoku[i][j] && (i != row || j != column))
return false;
}
}
return true;
}
function GetFilledNumbers(sudoku) {
let filledNumbers = [[], [], [], [], [], [], [], [], []];
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
if (sudoku[i][j] != 0)
filledNumbers[i][j] = true;
else
filledNumbers[i][j] = false;
}
}
return filledNumbers;
}
function GetBox(pos) {
let box = [];
if (pos[0] / 3 < 1) {
box[0] = 0;
}
else if (pos[0] / 3 < 2) {
box[0] = 1;
}
else {
box[0] = 2;
}
if (pos[1] / 3 < 1) {
box[1] = 0;
}
else if (pos[1] / 3 < 2) {
box[1] = 1;
}
else {
box[1] = 2;
}
return box;
}
function Backtrack(row, column, filledNumbers) {
do {
if (column > 0) {
column--;
}
else {
column = 8;
row--;
}
} while (filledNumbers[row][column]);
return [row, column];
}
//main
const button = document.querySelector('#bt-test');
const button2 = document.querySelector('#bt-test2');
let temp;
let sudokuID = [[], [], [], [], [], [], [], [], []];
let sudoku =
[
[ 8, 0, 0, 0, 1, 0, 6, 0, 9 ],
[ 0, 0, 1, 9, 7, 0, 0, 2, 0 ],
[ 9, 4, 0, 8, 2, 6, 3, 0, 1 ],
[ 0, 0, 4, 6, 0, 0, 0, 0, 0 ],
[ 0, 9, 0, 0, 0, 0, 1, 6, 0 ],
[ 5, 0, 6, 0, 3, 2, 9, 8, 0 ],
[ 4, 0, 0, 0, 5, 8, 7, 1, 0 ],
[ 6, 2, 0, 1, 0, 0, 5, 3, 0 ],
[ 0, 5, 8, 0, 0, 7, 4, 0, 2 ]
];
button.addEventListener('click', function () {
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
temp = '#sudoku' + i + j;
sudokuID[i][j] = document.querySelector(temp);
sudokuID[i][j].textContent = sudoku[i][j];
}
}
})
button2.addEventListener('click', function () {
solvedSudoku = SolveSudoku(sudoku, sudokuID);
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
sudokuID[i][j].textContent = solvedSudoku[i][j];
}
}
})
【问题讨论】:
-
我在代码中没有看到
setTimeout。没有setTimeout,程序可以工作吗? -
请添加您的其余代码,以便其他用户可以帮助您,同时能够重现您的问题。
-
@radarbob 该程序在没有它的情况下也可以工作,但是一旦我尝试将它放入并且我使函数异步它就会中断
-
@pazitos10 我已经添加了其余的代码
-
@Aristos 谢谢!!
标签: javascript asp.net settimeout