我的if语句返回意外结果,使用Javascript随机数独

时间:2016-09-04 16:17:10

标签: javascript arrays loops if-statement

我一直在努力制作一个使用Javascript随机创建数独游戏的程序。我在Atom中包含了该代码的代码和图片,使其更具可读性。

基本上从第16-20行开始,我将9个数字添加到行中,然后将它们混洗并将结果存储在newRow中。

从第25行开始,我开始循环遍历所有过去的行,这些行存储在名为' actualRow'的数组中。所以行被改组为newRow,newRow存储在actualRow中。从第二个newRow开始,我想检查是否有任何重复值。这就是我启动loop1和loop2的原因。 Loop1循环遍历所有先前的行,并循环遍历所有值。

if语句用于捕获重复项,但是并没有评估为true,这显然应该是因为总有很多重复项。如果它是真的,则为false = true,因此我不会添加那个特别的newRow到actualRow,但是开始循环直到它没有遇到重复。

所以真正的问题在于第32行的if语句。我在这里缺少什么?



  <script>
    var row = [];
    var newRow = [];
    var actualRow = [];
    var mistake;

function makeSudoku() {
  for (var j = 0; j < 9; j++) {
    row = [1,2,3,4,5,6,7,8,9];
    newRow = [];
    mistake = false;

    for (var i = 1; i < 10; i++) {
      newRow.push( row.splice( Math.floor( Math.random() * row.length) , 1) );
    }

    if ( j !== 0) { // no need to check for duplicates in first row

      loop1:
      for (var k = j-1; k > -1 ; k--) { // for every row that came before..
        loop2:
        for (var l = 0; l < 9; l++) { // for every value in that row..
          if ( actualRow[j-1][l] == newRow[l] ) { // issue here!!!
            mistake = true;
            console.log("duplicate row value");
          } else {
            console.log("Why does this if statement always evaluate to else?");
          }
        }
      }
    }

    if ( mistake == false) {
      actualRow.push(newRow);
    } else if ( mistake == true) {
      j -= 1;
    } else {
    }
}

console.log(actualRow);
}

makeSudoku();
&#13;
&#13;
&#13; enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

我认为问题是您检查了行actualRow中数组32中的值,但是第一次向actualRow写了一些内容{} 1所以43是一个未初始化的数组,当你检查它并返回未定义的行为时。所以,我认为解决方案是在检查之前将值放在actualRow中。

的问候,

tagelicht

答案 1 :(得分:1)

tagelicht发布的答案也是我想到的第一件事。但实际问题更简单。当你比较这两个值时,它们似乎没有相同的类型(我不完全确定为什么会出现这种情况)。您可以使用parseInt()简单地解析对象的整数(找到文档here)。此代码适用于我(仅编辑了第22行以后的代码):

for (var l = 0; l < 9; l++) {
  console.log('actualRow: ' + actualRow[j-1][l]);
  console.log('newRow: ' + newRow[l]);
  console.log(parseInt(actualRow[j-1][l]) == parseInt(newRow[l]));

  if ( parseInt(actualRow[j-1][l]) == parseInt(newRow[l]) ) {
    mistake = true;
    console.log("duplicate row value");
  } else {
    console.log("Why does this if statement always evaluate to else?");
}

希望这有帮助。

编辑trincot已经指出问题出在第23行,使用splice()方法。由于此方法返回一个数组(请参阅here更多信息),因此与整数的比较总是失败。比上面的原始解决方案更好的方法是在push调用之后添加newRow,只需[0]第14行中splice()数组的实际值:

newRow.push( row.splice( Math.floor( Math.random() * row.length) , 1)[0] );

答案 2 :(得分:1)

你的主要问题在于这一行:

  newRow.push( row.splice( Math.floor( Math.random() * row.length) , 1) );

这构建了一个数组,但不是数组数组,而是一个单元素数组的数组!稍后比较这些将总是产生错误,并解释为什么你总是进入else部分。

原因在于splice方法的工作原理。即使您只提取一个元素,它也会返回一个数组。解决方案是,解开&#34;解开&#34;来自splice的数组中的值:

  newRow.push( row.splice( Math.floor( Math.random() * row.length) , 1)[0] );

现在它会起作用,但要注意你的算法非常低效。在生成最后一行时,需要多次尝试才能使其正确,因为在最后一行中只允许 一个 排列。这使得您的代码重复数千次尝试使用纯随机shuffle来实现它。