我的想法是构建一个生成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();
你从回调中返回,为什么?而是尝试console.log,看看你是否得到结果 – binariedMe
为什么你甚至使用回调?根据我的理解,您不希望它被异步调用或多次调用。只需使用简单的返回值。 – Bergi
我尝试了回调,因为在某个时候我怀疑它可能与此有关。但即使没有回调,它也会返回undefined。 –