JS 为数独后援者添加延迟
Posted
技术标签:
【中文标题】JS 为数独后援者添加延迟【英文标题】:JS Adding delay to a Sudoku backracker 【发布时间】:2020-06-03 21:05:29 【问题描述】:我刚刚完成了成功解决数独板的回溯算法。但是,我想添加延迟,以便更容易可视化。我假设我需要使用 setTimeout() 或 setInterval()。我已经尝试在函数的最开始添加它们,但这不起作用。所以我的问题是,我如何构建这个程序来增加延迟?
这是我的代码:
function backtracker()
for(var i = 0; i < 9; i++)
for(var j = 0; j < 9; j++)
if(bd[i][j].value==".")
for(var n=1;n<10;n++)
if(isValid(bd,i,j,n))
bd[i][j].value=n;
if(backtracker(bd))
return true;
else
bd[i][j].value=".";
return false;
return true;
//Used to check if number 'c' is allowed at coordinates (x,y)
function isValid(board,x,y,c)
let rowStart = Math.floor(x/3) * 3;
let colStart = Math.floor(y/3) * 3;
for(let i=0; i<9; i++)
if(board[i][y].value == c || board[x][i].value == c)
return false;
for(let i=0; i<3; i++)
for(let j=0; j<3; j++)
if(board[rowStart+i][colStart+j].value == c)
return false;
return true;
【问题讨论】:
您需要将此函数或此函数中的所有代码包装在一个 setTimeout 中。无论如何,你需要看看使用promises,这样你就可以让代码异步运行。 【参考方案1】:我不知道在其他语言(如 c 或 python)中直接实现同步执行暂停(如“睡眠”功能)。
但您可以从现代 javascript 语法糖(async/await)中受益。
试试这个技巧:
function sleep(ms)
return new Promise(resolve => setTimeout(resolve, ms));
async function backtracker()
// this will stop execution two seconds
await sleep(2000);
//
for (var i = 0; i < 9; i++)
for (var j = 0; j < 9; j++)
if (bd[i][j].value == ".")
for (var n = 1; n < 10; n++)
if (isValid(bd, i, j, n))
bd[i][j].value = n;
if (backtracker(bd))
return true;
else
bd[i][j].value = ".";
return false;
return true;
【讨论】:
感谢您的建议,在回溯部分之前它工作得很好,此时它只是停止填充下一个单元格。 在我的回答中,我只是试图解决时序问题,我不认为这可能会影响您的逻辑,可能是实现问题。以上是关于JS 为数独后援者添加延迟的主要内容,如果未能解决你的问题,请参考以下文章
Streamlabs 自定义 CSS 事件列表 - 为新条目添加延迟