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 事件列表 - 为新条目添加延迟

javascript 使用JS为每个项添加css动画延迟

为 href 添加延迟(Laravel)

vue.js 添加 fastclick的支持 处理移动端click事件300毫秒延迟

Yii框架在脚本标记中添加延迟

Js延迟加载的方式都有哪些?defer和async的区别是啥?