我一直在努力制作一个使用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;
答案 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来实现它。