2017-08-10 46 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(); 
} 

我不知道爲什麼這個工程,但它確實解決問題。