我的想法是構建一個生成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。 –