2017-08-10 47 views
0

我的想法是构建一个生成sudoku并允许用户填写它们的应用程序。我使用Node和Mongo来执行此操作。为了生成数独,我将我的'sudoku.js'导入到路由函数中。 'sudoku.js'中的数独代只有在我自己运行它时运行良好,但在路线中运行得不错。在Node.js中调用导入的函数不能在Node.js中工作,可能与return语句和范围有关

简而言之,数独生成器会选取一个随机数,检查它是否已经在行/列/块中使用,如果不是,则将其添加到数组中。如果它已被使用,该函数将重新运行,直到它“发现”一个正确的数独。该函数应该返回一个由9个数组组成的数组,每个数组有9个数字。

当函数genSud()在它自己内部调用时,它似乎向南。现在,函数返回'undefined'。当我在函数内注释掉函数调用时,它会返回一个数组,但这些数组几乎总是未完成的数独。如果我忽略了与该问题相关的return语句,它将继续重新运行该函数,直到它达到堆栈限制。

const createSudoku = { 
getRandomNumber: function(array) { 
    return array[Math.floor(Math.random() * array.length)]; 
}, 
checkIfIn: function(array, blockNumber, blockAvailable, columnNumber, columnAvailable) { 
    let availableNumbers = []; 

    array.forEach(function(element) { 
     if (blockAvailable[blockNumber].includes(element) && columnAvailable[columnNumber].includes(element)) { 

      availableNumbers.push(element); 
     } 
    }); 
    if (availableNumbers.length === 0) { 
     return false; 
    }; 
    return availableNumbers; 
}, 
genSud: function(callback) { 
    let availableNumbers = []; 
    let goodLines; 
    let blockAvailable = [ [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], etc, etc ] 
    let columnAvailable = [ [1,2,3,4,5,6,7,8,9], etc, etc ] 
    let rowAvailable = [ [1,2,3,4,5,6,7,8,9], etc, etc ] 
    let blockNumber; 
    let randomNumber; 

    for (var i = 0; i < 9; i++) { 

     for (var j = 0; j < 9; j++) { 
      blockNumber = Math.floor(j/3) + 3 * Math.floor(i/3); 

      availableNumbers = this.checkIfIn(rowAvailable[i], blockNumber, blockAvailable, j, columnAvailable); 
      if (availableNumbers == false) { 
       this.genSud(callback); 
       return; 
      } 
      randomNumber = this.getRandomNumber(availableNumbers); 

      rowAvailable[i].splice(rowAvailable[i].indexOf(randomNumber), 1); 
      columnAvailable[j].splice(columnAvailable[j].indexOf(randomNumber), 1); 
      blockAvailable[blockNumber].splice(blockAvailable[blockNumber].indexOf(randomNumber), 1); 

      body[i].push(randomNumber); 
     } 
    } 
    callback(body); 
} 

}

// createSudoku.genSud(); 

module.exports = createSudoku; 

然后,在我的路线:

var sudoku = require('../sudoku.js'); 
var completeSudoku = sudoku.genSud(function(result) { 
    return result; 
}); 

我知道我可以通过更换号码等完全放弃了重新运行,但现在它的速度不够快通过它自己。另外,我知道我可以在数据库中存储一些数独并检索它们,但我喜欢现场生成它们的想法。

在此先感谢!

编辑:我创建了一个CodePen这里: https://codepen.io/anon/pen/OjmGMy?editors=0000

您可以在控制台中使用运行它: createSudoku.genSud();

+0

你从回调中返回,为什么?而是尝试console.log,看看你是否得到结果 – binariedMe

+4

为什么你甚至使用回调?根据我的理解,您不希望它被异步调用或多次调用。只需使用简单的返回值。 – Bergi

+0

我尝试了回调,因为在某个时候我怀疑它可能与此有关。但即使没有回调,它也会返回undefined。 –

回答

0

我已通过删除回调并使用@nstraub的建议编辑工作。更改:

if (availableNumbers == false) { 
       this.genSud(); 
       return; 
} 

if (availableNumbers == false) { 
       return this.genSud(); 
} 

我不知道为什么这个工程,但它确实解决问题。